




	<!DOCTYPE html>
	<html lang="en">
		<head>
			<meta content="authenticityToken" name="csrf-param"><meta content="w3stb2pbx8qg2unc50velkt5pukr7b9e5lwtyhkc" name="csrf-token">
			<meta name="csrf-token" content="w3stb2pbx8qg2unc50velkt5pukr7b9e5lwtyhkc">
			<meta charset="UTF-8">
			<meta name="viewport" content="width=device-width, initial-scale=1.0">
			<title>Wheels - An open source CFML framework inspired by Ruby on Rails</title>
			<link rel="icon" href="/img/favicon.ico" type="image/x-icon">
			<link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon">
			<meta name="keywords" content="cfwheels,cfml,ruby,framework">
			<meta name="description" content="Modern&#x20;CFML&#x20;web&#x20;framework&#x20;inspired&#x20;by&#x20;Rails.&#x20;Build&#x20;powerful,&#x20;fast,&#x20;and&#x20;clean&#x20;web&#x20;apps&#x20;with&#x20;Wheels.dev&#x27;s&#x20;intuitive&#x20;MVC&#x20;architecture.">
			
			<meta property="og:title" content="Wheels&#x20;-&#x20;An&#x20;open&#x20;source&#x20;CFML&#x20;framework&#x20;inspired&#x20;by&#x20;Ruby&#x20;on&#x20;Rails">
			<meta property="og:description" content="Modern&#x20;CFML&#x20;web&#x20;framework&#x20;inspired&#x20;by&#x20;Rails.&#x20;Build&#x20;powerful,&#x20;fast,&#x20;and&#x20;clean&#x20;web&#x20;apps&#x20;with&#x20;Wheels.dev&#x27;s&#x20;intuitive&#x20;MVC&#x20;architecture.">
			<meta property="og:type" content="website">
			<meta property="og:url" content="https&#x3a;&#x2f;&#x2f;wheels.dev&#x2f;">
			<meta property="og:site_name" content="Wheels">
			<meta property="og:image" content="https://wheels.dev/img/home-og.png">
			<meta property="og:locale" content="en_US">
			<link rel="canonical" href="https&#x3a;&#x2f;&#x2f;wheels.dev&#x2f;">
			<link rel="alternate" hreflang="en" href="https://wheels.dev/">
			

			<script type="application/ld+json">
			{
				"@context": "https://schema.org",
				"@type": "Organization",
				"name": "Wheels.dev",
				"url": "https://wheels.dev",
				"logo": "https://wheels.dev/img/wheels-logo.png",
				"description": "Modern CFML web framework inspired by Rails. Build powerful, fast, and clean web apps with Wheels.dev's intuitive MVC architecture.",
				"sameAs": [
					"https://github.com/wheels-dev/wheels",
					"https://twitter.com/CFonWheels",
					"https://www.facebook.com/cfwheels",
					"https://github.com/wheels-dev/wheels/discussions"
				]
			}
			</script>

			<script type="application/ld+json">
			{
				"@context": "https://schema.org",
				"@type": "WebSite",
				"name": "Wheels.dev",
				"url": "https://wheels.dev",
				"potentialAction": {
					"@type": "SearchAction",
					"target": "https://wheels.dev/search?q={search_term_string}",
					"query-input": "required name=search_term_string"
				}
			}
			</script>
			

			

			<script type="application/ld+json">
			{
				"@context": "https://schema.org",
				"@type": "BreadcrumbList",
				"itemListElement": [
					{
						"@type": "ListItem",
						"position": 1,
						"name": "Home",
						"item": "https://wheels.dev"
					}
					
				]
			}
			</script>

			<link rel="preload" href="/css/Montserrat.woff2" as="font" type="font/woff2" crossorigin="anonymous">
			<link rel="preload" href="/css/fonts/Sora-Thin.ttf" as="font" type="font/ttf" crossorigin="anonymous">
			<link rel="preload" href="/css/fonts/Sora-ExtraLight.ttf" as="font" type="font/ttf" crossorigin="anonymous">
			<link rel="preload" href="/css/fonts/Sora-Light.ttf" as="font" type="font/ttf" crossorigin="anonymous">
			<link rel="preload" href="/css/fonts/Sora-Regular.ttf" as="font" type="font/ttf" crossorigin="anonymous">
			<link rel="preload" href="/css/fonts/Sora-Medium.ttf" as="font" type="font/ttf" crossorigin="anonymous">
			<link rel="preload" href="/css/fonts/Sora-SemiBold.ttf" as="font" type="font/ttf" crossorigin="anonymous">
			<link rel="preload" href="/css/fonts/Sora-Bold.ttf" as="font" type="font/ttf" crossorigin="anonymous">

			<link href="/css/bootstrap.css" rel="stylesheet">
			<link href="/css/style.css" rel="stylesheet">
			<link href="/css/swiper.css" rel="stylesheet">
			<link href="/css/icons/bootstrap-icons.min.css" rel="stylesheet">
			<link href="/css/notifier.min.css" rel="stylesheet">
			

			<script src="/js/jquery.min.js"></script>
			<script src="/js/htmx.min.js"></script>
			<script src="/js/highlighter.min.js"></script>
			<script src="/js/bootstrap.js"></script>
			<script src="/js/all.min.js"></script>
			

			<script>
				(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
				(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
				m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
				})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

				ga('create', 'UA-3914949-1', 'auto');
				ga('send', 'pageview');
			</script>
		</head>
		<body data-scope="&#x2f;">

			<nav class="navbar  sticky-top shadow-sm navbar-expand-xl py-2 nav-bg">
				<div class="container">
					<a class="navbar-brand" href="/">
						<img src="/img/wheels-logo.png" alt="Wheels.dev Logo" width="200">
					</a>
					<div class="d-flex align-items-center justify-content-end flex-xl-grow-0 flex-grow-1 gap-2">
						
					</div>
					<button class="navbar-toggler d-xl-none border-0" type="button" data-bs-toggle="collapse"
						data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
						aria-label="Toggle navigation">
						<span class="navbar-toggler-icon"></span>
					</button>
					<div class="collapse navbar-collapse" id="navbarSupportedContent">
						<ul class="navbar-nav divide-x-primary ms-auto mb-2 mb-lg-0 align-items-center">
							
							<li class="nav-item px-3">
								<a class="nav-link py-2 fw-normal px-3 nav-link-hover rounded fs-16 text--secondary" aria-current="page" target="_blank" href="https://github.com/wheels-dev/wheels/releases">Source</a>
							</li>
							<li class="nav-item px-3">
								<a class="nav-link py-2 fw-normal px-3 nav-link-hover rounded fs-16 text--secondary " aria-current="page" href="/docs">Docs</a>
							</li>
							<li class="nav-item px-3">
								<a class="nav-link py-2 fw-normal px-3 nav-link-hover rounded fs-16 text--secondary " aria-current="page" href="/community">Community</a>
							</li>
							<li class="nav-item px-3">
								<a class="nav-link py-2 fw-normal px-3 nav-link-hover rounded fs-16 text--secondary " aria-current="page" href="/news">News</a>
							</li>
							
							
								<li class="nav-item px-3">
									<a class="nav-link fw-normal px-3 py-2 nav-link-hover rounded fs-16 text--secondary" aria-current="page" href="/login">
										Login
									</a>
								</li>
							
							
						</ul>
					</div>
				</div>
			</nav>
			<script src="/js/notifier.min.js"></script>
			
				
				<main class="main">
    <!-- Hero Section -->
    <div class="hero-section home-section position-relative">
        <div class="container d-flex flex-column justify-content-center w-100 align-items-center">
            <h1 class="fs-64 fw-bolder text--secondary text-center position-relative">Wheels-The Fast &
                Fun<br>CFML Framework!</h1>
            <p class="fs-22 text--secondary fw-medium text-center position-relative">
                Build apps quickly with an
                organized, Ruby on
                Rails-inspired <br>
                structure.
                Get up and
                running in no time!
            </p>
            <div class="row g-3 justify-content-center w-100 mt-1 align-items-center">
                
                    <div class="col-md-auto text-center">
                            <a href="/guides" class="">
                                <button class="fs-16 fw-semibold bg--primary w-200 py-2 rounded-4 text-white">
                                    Get Started
                                </button>
                            </a>
                    </div>
                    <div class="col-md-auto text-center">
                        <a href="/downloads" class="">
                            <button
                                class="fs-16 fw-semibold bg--success w-200 py-2 rounded-4 text--secondary">Download</button>
                        </a>
                    </div>
                
            </div>
        </div>
        <div class="row justify-content-center align-items-center mt-5 gy-3 text-center gx-sm-5">
            
        </div>
    </div>

    <!-- Cards -->
    <div class="container pb-5">
        <div class="row gy-3 gy-sm-5 gx-sm-5" id="features-container">
            
                <div class="col-lg-4">
                    <a href="https://wheels.dev/3.0.0/guides/README" target="_blank" class="text-decoration-none">
                        <div class="px-4 py-4 bg-white border-transparent border-2 cards rounded-5 cursor-pointer shadow-sm">
                            <div class="icon-container d-flex justify-content-center align-items-center">
                                <svg width="37" height="34" viewBox="0 0 37 34" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18.063 5.35858C13.4356 4.45069 8.50347 6.38426 5.00102 10.6559C4.7621 10.9471 4.78801 11.3634 5.06136 11.6253L8.69516 15.1069C11.1313 11.3084 14.3125 7.99802 18.063 5.35858Z" fill="#FEDC5A" /><path d="M21.7714 27.4172L25.4784 30.837C25.7558 31.0929 26.1967 31.1171 26.5051 30.8935C31.0575 27.5931 33.107 22.9414 32.1004 18.5864C29.3014 22.1126 25.795 25.1104 21.7714 27.4172Z" fill="#FEDC5A" /><path fill-rule="evenodd" clip-rule="evenodd" d="M36.1129 0.497156C36.3311 0.48545 36.5438 0.564557 36.6948 0.713556C36.8478 0.857634 36.9291 1.056 36.9183 1.25961C35.7293 20.9643 17.4709 27.7932 17.2857 27.8603C17.1982 27.892 17.1053 27.9082 17.0116 27.9079C16.8085 27.9078 16.6138 27.8318 16.4702 27.6965L8.04814 19.7618C7.83535 19.5616 7.76676 19.2624 7.87281 18.9972C7.94325 18.8227 15.102 1.53083 36.1129 0.497156ZM18.5436 14.9238C18.5436 16.5174 19.9147 17.8092 21.6061 17.8092C23.2976 17.8092 24.6687 16.5174 24.6687 14.9238C24.6687 13.3303 23.2976 12.0385 21.6061 12.0385C19.9147 12.0385 18.5436 13.3303 18.5436 14.9238Z" fill="#FEDC5A" /><path d="M10.0212 26.2524C8.11302 24.6824 5.02356 24.6824 3.11535 26.2524C1.35999 27.6992 0.918098 32.5339 0.871711 33.0808C0.856594 33.2665 0.93561 33.4489 1.0899 33.5847C1.24418 33.7204 1.45989 33.7972 1.68551 33.7968L1.74003 33.7968C2.40328 33.7593 8.26669 33.3942 10.0212 31.9481C11.9264 30.3745 11.9264 27.826 10.0212 26.2524Z" fill="#FEDC5A" /></svg>
                            </div>
                            <div class="mt-3">
                                <p class="fw-bold fs-24 text--secondary">A Complete Package</p>
                                <p class="fs-18 text--secondary/70 pt-1 line-clamp-2">A full framework with tonnes of functionality - once you've started, you'll wonder how you ever did CFML development before!</p>
                            </div>
                        </div>
                    </a>
                </div>
            
                <div class="col-lg-4">
                    <a href="https://wheels.dev/3.0.0/guides/handling-requests-with-controllers/routing" target="_blank" class="text-decoration-none">
                        <div class="px-4 py-4 bg-white border-transparent border-2 cards rounded-5 cursor-pointer shadow-sm">
                            <div class="icon-container d-flex justify-content-center align-items-center">
                                <svg width="32" height="36" viewBox="0 0 32 36" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.4571 20.6429H0.787724C0.358291 20.6429 0.00976562 20.2994 0.00976562 19.8762V1.4738C0.00976562 1.05054 0.358291 0.707031 0.787724 0.707031H12.4571C12.8865 0.707031 13.2351 1.05054 13.2351 1.4738V19.8762C13.2351 20.2994 12.8865 20.6429 12.4571 20.6429Z" fill="#F04037" /><path d="M12.4571 35.5949H0.787724C0.358291 35.5949 0.00976562 35.236 0.00976562 34.7939V25.1819C0.00976562 24.7398 0.358291 24.3809 0.787724 24.3809H12.4571C12.8865 24.3809 13.2351 24.7398 13.2351 25.1819V34.7939C13.2351 35.236 12.8865 35.5949 12.4571 35.5949Z" fill="#F04037" /><path d="M30.9724 11.921H19.3031C18.8736 11.921 18.5251 11.5621 18.5251 11.12V1.50803C18.5251 1.06588 18.8736 0.707031 19.3031 0.707031H30.9724C31.4019 0.707031 31.7504 1.06588 31.7504 1.50803V11.12C31.7504 11.5621 31.4019 11.921 30.9724 11.921Z" fill="#F04037" /><path d="M30.9722 35.5949H19.3029C18.8734 35.5949 18.5249 35.2514 18.5249 34.8281V16.4257C18.5249 16.0025 18.8734 15.659 19.3029 15.659H30.9722C31.4017 15.659 31.7502 16.0025 31.7502 16.4257V34.8281C31.7502 35.2514 31.4017 35.5949 30.9722 35.5949Z" fill="#F04037" /></svg>
                            </div>
                            <div class="mt-3">
                                <p class="fw-bold fs-24 text--secondary">RESTful Routing</p>
                                <p class="fs-18 text--secondary/70 pt-1 line-clamp-2"><a href='https://guides.cfwheels.org/cfwheels-guides/handling-requests-with-controllers/routing'>Resource based routing</a> for GET, POST, PUT, PATCH &amp; DELETE</p>
                            </div>
                        </div>
                    </a>
                </div>
            
                <div class="col-lg-4">
                    <a href="https://wheels.dev/3.0.0/guides/database-interaction-through-models/database-migrations/README" target="_blank" class="text-decoration-none">
                        <div class="px-4 py-4 bg-white border-transparent border-2 cards rounded-5 cursor-pointer shadow-sm">
                            <div class="icon-container d-flex justify-content-center align-items-center">
                                <svg width="46" height="36" viewBox="0 0 46 36" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M23.9227 35.5949H2.97385C1.39616 35.5949 0.117188 34.3617 0.117188 32.8406V3.46133C0.117187 1.94017 1.39616 0.707031 2.97385 0.707031H23.9227V2.54323H2.97385C2.44795 2.54323 2.02163 2.95428 2.02163 3.46133V32.8406C2.02163 33.3476 2.44795 33.7587 2.97385 33.7587H23.9227V35.5949Z" fill="#5454D4" /><path fill-rule="evenodd" clip-rule="evenodd" d="M26.5679 0.707031H42.1598C43.7744 0.707031 45.0833 1.94017 45.0833 3.46133V32.8406C45.0833 34.3617 43.7744 35.5949 42.1598 35.5949H26.5679V0.707031ZM32.4151 26.4139H39.2365C39.7747 26.4139 40.211 26.0028 40.211 25.4958C40.211 24.9887 39.7747 24.5777 39.2365 24.5777H32.4151C31.8769 24.5777 31.4406 24.9887 31.4406 25.4958C31.4406 26.0028 31.8769 26.4139 32.4151 26.4139ZM39.2365 19.069H32.4151C31.8769 19.069 31.4406 18.658 31.4406 18.1509C31.4406 17.6439 31.8769 17.2328 32.4151 17.2328H39.2365C39.7747 17.2328 40.211 17.6439 40.211 18.1509C40.211 18.658 39.7747 19.069 39.2365 19.069ZM32.4151 11.7242H39.2365C39.7747 11.7242 40.211 11.3132 40.211 10.8061C40.211 10.2991 39.7747 9.88802 39.2365 9.88802H32.4151C31.8769 9.88802 31.4406 10.2991 31.4406 10.8061C31.4406 11.3132 31.8769 11.7242 32.4151 11.7242Z" fill="#5454D4" /></svg>
                            </div>
                            <div class="mt-3">
                                <p class="fw-bold fs-24 text--secondary">Database Migrations</p>
                                <p class="fs-18 text--secondary/70 pt-1 line-clamp-2">Built in <a href='https://guides.cfwheels.org/cfwheels-guides/database-interaction-through-models/database-migrations'>database migration system</a> even across different DBMS</p>
                            </div>
                        </div>
                    </a>
                </div>
            
                <div class="col-lg-4">
                    <a href="https://wheels.dev/3.0.0/guides/working-with-wheels/documenting-your-code" target="_blank" class="text-decoration-none">
                        <div class="px-4 py-4 bg-white border-transparent border-2 cards rounded-5 cursor-pointer shadow-sm">
                            <div class="icon-container d-flex justify-content-center align-items-center">
                                <svg width="39" height="43" viewBox="0 0 39 43" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M27.8364 0.931152H11.2231C3.95483 0.931152 0.839844 5.08447 0.839844 11.3144V32.081C0.839844 38.311 3.95483 42.4643 11.2231 42.4643H27.8364C35.1047 42.4643 38.2197 38.311 38.2197 32.081V11.3144C38.2197 5.08447 35.1047 0.931152 27.8364 0.931152ZM11.2231 22.2169H19.5298C20.3812 22.2169 21.0873 22.923 21.0873 23.7744C21.0873 24.6258 20.3812 25.3319 19.5298 25.3319H11.2231C10.3717 25.3319 9.66564 24.6258 9.66564 23.7744C9.66564 22.923 10.3717 22.2169 11.2231 22.2169ZM27.8364 33.6385H11.2231C10.3717 33.6385 9.66564 32.9324 9.66564 32.081C9.66564 31.2296 10.3717 30.5235 11.2231 30.5235H27.8364C28.6878 30.5235 29.3939 31.2296 29.3939 32.081C29.3939 32.9324 28.6878 33.6385 27.8364 33.6385ZM33.028 15.9869H28.8747C25.7182 15.9869 23.1639 13.4326 23.1639 10.2761V6.12279C23.1639 5.27137 23.87 4.5653 24.7214 4.5653C25.5728 4.5653 26.2789 5.27137 26.2789 6.12279V10.2761C26.2789 11.709 27.4418 12.8719 28.8747 12.8719H33.028C33.8795 12.8719 34.5855 13.578 34.5855 14.4294C34.5855 15.2809 33.8795 15.9869 33.028 15.9869Z" fill="#5454D4" /></svg>
                            </div>
                            <div class="mt-3">
                                <p class="fw-bold fs-24 text--secondary">Automatic Documentation</p>
                                <p class="fs-18 text--secondary/70 pt-1 line-clamp-2">Use our <a href='https://guides.cfwheels.org/cfwheels-guides/working-with-cfwheels/documenting-your-code'>built in doc viewer</a> which grows with your application with only minor markup required</p>
                            </div>
                        </div>
                    </a>
                </div>
            
                <div class="col-lg-4">
                    <a href="https://wheels.dev/3.0.0/guides/working-with-cfwheels/switching-environments" target="_blank" class="text-decoration-none">
                        <div class="px-4 py-4 bg-white border-transparent border-2 cards rounded-5 cursor-pointer shadow-sm">
                            <div class="icon-container d-flex justify-content-center align-items-center">
                                <svg width="39" height="38" viewBox="0 0 39 38" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0.749191 18.8651C0.749191 15.4047 0.735162 11.9396 0.753867 8.4792C0.777249 4.42957 3.49415 1.14685 7.45493 0.351883C7.94593 0.253682 8.45097 0.211596 8.95132 0.211596C15.933 0.202243 22.9099 0.183539 29.8915 0.211596C33.9178 0.225625 37.1865 2.97058 37.9674 6.92201C38.075 7.47848 38.1077 8.05366 38.1077 8.62416C38.1171 15.4655 38.1171 22.3115 38.1124 29.1529C38.1077 33.3054 35.4423 36.5975 31.4254 37.4158C30.939 37.514 30.4293 37.5608 29.929 37.5608C22.938 37.5701 15.9423 37.5935 8.95132 37.5561C4.93911 37.5374 1.69379 34.8065 0.903507 30.8691C0.786601 30.2892 0.763219 29.6813 0.758543 29.0874C0.744514 25.6831 0.749191 22.2741 0.749191 18.8651ZM21.5211 11.3224C20.9365 11.3224 20.4596 11.6965 20.2445 12.3371C19.211 15.4328 18.1776 18.5331 17.1441 21.6288C16.8027 22.6576 16.4473 23.6817 16.1153 24.7151C15.9049 25.3698 16.1855 26.0151 16.756 26.305C17.3078 26.5856 17.9858 26.4453 18.3599 25.9403C18.5002 25.7486 18.5937 25.5148 18.6686 25.2856C19.7675 21.9982 20.8617 18.7061 21.9606 15.4141C22.2178 14.6425 22.4891 13.8756 22.7322 13.0993C23.0221 12.1921 22.4189 11.3224 21.5211 11.3224ZM10.8359 18.8838C11.9348 17.7896 12.9963 16.7421 14.0484 15.6806C14.6096 15.1148 14.6143 14.3105 14.0905 13.7914C13.5621 13.2723 12.7671 13.2911 12.2013 13.8569C10.8452 15.2083 9.48909 16.5597 8.13766 17.9205C7.54378 18.5191 7.54845 19.2626 8.14233 19.8705C8.73154 20.4691 9.3301 21.063 9.92866 21.6569C10.7049 22.4331 11.4765 23.2187 12.2621 23.9856C12.683 24.3971 13.2675 24.4766 13.7679 24.2241C14.2589 23.9763 14.5628 23.4666 14.4506 22.9101C14.3851 22.6015 14.2027 22.2741 13.983 22.045C12.9635 20.9835 11.9114 19.9594 10.8359 18.8838ZM28.0164 18.8792C27.8901 19.0101 27.8013 19.1083 27.7031 19.2065C26.7444 20.1698 25.7811 21.1238 24.8225 22.0917C24.2613 22.6622 24.2426 23.4525 24.7664 23.981C25.2854 24.5047 26.0898 24.4953 26.6556 23.9342C28.0164 22.5874 29.3678 21.2313 30.7192 19.8752C31.3272 19.2626 31.3178 18.5238 30.7005 17.8972C30.1862 17.3734 29.6624 16.859 29.148 16.34C28.3016 15.4936 27.4693 14.6378 26.6088 13.8101C25.884 13.1087 24.7196 13.4033 24.4484 14.3479C24.2941 14.8763 24.4484 15.3299 24.8412 15.718C25.8934 16.7515 26.9362 17.799 28.0164 18.8792Z" fill="#FEDC5A"/></svg>
                            </div>
                            <div class="mt-3">
                                <p class="fw-bold fs-24 text--secondary">Hybrid Development</p>
                                <p class="fs-18 text--secondary/70 pt-1 line-clamp-2">Switch in and out of Wheels conventions - it's your call; Need to use a bog standard query? Go ahead!</p>
                            </div>
                        </div>
                    </a>
                </div>
            
                <div class="col-lg-4">
                    <a href="https://wheels.dev/guides" target="_blank" class="text-decoration-none">
                        <div class="px-4 py-4 bg-white border-transparent border-2 cards rounded-5 cursor-pointer shadow-sm">
                            <div class="icon-container d-flex justify-content-center align-items-center">
                                <svg width="46" height="21" viewBox="0 0 46 21" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M36.4369 4.29427C33.2384 4.29427 27.907 7.92712 22.2638 11.7738C17.3087 15.1515 11.6919 18.9798 9.06625 18.9798C5.29399 18.9798 2.2236 16.0969 2.2236 12.5549C2.2236 9.01293 5.29399 6.12997 9.06625 6.12997C9.72706 6.12997 10.6215 6.36586 11.6938 6.79816L9.23438 11.0212C9.05061 11.3351 9.07994 11.7206 9.30672 12.0079C9.49245 12.2447 9.78571 12.3787 10.0917 12.3787C10.1572 12.3787 10.2256 12.3723 10.2921 12.3594L19.0409 10.6421C19.3185 10.587 19.558 10.4227 19.6958 10.1887C19.8337 9.95464 19.8561 9.67654 19.7574 9.42688L16.6362 1.48015C16.5032 1.14238 16.1728 0.908329 15.7906 0.882629C15.4153 0.853258 15.0448 1.04233 14.862 1.35807L12.6323 5.18734C11.2178 4.60267 10.0184 4.29427 9.06625 4.29427C4.21481 4.29427 0.268555 7.99963 0.268555 12.5549C0.268555 17.1102 4.21481 20.8155 9.06625 20.8155C12.3263 20.8155 17.7115 17.1451 23.4124 13.2598C28.3146 9.91793 33.8728 6.12997 36.4369 6.12997C40.2091 6.12997 43.2795 9.01293 43.2795 12.5549C43.2795 16.0969 40.2091 18.9798 36.4369 18.9798C34.8885 18.9798 32.0752 17.7307 28.515 15.4617C28.0693 15.1754 27.4613 15.2873 27.1572 15.7059C26.8532 16.1253 26.9705 16.6962 27.4173 16.9808C31.4095 19.5251 34.4447 20.8155 36.4369 20.8155C41.2883 20.8155 45.2346 17.1102 45.2346 12.5549C45.2346 7.99963 41.2883 4.29427 36.4369 4.29427Z" fill="#5454D4" /></svg>
                            </div>
                            <div class="mt-3">
                                <p class="fw-bold fs-24 text--secondary">Full Documentation</p>
                                <p class="fs-18 text--secondary/70 pt-1 line-clamp-2">Lots of lovely <a href='https://wheels.dev/docs' title='Documentation'>documentation</a> available with <a href='https://wheels.dev/3.0.0/guides/readme'>tutorials</a> and a <a href='https://wheels.dev/api/v3.0.0'>complete API reference</a></p>
                            </div>
                        </div>
                    </a>
                </div>
            
                <div class="col-lg-4">
                    <a href="https://wheels.dev/3.0.0/guides/introduction/frameworks-and-cfwheels" target="_blank" class="text-decoration-none">
                        <div class="px-4 py-4 bg-white border-transparent border-2 cards rounded-5 cursor-pointer shadow-sm">
                            <div class="icon-container d-flex justify-content-center align-items-center">
                                <svg width="39" height="38" viewBox="0 0 39 38" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.47793 29.2181C2.36642 28.2201 0.412581 24.6568 0.742907 21.4238C1.04512 18.5211 2.99896 15.8926 6.44981 15.0633C6.45684 14.9016 6.4709 14.7259 6.4709 14.5572C6.4709 12.3152 6.48495 10.0662 6.46387 7.8242C6.45684 7.14949 6.78717 6.72077 7.34239 6.43964C7.5181 6.34828 7.743 6.33422 7.94682 6.33422C10.1748 6.32719 12.4027 6.32719 14.6377 6.32719C14.8134 6.32719 14.9961 6.32719 15.214 6.32719C15.6568 4.35929 16.704 2.82012 18.3767 1.72372C19.7823 0.80302 21.3356 0.423497 22.9872 0.592174C25.4681 0.845189 28.413 2.49682 29.3477 6.30611C29.5094 6.31314 29.6851 6.32719 29.8608 6.32719C32.1028 6.32719 34.3518 6.33422 36.5938 6.32016C37.2685 6.31314 37.6902 6.65049 37.9784 7.20572C38.0486 7.34628 38.0768 7.52199 38.0838 7.67661C38.0908 10.5793 38.0908 13.4819 38.0838 16.3846C38.0838 17.2279 37.4723 17.7972 36.6289 17.8183C34.5275 17.8745 32.8267 19.3294 32.4261 21.3605C31.9903 23.5744 33.5436 25.964 35.905 26.3435C36.1862 26.3857 36.4673 26.449 36.7484 26.4279C37.3388 26.3787 38.1119 27.1939 38.1049 27.7984C38.0768 30.687 38.0978 33.5756 38.0908 36.4641C38.0908 37.3356 37.4864 37.933 36.6219 37.933C27.0635 37.933 17.4982 37.933 7.93979 37.933C7.08235 37.933 6.48495 37.3216 6.48495 36.4571C6.48495 34.2151 6.48495 31.9661 6.48495 29.7241C6.47792 29.5554 6.47793 29.3797 6.47793 29.2181Z" fill="#FEDC5A" /></svg>
                            </div>
                            <div class="mt-3">
                                <p class="fw-bold fs-24 text--secondary">Stay Relevant</p>
                                <p class="fs-18 text--secondary/70 pt-1 line-clamp-2">Wheels uses industry established concepts, such as <a href='https://guides.cfwheels.org/cfwheels-guides/introduction/frameworks-and-cfwheels'>MVC</a> and <a href='https://guides.cfwheels.org/cfwheels-guides/database-interaction-through-models/object-relational-mapping'>ORM</a>. These essential principles make being a polyglot a reality!</p>
                            </div>
                        </div>
                    </a>
                </div>
            
                <div class="col-lg-4">
                    <a href="https://wheels.dev/community" target="_blank" class="text-decoration-none">
                        <div class="px-4 py-4 bg-white border-transparent border-2 cards rounded-5 cursor-pointer shadow-sm">
                            <div class="icon-container d-flex justify-content-center align-items-center">
                                <svg width="41" height="36" viewBox="0 0 41 36" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M35.8418 0.685791H4.79111C2.40933 0.685791 0.478516 2.54527 0.478516 4.83906V23.1134C0.478516 24.215 0.932877 25.2714 1.74165 26.0502C2.55041 26.8291 3.64734 27.2667 4.79111 27.2667H13.0023L19.6437 35.2617C19.8074 35.4589 20.0552 35.5736 20.3173 35.5736C20.5794 35.5736 20.8273 35.4589 20.9909 35.2617L27.6306 27.2667H35.8418C38.2236 27.2667 40.1544 25.4072 40.1544 23.1134V4.83906C40.1544 2.54527 38.2236 0.685791 35.8418 0.685791ZM22.1349 18.1298H10.5628C10.1063 18.1298 9.73619 17.8509 9.73619 17.5068C9.73619 17.1628 10.1063 16.8839 10.5628 16.8839H22.1349C22.5914 16.8839 22.9615 17.1628 22.9615 17.5068C22.9615 17.8509 22.5914 18.1298 22.1349 18.1298ZM10.6009 10.6538H31.3545C31.832 10.6538 32.2192 10.3748 32.2192 10.0308C32.2192 9.6867 31.832 9.40777 31.3545 9.40777H10.6009C10.1233 9.40777 9.73619 9.6867 9.73619 10.0308C9.73619 10.3748 10.1233 10.6538 10.6009 10.6538Z" fill="#F04037" /></svg>
                            </div>
                            <div class="mt-3">
                                <p class="fw-bold fs-24 text--secondary">A Helpful Community</p>
                                <p class="fs-18 text--secondary/70 pt-1 line-clamp-2">Get in touch via our <a href='https://github.com/cfwheels/cfwheels/discussions'>GitHub Discussions</a> - we're newbie friendly and just want to help out.</p>
                            </div>
                        </div>
                    </a>
                </div>
            
                <div class="col-lg-4">
                    <a href="https://wheels.dev/3.0.0/guides/working-with-wheels/directory-structure" target="_blank" class="text-decoration-none">
                        <div class="px-4 py-4 bg-white border-transparent border-2 cards rounded-5 cursor-pointer shadow-sm">
                            <div class="icon-container d-flex justify-content-center align-items-center">
                                <svg width="38" height="38" viewBox="0 0 38 38" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M38.0052 6.09267C38.0052 14.8518 38.0052 23.611 38.0052 32.3701C37.9856 32.4092 37.9563 32.4581 37.9367 32.4972C37.7314 33.1718 37.3208 33.6801 36.6756 33.9831C36.0598 34.2764 35.4439 34.5697 34.828 34.8727C33.2834 35.6255 31.7291 36.3685 30.1845 37.1212C29.7543 37.3265 29.3242 37.5318 28.8941 37.7273C27.9263 38.177 26.802 37.8348 26.2644 37.2287C25.8049 36.7106 25.3357 36.2023 24.8664 35.6841C24.2897 35.0585 23.7129 34.4231 23.1361 33.7974C22.8428 33.4748 22.5398 33.1522 22.2465 32.8296C21.6306 32.1453 21.0147 31.4512 20.3891 30.7669C20.1154 30.4638 19.8319 30.1608 19.5484 29.848C18.7565 28.9584 17.9647 28.0688 17.1631 27.1792C16.5863 26.534 15.99 25.9083 15.4132 25.2631C15.0906 24.9014 14.7778 24.5299 14.4454 24.1682C14.2401 23.9434 14.025 23.7381 13.8099 23.5132C13.2918 23.9434 12.7933 24.3442 12.2947 24.7548C11.5908 25.3315 10.8772 25.9083 10.1733 26.4851C9.38149 27.1303 8.58965 27.7853 7.80758 28.4305C7.28946 28.8606 6.79089 29.3005 6.27277 29.7209C6.0577 29.8968 5.84263 30.0826 5.59824 30.2097C5.11922 30.4541 4.63043 30.3856 4.15141 30.1803C3.29114 29.8089 2.43086 29.4276 1.56081 29.0855C0.974264 28.8606 0.505023 28.2056 0.514798 27.5604C0.544126 25.8399 0.524575 24.1193 0.524575 22.3988C0.524575 18.5666 0.53435 14.7345 0.514798 10.9024C0.514798 10.2963 0.984041 9.62175 1.52171 9.42623C1.73678 9.34802 1.95185 9.25027 2.16692 9.16228C2.89033 8.86901 3.60397 8.54641 4.33715 8.28246C4.93348 8.06739 5.51026 8.12604 6.00882 8.56596C6.39008 8.88856 6.78111 9.20138 7.16237 9.51421C8.19861 10.3647 9.22508 11.225 10.2613 12.0755C11.1998 12.8478 12.1383 13.6201 13.0865 14.3924C13.3309 14.5879 13.5753 14.7736 13.8197 14.9691C14.0641 14.7345 14.289 14.5292 14.4943 14.3044C15.2959 13.4148 16.0877 12.5252 16.8796 11.6356C17.4563 10.9904 18.0527 10.3647 18.6294 9.71951C18.8836 9.44578 19.1378 9.16228 19.392 8.87878C20.1642 8.01851 20.9268 7.14846 21.6991 6.28818C22.3052 5.62343 22.921 4.95867 23.5271 4.29391C23.7618 4.02996 23.9964 3.76602 24.2408 3.51185C24.9251 2.74933 25.5898 1.97704 26.3035 1.24385C26.9682 0.569319 27.7894 0.393353 28.6888 0.696404C29.0016 0.803938 29.2949 0.9408 29.5979 1.08744C30.8199 1.67399 32.0419 2.25076 33.2541 2.84709C34.3979 3.40431 35.5319 3.96154 36.6756 4.51876C37.1742 4.76315 37.5457 5.12486 37.7803 5.6332C37.8585 5.80917 37.9367 5.94603 38.0052 6.09267ZM19.0107 19.2705C22.2269 21.91 25.4041 24.5104 28.6301 27.1596C28.6301 21.9589 28.6301 16.8168 28.6301 11.6747C28.6301 11.6062 28.6008 11.5378 28.5812 11.4107C25.3748 14.0404 22.2172 16.6408 19.0107 19.2705ZM5.26586 14.0111C5.18765 14.6563 5.21698 24.2073 5.28541 24.4615C5.64712 24.1584 9.80185 19.5051 9.95826 19.2118C8.41368 17.5011 6.85932 15.7805 5.26586 14.0111Z" fill="#5454D4" /></svg>
                            </div>
                            <div class="mt-3">
                                <p class="fw-bold fs-24 text--secondary">Good Organization</p>
                                <p class="fs-18 text--secondary/70 pt-1 line-clamp-2">Stop thinking about how to organize your code and deal with your business specific problems instead.</p>
                            </div>
                        </div>
                    </a>
                </div>
            
        </div>
    </div>

    <!-- Latest blogs -->
    <div class="pt-5 px-2 blog-main">
        <div class="d-flex align-items-center justify-content-between swiper-buttons position-relative">
            <!-- Left Button -->
            <div class="swiper-button-prev"></div>

            <!-- Heading -->
            <h2 class="text-center fw-bold fs-60 flex-grow-1 mx-5 mb-0">Latest From the Wheels Dev Blog</h2>

            <!-- Right Button -->
            <div class="swiper-button-next"></div>
        </div>

        <div class="swiper py-5 blogSwiper h-max">
            <div class="swiper-wrapper" id="blogs-container">
                
                    <div class="p-4 bg-white rounded-5 shadow-sm swiper-slide">
                        
                            <div>
                                <p class="fs-18 mb-3 text--secondary/70 fw-bold line-clamp-1">Why We Rebuilt Our CI Pipeline From 40 Minutes to 82 Seconds</p>
                                <div class="fs-16 mb-3 text--lightGray line-clamp-2">
                                    # Why We Rebuilt Our CI Pipeline From 40 Minutes to 82 Seconds

*April 9, 2026 — Peter Amiri, Wheels Core Team*

---

For years, the Wheels CI pipeline ran every commit through a gauntlet: five CFML engines, seven databases, Docker Compose orchestrating it all. It was thorough. It was comprehensive. And it was killing our velocity.

Today we shipped a fundamentally different approach. Our primary CI now runs in **82 seconds**. No Docker. No CommandBox. Just LuCLI, Lucee 7, and SQLite — the same tools a developer uses on their laptop.

This post explains the reasoning behind the change, what we learned, and why we think this pattern applies to any framework project fighting its own CI.

## The Problem We Were Solving

Our previous CI pipeline tested every push to `develop` against this matrix:

| | MySQL | PostgreSQL | SQL Server | H2 | CockroachDB | Oracle | SQLite |
|---|---|---|---|---|---|---|---|
| **Lucee 5** | | | | | | | |
| **Lucee 6** | | | | | | | |
| **Lucee 7** | | | | | | | |
| **Adobe 2023** | | | | | | | |
| **Adobe 2025** | | | | | | | |
| **BoxLang** | | | | | | | |

That's up to 42 engine-database combinations. Each engine needed a Docker image built from `ortussolutions/commandbox`, which downloads CommandBox, installs Lucee or Adobe CF, warms up the server, installs dependencies, and then starts. The database containers needed their own startup time — Oracle alone takes 2-3 minutes to accept connections.

A typical CI run took **30-45 minutes**. On a bad day with flaky Oracle connections or BoxLang compilation issues, it could take over an hour.

More critically, this matrix had become a **development tax**. Every feature branch had to pass every engine. Every refactor had to work identically on Lucee, Adobe CF, and BoxLang. The cross-engine differences weren't just slowing CI — they were slowing the design of the framework itself.

## The Cost of Universal Compatibility

When you maintain compatibility across three fundamentally different CFML engines, every abstraction carries hidden weight. Here are real examples from the weeks before this change:

**The `invoke()` BIF**: Adobe ColdFusion requires positional arguments for `invoke()`. Lucee accepts named arguments. BoxLang requires extracting the method reference and calling it directly. A single line of code — "call this method on this object" — needed an engine adapter with three implementations.

**The `interface` keyword**: We added a CFML `interface` file for documentation. It compiled fine on Lucee and Adobe. BoxLang's CFC scanner choked on it during directory traversal, crashing the entire application before a single test could run.

**Oracle TIMESTAMP coercion**: Oracle's JDBC driver returns `oracle.sql.TIMESTAMP` objects instead of standard dates. BoxLang needed these coerced to CFML dates. Adobe CF didn't — until we added a unified adapter, which then broke Adobe's timestamp comparison tests. Fixing Adobe broke BoxLang's `hasChanged()` method. Each fix for one engine destabilized another.

**The `$wheels` lifecycle**: During application startup, the framework stores configuration in `application.$wheels`, then copies it to `application.wheels` at the end of initialization. Code that runs mid-initialization needs to check both locations. This was invisible for years until the engine adapter PR introduced a function that was called during route loading — before the copy happened. Every engine crashed, but each with a different error message.

These aren't exotic edge cases. They're the daily reality of cross-engine CFML development. Every one of them turned a 30-minute feature into a multi-day debugging session, with CI as the bottleneck for each iteration.

## The Strategic Decision: Pick a Primary Platform

We made a deliberate choice: **Lucee 7 and SQLite are the primary supported platform for Wheels going forward.**

This doesn't mean we're dropping support for other engines or databases. It means we're changing the relationship between primary and secondary platforms:

- **Primary (Lucee 7 + SQLite)**: Hard CI gate. Every PR. Every merge. Must pass to ship.
- **Secondary (everything else)**: Monitored weekly. Failures are tracked and addressed, but they don't block development.

This mirrors how most successful open-source projects operate. Rails doesn't block releases on JRuby compatibility. Django doesn't require every commit to pass on MySQL, PostgreSQL, and SQLite simultaneously. They pick a reference platform, optimize the inner loop for it, and run broader compatibility checks on a separate cadence.

### Why Lucee 7

Lucee is where Wheels development happens. It's the engine the core team runs locally. It's the engine most Wheels applications deploy on. And with LuCLI — our new Lucee-native CLI — it's the engine we're investing in for the AI-native development experience (MCP tools, code generation, interactive REPL).

Lucee 7 specifically because it's the current mainline release with active development and the best performance characteristics.

### Why SQLite

SQLite eliminates external dependencies entirely. No Docker container to start. No connection pooling to configure. No 3-minute Oracle startup to wait for. The SQLite JDBC driver is a single JAR file.

For a framework test suite that exercises ORM behavior, query building, migrations, and data validation, SQLite covers the vast majority of code paths. Database-specific behavior (stored procedures, vendor-specific SQL) is tested in the weekly compatibility matrix.

## The New Architecture

### Primary CI: LuCLI Native (82 seconds)

```
checkout -> setup JDK 21 -> install LuCLI binary (38MB download)
  -> create SQLite test databases
  -> lucli server run (starts Lucee 7 natively on the runner)
  -> install SQLite JDBC into Lucee classpath
  -> run 2,482 tests via curl
  -> parse results, generate JUnit XML
  -> upload artifacts
```

No Docker. No CommandBox. LuCLI downloads as a single Linux binary from GitHub Releases. It starts Lucee Express directly on the GitHub Actions runner JVM. The test suite runs against localhost.

The total job time is **82 seconds**, including JDK setup, Lucee download (cached after first run), server startup, and running all 2,482 tests.

### Develop Pipeline: Fast Test Gates Release

```
fast-test (82s) -> build snapshot (ForgeBox publish) -> sync docs (wheels.dev)
```

The snapshot release to ForgeBox only happens if the fast test passes. This is the same gate that existed before — it just runs 30x faster.

### Compatibility Matrix: Weekly + Manual

The full 5-engine x 7-database Docker Compose matrix now runs on a weekly schedule (Sunday 02:00 UTC) and via manual dispatch. It uses the exact same `tests.yml` workflow that was previously the primary CI. Nothing was deleted — it was relocated.

This gives us:
- **Early drift detection**: If Adobe CF 2025 breaks on a Wheels change, we'll know within a week.
- **No noise on every push**: Developers don't see red badges for BoxLang compilation issues they can't fix.
- **On-demand deep testing**: Before a release, anyone can trigger the full matrix manually.

## What LuCLI Means for CI

LuCLI is more than a CommandBox replacement — it's a statement about where Wheels is headed. By using LuCLI in CI, the pipeline validates the same tool developers use locally:

- `lucli server start` starts the same Lucee instance in CI and on your laptop
- `lucli server stop` cleanly shuts it down
- The `lucee.json` configuration file is the single source of truth for server config

When CI and local development use the same tools, "works on my machine" and "works in CI" converge. There's one mental model, one set of troubleshooting steps, one path from code change to verification.

## The Datasource Pattern: Engine-Level to App-Level

The move from CommandBox to LuCLI surfaced an important architectural shift in how datasources are configured.

In the CommandBox/Docker world, datasources lived at the **engine level**. CommandBox supports CFConfig — a JSON file that injects datasource definitions directly into Lucee's server configuration before the application starts. Our Docker Compose files used `CFConfig.json` to define all seven database connections (MySQL, PostgreSQL, SQL Server, H2, CockroachDB, Oracle, SQLite) at the engine layer. The application never needed to know how those connections were established — it just referenced them by name.

LuCLI doesn't support CFConfig. Rather than building a compatibility shim, we took this as an opportunity to move datasource definitions where they arguably belong: **at the application level**. CFML has supported `this.datasources` in `Application.cfc` for years, but the ecosystem's reliance on engine-level admin panels and CFConfig meant most developers never used it.

In Wheels, `config/app.cfm` is the recommended place for Application-level configuration — it's included by `Application.cfc` and keeps the framework file clean:

```cfm
// config/app.cfm
if (server.system.environment.WHEELS_CI ?: "" == "true") {
    this.datasources["wheelstestdb_sqlite"] = {
        class: "org.sqlite.JDBC",
        connectionString: "jdbc:sqlite:#expandPath('../')#wheelstestdb.db"
    };
}
```

This is a better pattern for several reasons. App-level datasources are version-controlled with your code. They're portable across engines without engine-specific admin tools. They're visible in code review. And they work identically whether you're running LuCLI locally, deploying to a server, or running in CI — no separate configuration layer to keep in sync.

The `WHEELS_CI` environment variable gates the test datasources so they only activate in CI. Production applications define their real datasources in the same file, ungated, or read connection strings from environment variables.

## Lessons Learned

### 1. Comprehensive doesn't mean fast

A 42-combination test matrix is comprehensive. It's also 42x slower than testing one combination. For the inner development loop — where a developer pushes a commit and wants to know if it works — comprehensive is the enemy of productive.

### 2. Engine differences are architectural, not incidental

The differences between Lucee, Adobe CF, and BoxLang aren't bugs to be papered over. They're fundamental architectural differences in how these engines handle compilation, class loading, struct member functions, and Java interop. Treating them as incidental (just add an `if` statement) leads to an ever-growing thicket of conditional code. Treating them as architectural (pick a primary, adapt others) leads to cleaner abstractions.

### 3. CI time is developer time multiplied

If your CI takes 40 minutes and your team pushes 10 times a day, that's nearly 7 hours of CI time daily. Even if developers context-switch during that time, the cognitive cost of interrupted flow is real. At 82 seconds, the feedback is practically synchronous — push, grab a coffee, see results.

### 4. The legacy matrix is still valuable — just not as a gate

We didn't delete the compatibility matrix. We decoupled it from the critical path. The weekly run still catches drift. The manual trigger is available before releases. But it no longer holds every commit hostage to Oracle startup times and BoxLang compilation quirks.

## What's Next

This CI change is part of a larger strategic shift toward Lucee 7 as the reference platform for Wheels:

- **LuCLI as the recommended CLI**: Replacing CommandBox for Wheels-specific workflows (generation, testing, migration, MCP)
- **Engine adapters**: The adapter pattern from the W-004 PR centralizes cross-engine behavior, making it easier to maintain secondary engine support without polluting the main codebase
- **Docker simplification**: Local development moves to `lucli server start` instead of `docker compose up`. Docker stays for the compatibility matrix and production deployment

The goal is a development experience where the distance between idea and verified code is measured in seconds, not minutes.

---

*The CI pipeline changes are in [PR #2032](https://github.com/wheels-dev/wheels/pull/2032). The compatibility matrix runs weekly and is available via manual dispatch at [Actions > Wheels Compatibility Matrix](https://github.com/wheels-dev/wheels/actions/workflows/compat-matrix.yml).* 
                                </div>
                            </div>

                            <div class="d-flex gap-2 justify-content-between align-items-center">
                                <p class="fs-16 truncate fw-medium text--lightGray">April 09, 2026 by Peter Amiri</p>
                                <a href="/blog/why-we-rebuilt-our-ci-pipeline-from-40-minutes-to-82-seconds"><button class="bg--primary text-nowrap fs-16 text-white rounded-2 px-3 py-1">Learn more</button></a>
                            </div>
                    </div>
                
                    <div class="p-4 bg-white rounded-5 shadow-sm swiper-slide">
                        
                            <div>
                                <p class="fs-18 mb-3 text--secondary/70 fw-bold line-clamp-1">Wheels CLI Asset Commands: precompile, clean & clobber</p>
                                <div class="fs-16 mb-3 text--lightGray line-clamp-2">
                                    # Introduction
So far in this series, we’ve explored how the Wheels CLI in 3.x helps you manage your application’s environments, databases, plugins, and testing workflows. Now we’re discussing another critical aspect of modern web applications:

# Asset management.
Every production-ready application depends on optimized frontend assets — CSS, JavaScript, images, fonts, and other static resources. During development, assets are often served individually for easier debugging. But in production, they must be optimized for performance.

That’s where Wheels CLI asset commands come in.

Instead of manually bundling, clearing, or rebuilding static files, Wheels 3.x provides structured commands to manage the asset pipeline directly from your terminal.

The CLI now supports:
```
wheels assets precompile
wheels assets clean
wheels assets clobber
```

These commands transform asset handling from a manual deployment step into a repeatable, production-ready workflow.

# Why Asset Commands Matter
In real-world applications, asset management affects:
* Page load speed
* Caching efficiency
* SEO performance
* Production stability
* Deployment reliability

Without proper asset control, you may encounter:
* Old CSS or JS being cached
* Missing compiled files
* Conflicts between development and production builds
* Bloated static assets
* Inconsistent deployments

The Wheels CLI asset commands solve these issues with clarity and structure.

# wheels assets precompile
`wheels assets precompile`

This command prepares your assets for production. It typically:
* Compiles CSS and JavaScript
* Bundles files
* Minifies output
* Generates fingerprinted filenames
* Optimizes static resources

When to Use It
* Before deploying to staging
* Before deploying to production
* During CI/CD pipelines
* After frontend updates

Instead of relying on runtime compilation, precompiling ensures assets are ready before the application goes live.

**Benefits**
* Faster production performance
* Reduced runtime overhead
* Improved caching behavior
* Stable, predictable deployments
Precompilation shifts processing from runtime to build time — which is a best practice in modern web architecture.

# wheels assets clean
`wheels assets clean`

Over time, your compiled assets directory may accumulate outdated files. The **clean** command removes old or unused compiled assets while preserving necessary ones.

**Why This Is Important**
Without cleaning:
* Disk usage grows
* Old fingerprinted files remain
* Confusion increases during debugging
* Deployment directories become cluttered

**When to Use It**
* After multiple deployments
* When troubleshooting asset conflicts
* Before running a fresh precompile
* During maintenance

It keeps your asset directory organized and efficient.

# wheels assets clobber
`wheels assets clobber`

The **clobber** command is more aggressive. It removes all compiled assets completely. Think of it as a full reset.

**When to Use It**
When assets are corrupted
After major frontend restructuring
When switching build strategies
During deep troubleshooting
After running:

```
wheels assets clobber
wheels assets precompile
```

You get a completely fresh build from scratch.

**Why It’s Powerful**
* Eliminates stale artifacts
* Removes hidden conflicts
* Forces a clean rebuild
* Ensures consistency

Use it carefully — but confidently.

# Example Production Workflow
**Before Deployment**
```
wheels assets clean
wheels assets precompile
```

**If Something Feels Off**
```
wheels assets clobber
wheels assets precompile
```

**CI/CD Example**
`wheels assets precompile || exit 1`

Automated builds become reliable and predictable.

# How These Commands Improve Team Workflows
They bring:
* Standardized build processes
* Cleaner deployment cycles
* Faster load times
* Reduced caching bugs
* Better frontend stability
* Easier troubleshooting

Instead of manually managing static files, everything is controlled via CLI — just like databases, environments, and plugins.

# The Bigger Picture
Earlier development workflows often mixed runtime asset handling with manual production steps. Wheels 3.x introduces structured asset lifecycle management.
Just like:
* Database commands manage data
* Environment commands manage configuration
* Testing commands ensure quality
* Plugin commands extend functionality

Asset commands manage performance and deployment consistency. This completes the development lifecycle.

# What This Means for Wheels Developers
With precompile, clean, and clobber, you gain:
* Faster production performance
* Reliable build processes
* Cleaner deployments
* Reduced frontend-related bugs
* Better CI/CD automation

Assets are no longer an afterthought. They are part of your deployment discipline.

# Conclusion
The Wheels CLI asset commands in 3.x bring structure to frontend asset management:
* `assets precompile` → Prepare for production
* `assets clean` → Remove outdated builds
* `assets clobber` → Reset everything completely

If environment commands help you deploy safely…
If testing commands help you ensure quality…
If plugin commands help you extend your app…

Asset commands help you deliver performance. And in modern web development, performance is not optional — it’s expected.

Stay tuned for more deep dives into the evolving Wheels CLI ecosystem.
 
                                </div>
                            </div>

                            <div class="d-flex gap-2 justify-content-between align-items-center">
                                <p class="fs-16 truncate fw-medium text--lightGray">March 19, 2026 by Zain Ul Abideen</p>
                                <a href="/blog/wheels-cli-asset-commands-precompile-clean-clobber"><button class="bg--primary text-nowrap fs-16 text-white rounded-2 px-3 py-1">Learn more</button></a>
                            </div>
                    </div>
                
                    <div class="p-4 bg-white rounded-5 shadow-sm swiper-slide">
                        
                            <div>
                                <p class="fs-18 mb-3 text--secondary/70 fw-bold line-clamp-1">Wheels CLI Plugin Commands: search, install, remove & init</p>
                                <div class="fs-16 mb-3 text--lightGray line-clamp-2">
                                    # Introduction
So far in this series, we’ve explored how the Wheels CLI in 3.x helps you manage your application key points and main aspects. Now we are discussing one of the strengths of Wheels, which has always been its extensibility. With Wheels 3.x, plugin management has evolved into a complete lifecycle experience within the CLI. In earlier versions of Wheels, we already had plugin-related commands such as:

`wheels plugin list`

This allowed developers to quickly see which plugins were installed inside an application and verify their presence. However, installation and management were still largely manual processes.

Plugins allow you to:
* Add reusable functionality
* Share common solutions across project
* Integrate third-party services
* Extend framework behavior
* Standardize patterns across teams

The framework now provides structured commands to discover, install, remove, and even scaffold plugins — all without leaving your terminal.
The CLI now supports:

```
wheels plugins search
wheels plugins install
wheels plugins remove
wheels plugins init
```

This shift brings several advantages:
* Centralized plugin discovery
* Consistent installation across teams
* Clean and safe removal
* Faster onboarding for new developers
* Ability to scaffold reusable internal plugins
* Reduced manual file handling errors

Instead of manually downloading, copying, and configuring plugin folders, everything can now be managed directly from the CLI.

What used to be a manual setup task is now a structured, repeatable workflow — aligned with modern development practices.

# Why Plugin CLI Commands Matter
Traditionally, managing plugins meant:
* Searching documentation or GitHub manually
* Downloading zip files
* Copying folders into /plugins
* Managing dependencies manually
* Removing plugins by deleting directories

This process was:
* Inconsistent
* Error-prone
* Hard to standardize across teams

The new CLI plugin commands bring:
* Discoverability
* Automation
* Clean installation
* Safe removal
* Scaffolding for new plugins

It makes plugin management modern and developer-friendly.

# wheels plugins search
**Discover Available Plugins**

`wheels plugins search authenticateThis`

This command lets you search for available plugins by keyword. Instead of browsing repositories manually, you can:
* Search by functionality
* Explore plugin descriptions
* See available versions
* Identify compatible plugins

**When to Use It**
* Looking for caching solutions
* Searching for authentication helpers
* Exploring logging enhancements
* Finding integrations (payment, email, etc.)

It turns plugin discovery into a quick CLI action instead of a research task.

# wheels plugins install
**Install Plugins Cleanly**

`wheels plugins install authenticateThis`

This command:
* Downloads the plugin
* Places it in the correct directory
* Handles necessary setup steps
* Registers it properly within the app

No manual folder copying.
No guesswork.

**Benefits**
* Standardized installation
* Reduced setup errors
* Faster onboarding
* Clear version control

For teams, this is huge. Instead of sending plugin files manually, you simply say:

`“Run wheels plugins install xyz.”`

Consistent. Repeatable. Clean.

# wheels plugins remove
**Remove Plugins Safely**

`wheels plugins remove authenticateThis`

Instead of manually deleting plugin directories and hoping nothing breaks, this command:
* Removes the plugin cleanly
* Updates internal references
* Keeps the application structure organized

**Why This Matters**
Manual removal can leave:
* Unused config entries
* Stray files
* Broken dependencies

The CLI ensures a structured uninstall process.

Cleaner codebase.
Less technical debt.

# wheels plugins init
**Scaffold Your Own Plugin**

`wheels plugins init myCustomPlugin`

This command creates the basic structure for a new plugin.
It generates:
* Required directories
* Boilerplate files
* Plugin configuration
* Proper structure following Wheels conventions

**Why This Is Powerful**
If your team builds reusable features across multiple apps:
* Custom validation logic
* Shared integrations
* Common business utilities
* Internal framework extensions

You can now package them as plugins easily.

Instead of copying code between projects, you create a proper plugin once — and reuse it everywhere.

# Real-World Workflow Example
**Discover a Plugin**

`wheels plugins search i18n`

**Install It**

`wheels plugins install wheels-i18n`

**Confirm Installation**

`wheels plugin list`

**Remove If No Longer Needed**

`wheels plugins remove wheels-i18n`

**Build Your Own**

`wheels plugins init companyAuth`

Everything stays structured and reproducible.

# Team & CI/CD Benefits
These commands support:
* Faster onboarding
* Standardized project setup
* Automated plugin installation in pipelines
* Cleaner version control
* Reduced manual steps

For example, in CI:

`wheels plugins install paymentGateway`

The environment is ready instantly.

# The Bigger Evolution of Wheels CLI
In older versions, plugin management was mostly manual, with only listing support available. Wheels 3.x expands that capability into:
* Plugin discovery
* Automated installation
* Structured removal
* Plugin scaffolding

This reflects a broader philosophy shift:
The CLI is no longer just for generating controllers and models. It’s becoming:
* A project manager
* A dependency manager
* An automation tool
* A development assistant

# What This Means for Wheels Developers
With search, install, remove, init, and plugin list, you gain:
* Faster project setup
* Cleaner dependency management
* Better reusability
* Stronger team consistency
* Simplified maintenance

Plugins are no longer “extra files.” They are first-class components of your application architecture. And the CLI treats them that way.

# Conclusion
The Wheels CLI plugin commands in 3.x modernize how developers extend their applications.

* `plugins search` → Discover functionality
* `plugins install` → Add it cleanly
* `plugins remove` → Remove it safely
* `plugins init` → Build your own
* `plugin list` → Track what’s installed

If database commands help you manage data…
If testing commands help you ensure quality…

Plugin commands help you extend your app intelligently. And in modern development, intelligent extensibility is everything.

Stay tuned — more Wheels CLI deep dives are coming.
 
                                </div>
                            </div>

                            <div class="d-flex gap-2 justify-content-between align-items-center">
                                <p class="fs-16 truncate fw-medium text--lightGray">March 13, 2026 by Zain Ul Abideen</p>
                                <a href="/blog/wheels-cli-plugin-commands-search-install-remove-init"><button class="bg--primary text-nowrap fs-16 text-white rounded-2 px-3 py-1">Learn more</button></a>
                            </div>
                    </div>
                
                    <div class="p-4 bg-white rounded-5 shadow-sm swiper-slide">
                        
                            <div>
                                <p class="fs-18 mb-3 text--secondary/70 fw-bold line-clamp-1">Wheels CLI Testing Commands: run, all, unit, integration, watch & coverage</p>
                                <div class="fs-16 mb-3 text--lightGray line-clamp-2">
                                    # Introduction
In previous articles, we explored how the Wheels CLI helps you manage environments, configuration, and databases safely in Wheels 3.x.

Now we’re stepping into one of the most critical parts of modern development:
# Testing automation.
Writing tests is important. Running them consistently, efficiently, and intelligently is even more important.
Whether you're:
* Fixing a bug
* Refactoring a model
* Building a new feature
* Reviewing a pull request
* Preparing for deployment
* Running CI/CD pipelines

You need fast, reliable test execution. That’s where the Wheels CLI testing commands come in:
```
wheels test run
wheels test all
wheels test unit
wheels test integration
wheels test watch
wheels test coverage
```

These commands transform testing from a manual step into a structured development workflow.

# Why CLI-Based Testing Matters
Without proper CLI testing tools, developers often:
* Run tests inconsistently
* Forget to run certain test suites
* Skip integration tests
* Manually check coverage
* Run full test suites unnecessarily
* Waste time rerunning everything

The Wheels CLI standardizes test execution. It makes testing:
* Repeatable
* Targeted
* Automated
* CI-friendly
* Developer-friendly

Testing becomes part of your daily workflow — not a separate task.

# wheels test run
Run Tests Quickly
`wheels test run`

This is your primary test execution command. It runs your default configured test suite. Use it when:
* You’ve made changes
* You’re about to commit
* You’re verifying a bug fix
* You’re checking regression impact

It’s your go-to command for daily development.

# wheels test all
**Execute Everything**
`wheels test all`

This runs:
* Unit tests
* Integration tests
* Full application tests

Use it when:
* Preparing for deployment
* Running CI builds
* Verifying a major refactor
* Ensuring full system stability

This gives you complete confidence before shipping.

# wheels test unit
**Fast, Focused Feedback**
`wheels test unit`

Unit tests are:
* Fast
* Isolated
* Focused on small pieces of logic

They test:
* Models
* Services
* Helpers
* Utility functions

Run this when:
* Refactoring business logic
* Updating model behavior
* Testing validation rules
* Working on isolated components

Unit tests provide rapid feedback. They should run in seconds.

# wheels test integration
**Test Real Interactions**
`wheels test integration`

Integration tests validate how components work together.
They typically cover:
* Controller → Model interactions
* Database queries
* API endpoints
* Authentication flows
* Request lifecycles

These tests are slower than unit tests — but far more comprehensive.
Use them when:
* Updating controllers
* Modifying routes
* Changing database behavior
* Adjusting authentication
* Testing real request flows

Integration tests protect against system-level regressions.

# wheels test watch
**Continuous Testing During Development**
`wheels test watch`

This command monitors your project files. When changes are detected, Tests automatically rerun. This creates a powerful development loop:
1. Edit code
2. Save
3. Tests rerun instantly
4. See failures immediately

It encourages:
* Test-driven development (TDD)
* Faster debugging
* Immediate feedback
* Higher code quality

No more manually re-running tests after every change.

# wheels test coverage
**Measure Code Coverage**
`wheels test coverage`

Running tests is good. Knowing what they actually cover is better. This command generates a coverage report showing:
* Percentage of code covered
* Untested files
* Uncovered lines
* Weak testing areas

Coverage helps you:
* Identify missing test cases
* Improve test completeness
* Strengthen critical components
* Enforce quality standards

It transforms testing from reactive to strategic.

# How These Commands Work Together
Here’s a modern development workflow:
**Daily Development**
`wheels test unit`

Fast feedback while coding.

**After Feature Completion**
`wheels test integration`

Validate system behavior.

**Before Commit**
`wheels test run`

Quick verification.

**Before Deployment**
```
wheels test all
wheels test coverage
```

Full confidence check.

**During Active Development**
`wheels test watch`

Continuous feedback loop. Each command serves a specific purpose. Together, they create a complete testing ecosystem.

# CI/CD Integration
These commands are designed to work seamlessly in pipelines:

**wheels test all || exit 1**

If tests fail, deployment stops.

Add coverage thresholds for quality enforcement:
* Require minimum coverage percentage
* Block deployment if below standard
* Track coverage trends over time

This makes testing not just a developer tool — but a deployment safeguard.

# The Bigger Picture
Older CLI tools focused mainly on scaffolding and generation.
Wheels 3.x CLI emphasizes:
* Observability
* Environment safety
* Configuration validation
* Database lifecycle management
* Automated testing

Testing commands elevate the CLI into a full development companion.
Modern development requires:
* Fast iteration
* Automated validation
* Confidence before release
* Clear quality metrics

These testing commands deliver exactly that.

# What This Means for Wheels Developers
With **run**, **all**, **unit**, **integration**, **watch**, and **coverage**, you gain:
* Faster debugging cycles
* Stronger code quality
* Safer refactoring
* CI-ready workflows
* Continuous feedback
* Measurable quality standards

Testing stops being optional. It becomes integrated. And when testing becomes effortless, quality naturally improves.

# Conclusion
The Wheels CLI testing commands in 3.x bring structure and power to your development workflow:
* `test run` → Quick verification
* `test all` → Full system validation
* `test unit` → Fast, focused checks
* `test integration` → Real-world confidence
* `test watch` → Continuous feedback
* `test coverage` → Quality measurement

If database commands help you manage data…
If environment commands help you deploy safely…

Testing commands help you build with confidence. And in modern development, confidence is everything.

Stay tuned — more Wheels CLI deep dives are coming.

https://youtu.be/L2Z5bxcgVwE 
                                </div>
                            </div>

                            <div class="d-flex gap-2 justify-content-between align-items-center">
                                <p class="fs-16 truncate fw-medium text--lightGray">March 09, 2026 by Zain Ul Abideen</p>
                                <a href="/blog/wheels-cli-testing-commands-run-all-unit-integration-watch-coverage"><button class="bg--primary text-nowrap fs-16 text-white rounded-2 px-3 py-1">Learn more</button></a>
                            </div>
                    </div>
                
                    <div class="p-4 bg-white rounded-5 shadow-sm swiper-slide">
                        
                            <div>
                                <p class="fs-18 mb-3 text--secondary/70 fw-bold line-clamp-1">Wheels CLI Database Commands: db create & db drop</p>
                                <div class="fs-16 mb-3 text--lightGray line-clamp-2">
                                    # Introduction
So far in this series, we’ve explored how the Wheels CLI in 3.x helps you inspect your application, manage configuration, and control environments safely. Now we’re moving into something even more foundational: **database lifecycle management**.

Your application might have clean code and perfectly aligned environments — but without a properly provisioned database, nothing works. In a Wheels application, the database is not just storage. It powers:
* Migrations
* Application data
* Session handling
* Background jobs
* Automated tests
* API responses

It’s core infrastructure. And whether you're:
* Setting up a new project
* Onboarding a teammate
* Preparing a staging server
* Resetting a development database
* Cleaning up after automated CI tests

You’ll eventually need to create or drop a database. Traditionally, this meant:
* Logging into the database server manually
* Running raw SQL commands
* Managing permissions
* Double-checking you weren’t targeting production
* Repeating the same setup steps across environments

It was manual.
It was inconsistent.
And sometimes — risky.

Wheels CLI simplifies this by using your existing environment and datasource configuration to manage database provisioning directly from your project root safely.

That’s where these two powerful commands come in:

```
wheels db create
wheels db drop
```

Simple in appearance.
Powerful in impact.

# Why Database CLI Commands Matter
Traditionally, creating or dropping databases meant:
* Logging into SQL Server / MySQL / PostgreSQL manually
* Running SQL scripts
* Managing permissions
* Copying credentials
* Risking mistakes

In team environments, this creates friction:
* “What’s the correct database name?”
* “Which server do I connect to?”
* “Is this staging or production?”
* “Did I just drop the wrong database?”

The Wheels CLI eliminates this confusion by using your existing environment configuration.
It knows:
* Your datasource
* Your database name
* Your environment
* Your credentials

And it acts accordingly.

# wheels db create
Create a Database Instantly
`wheels db create`

This command creates the configured database for your active environment.
It reads:
* Environment settings
* Datasource configuration
* Database name
* Connection credentials

Then it provisions the database automatically.

**When to Use db create**
New Project Setup:
```
wheels environment show
wheels db create
```

Your local database is ready — no manual SQL required.

Onboarding a Team Member:
Instead of sending setup documentation with SQL instructions:

*“Just run wheels db create.”*

It standardizes project setup.

Automated Test Environments:
In CI pipelines:

`wheels db create`

The database is created dynamically for testing. After tests complete, it can be dropped cleanly.

**What Happens Behind the Scenes:**
The command:
1. Connects to your DB server
2. Checks whether the database exists
3. Creates it if missing
4. Validates permissions
5. Confirms success

It respects your current environment.

That means:
If you are in development → It creates the development DB.
If you are in staging → It creates the staging DB.

No cross-environment confusion.

# wheels db drop
Drops the configured database. This command permanently deletes a database. This is a destructive operation that cannot be undone.

`wheels db drop`

This command drops the database for the active environment.

Used carefully, it’s extremely powerful.
Used recklessly, it’s dangerous.

That’s why environment awareness is critical.

**When to Use db drop**
Resetting Development:
Need a clean slate?

```
wheels db drop
wheels db create
```

Now you have a fresh database. Perfect for schema resets or major refactors.

Rebuilding After Migration Changes:
If migrations changed significantly:

```
wheels db drop
wheels db create
wheels db migrate latest
```

You’re back to a fully rebuilt database.

CI/CD Cleanup:
In automated pipelines:

`wheels db drop`

Removes temporary test databases after completion.

**Safety First: Environment Awareness**
Before running db drop, always confirm your environment:

`wheels environment show`

Dropping a production database accidentally is catastrophic.
That’s why best practice is:
1. Confirm environment
2. Validate settings
3. Then execute database commands

# Example Safe Workflow
Step 1 – Confirm Environment
`wheels environment show`

Step 2 – Validate Environment
`wheels environment validate`

Step 3 – Drop (if safe)
`wheels db drop`

Step 4 – Recreate
`wheels db create`

This structured process prevents irreversible mistakes.

# Real-World Development Scenarios
**Scenario 1: Local Development Reset**
You’ve been experimenting with schema changes. Your database is messy. Instead of manually cleaning tables:

```
wheels db drop
wheels db create
```

Clean slate.
Fresh start.
Zero manual SQL.

**Scenario 2: Staging Server Preparation**
Before pushing new features:

```
wheels environment switch staging
wheels db create
```

Ensures staging DB exists and matches configuration.

**Scenario 3: Automated Testing**
Your CI workflow:

```
wheels environment set testing
wheels db create
wheels test run
wheels db drop
```

Fully automated lifecycle.
No manual intervention.

# How These Commands Improve Team Workflows
They:
* Standardize database setup
* Reduce onboarding friction
* Eliminate manual SQL steps
* Prevent configuration mismatches
* Support automated pipelines
* Encourage safe environment practices

In modern development, repeatability matters. These commands make database setup repeatable.

# The Bigger Philosophy
Earlier CLI tools focused on scaffolding code. Wheels 3.x CLI is evolving into:
* An environment manager
* A configuration validator
* A deployment assistant
* A database lifecycle controller

Applications aren’t just code. They are infrastructure + configuration + environments + data. Managing databases via CLI is a natural evolution.

# Important Best Practices
Before using database commands:
* Always confirm environment
* Never drop production unless intentional
* Use validation commands
* Automate in CI when possible
* Keep credentials secure

Treat database commands with respect. They’re powerful by design.

# Conclusion
The new database commands in Wheels CLI 3.x simplify one of the most critical parts of application management.

`wheels db create` → Instantly provision databases
`wheels db drop` → Cleanly remove databases

Together, they:
* Speed up development
* Simplify onboarding
* Enable automation
* Support safe workflows
* Reduce manual SQL tasks

If scaffolding commands help you build faster…

Environment commands help you deploy safer…

These database commands help you reset, rebuild, and automate smarter. And in modern development, controlled data management is everything.

Stay tuned — more Wheels CLI deep dives are coming.

Learn more here: https://youtu.be/HYXg5CtxrYQ 
                                </div>
                            </div>

                            <div class="d-flex gap-2 justify-content-between align-items-center">
                                <p class="fs-16 truncate fw-medium text--lightGray">March 05, 2026 by Zain Ul Abideen</p>
                                <a href="/blog/wheels-cli-database-commands-db-create-db-drop"><button class="bg--primary text-nowrap fs-16 text-white rounded-2 px-3 py-1">Learn more</button></a>
                            </div>
                    </div>
                
                    <div class="p-4 bg-white rounded-5 shadow-sm swiper-slide">
                        
                            <div>
                                <p class="fs-18 mb-3 text--secondary/70 fw-bold line-clamp-1">wheels.dev Goes Public: A Production Wheels 3.0 Application You Can Actually Study</p>
                                <div class="fs-16 mb-3 text--lightGray line-clamp-2">
                                    Most framework documentation tells you *how* to build something. The Wheels community site at wheels.dev is something different -- it's a production application built with Wheels 3.0 that you can actually look at, poke around, and learn from. We've made the source public, and this article walks through how the site is built, how it's deployed, and how it comes to life inside a Docker Swarm.

## Why Make the Site Public?

Framework examples tend to be toy applications. They show you the syntax but not the patterns. They demonstrate a feature in isolation but never show you how thirty features work together in something real.

wheels.dev is a real application with real users. It has a blog system with moderation workflows, user authentication with role-based access control, a documentation viewer, newsletter management, an admin dashboard, and a full API layer. It handles file uploads, session clustering across multiple replicas, transactional email, and error tracking. It's the kind of application that exposes the decisions frameworks force you to make -- and shows how Wheels 3.0 handles them.

By making the source public, we're turning the community site into the most comprehensive Wheels 3.0 example that exists.

## The Architecture

At its core, wheels.dev follows the MVC pattern that Wheels is built around, but scaled to production complexity.

### Models: 31 ActiveRecord Components

The data layer uses Wheels' ActiveRecord ORM with 31 model components. The `Blog` model alone demonstrates associations (`belongsTo` User, `hasMany` Comments, Tags, Categories, and ReadingHistory), validations, callbacks, and soft deletes tracked through `deletedAt` and `deletedBy` columns. The `User` model handles password hashing via bcrypt, role associations, and relationships to everything a user can create or interact with.

Other models handle the supporting infrastructure: `RememberToken` for persistent login sessions, `PasswordReset` for email-based recovery flows, `LoginAttempt` for security tracking, `Newsletter` and `NewsletterSubscriber` for email campaigns, `Testimonial` with an approval workflow, and `CachedRelease` for caching ForgeBox release data.

The database runs on CockroachDB, accessed through a standard PostgreSQL JDBC driver -- CockroachDB speaks the PostgreSQL wire protocol, so Wheels connects to it like any other Postgres database. The schema is managed entirely through timestamped migration files -- over 20 of them covering 25+ tables with foreign key constraints, indexes, and referential integrity.

And yes, we're dogfooding here. Wheels currently supports six databases: MySQL, PostgreSQL, SQL Server, H2, Oracle, and SQLite. Running the community site on CockroachDB is our way of putting a seventh database adapter through its paces in production. Anybody hear a seventh supported database coming?

### Controllers: Three Namespaces

Controllers are organized into three distinct namespaces, each serving a different concern:

- **`web.*`** handles public-facing pages -- the homepage, blog listing and detail views, guides, documentation, community pages, and authentication flows
- **`admin.*`** powers the dashboard for content moderation, user management, settings, newsletter administration, and testimonial approval
- **`api.*`** exposes RESTful endpoints for blog content, downloads, and authentication

A base `Controller.cfc` provides shared infrastructure: CSRF protection via `protectsFromForgery()`, authentication helpers, role-based access checks, and reusable query methods for fetching blogs with their associated tags, categories, and attachments.

### Routing: RESTful by Convention

The routing configuration in `config/routes.cfm` demonstrates Wheels' mapper DSL at scale. API routes live under `/api/v1/` with proper REST verb mapping. The blog supports filtering by category, author, and tag through clean URLs like `/blog/categories/[slug]`. Admin routes are grouped under `/admin/` with consistent CRUD patterns. The guides system supports versioned paths (`/3.0.0/guides/[path]`) for serving documentation across framework releases.

### Views: Server-Rendered with HTMX

The view layer uses CFML templates with a main `layout.cfm` that handles page titles, meta tags, and content-specific rendering. Where dynamic interactivity is needed -- loading comments, filtering blog posts, toggling UI states -- the site uses HTMX rather than a JavaScript framework. This keeps the architecture simple: the server renders HTML fragments, and HTMX swaps them into the page without full reloads.

## Features Worth Studying

Several features in the codebase demonstrate patterns that go beyond what you'd find in a tutorial.

### Authentication and Session Management

User authentication supports registration with email verification, login with bcrypt password hashing, and a "Remember Me" system that stores hashed tokens with user-agent validation. If someone's token doesn't match their current browser fingerprint, the token is invalidated -- a practical defense against session theft.

Sessions are configured with a 2-hour timeout and a 30-minute idle logout, with session storage backed by CockroachDB so that sessions persist across container restarts and are shared across all Swarm replicas. The `onRequestStart` event handler checks for idle timeouts and validates remember-me tokens on every request.

### Role-Based Access Control

The permission system uses a `User -> Role -> Permission` hierarchy. Controllers check access through methods like `checkAdminAccess()` and `checkRoleAccess()`, gating entire controller actions based on the authenticated user's role. The admin namespace uses before-filters to enforce this consistently.

### Blog Content Workflow

Blog posts follow a multi-status lifecycle: Draft, Pending Approval, Approved, and Rejected. Authors create and submit posts; administrators moderate them through the admin dashboard with bulk actions. Comments have their own moderation queue. Reading history and bookmarks are tracked per user. The system generates XML sitemaps and RSS-compatible comment feeds.

### Caching Strategy

The site uses a 10-minute RAM cache for frequently accessed queries and a dedicated cache for contributor data that's expensive to fetch from external sources. This caching layer is configured in `config/app.cfm` and works transparently with the ORM.

## How the Site is Deployed

The deployment pipeline is triggered by any push to the `main` branch of the wheels.dev repository. Here's what happens.

### Building the Container

A GitHub Actions workflow runs on a standard Ubuntu runner. It generates an environment file from encrypted GitHub Secrets -- connection details for the CockroachDB cluster, SMTP credentials for Postmark (transactional email), a Sentry DSN for error tracking, an ID salt for obfuscating database identifiers in URLs, and admin passwords.

The workflow installs CommandBox (a CFML build tool and dependency manager), runs `box install` to pull all dependencies including the Wheels core framework, and builds a Docker image. The Dockerfile starts from `ortussolutions/commandbox:lucee6`, adds a PostgreSQL JDBC driver, copies in the application code and a production-tuned `server.json`, and disables the browser auto-launch that CommandBox includes for local development.

The image is tagged with both `:latest` and the Git commit SHA, then pushed to GitHub Container Registry.

### Deploying to the Swarm

A self-hosted GitHub Actions runner inside the Docker Swarm cluster picks up the deployment job. It authenticates with the container registry and runs `docker stack deploy`, which reconciles the running state with the desired state defined in `docker-compose.yml`.

The stack deploys **three replicas** of the application. Rolling updates proceed one container at a time with a 15-second delay, using a start-first strategy -- the new replica must be running and healthy before the old one is removed. Rollbacks follow the same one-at-a-time pattern with a 10-second delay.

Each replica gets up to 2 CPUs and 4 GB of memory, with the JVM tuned to a 2 GB minimum and 3 GB maximum heap. A Traefik reverse proxy handles load balancing and routing based on the `Host` header. Because sessions are stored in CockroachDB with clustering enabled, any replica can serve any request -- there's no need for sticky sessions or session affinity cookies.

### Shared Storage

One of the trickier aspects of running a stateful web application across multiple replicas is file storage. Uploaded images, file attachments, generated sitemaps, versioned documentation, and API JSON responses all need to be accessible from every replica.

The solution is CephFS-backed volumes mounted into each container at specific paths: `/app/public/images`, `/app/public/files`, `/app/public/sitemap`, `/app/docs/3.0.0/guides`, and `/app/public/json`. When a user uploads an image through replica 1, replicas 2 and 3 can serve it immediately.

A separate `/data` volume provides general application state storage that persists across deployments.

### The Warmup Sequence

This is one of the most important parts of the deployment, and it's easy to overlook. CFML applications running on the JVM suffer from cold-start latency -- the first request to any template triggers compilation, class loading, and JIT warm-up. In a user-facing application, that first request could take several seconds.

The `server.json` configuration includes a warmup directive that fires immediately after the server starts, before it begins accepting external traffic:

```
/index.cfm, /blog, /blog/list, /blog/Categories, /guides,
/3.0.0/guides, /api, /api/3.0.0/, /docs, /community,
/news, /downloads, /login
```

These 13 URLs are hit sequentially with a 5-minute timeout window using a queued request strategy. By the time the replica joins the Swarm's load balancer rotation, every major route has been compiled, the template cache is warm, database connection pools are established, and the JVM has had a chance to JIT-compile the hot paths.

The result: users never hit a cold replica.

### The Network Edge

External traffic reaches the application through a Cloudflare tunnel, which handles TLS termination, DDoS protection, and edge caching. Inside the Swarm, Traefik routes requests to the three replicas over an overlay network. A middleware rule redirects `www.wheels.dev` to the apex `wheels.dev` domain.

## What Makes It a "Model" Application

The term "model application" means something specific here. It's not just that wheels.dev runs on Wheels -- it's that every architectural decision in the codebase represents a recommended pattern.

The controller namespacing (`web`, `admin`, `api`) shows how to organize a growing application. The base controller demonstrates cross-cutting concerns like authentication and CSRF protection. The model layer shows associations, validations, and soft deletes working together in a real schema. The routing configuration demonstrates RESTful conventions, versioned API paths, and clean URL patterns. The migration files show incremental schema evolution.

The deployment configuration shows how a Wheels application transitions from development to production: environment-specific config overrides, container-based deployment, session clustering, shared storage, and zero-downtime updates.

It's the complete picture -- not a tutorial, not a toy, but a running application that developers can study, fork, and learn from.

## Get Involved

The wheels.dev source is public. Browse the code, open issues, suggest improvements, or use it as a reference for your own Wheels 3.0 projects. The repository includes a `CLAUDE.md` with AI-assisted development guidance and a comprehensive README to help you get oriented.

If the best documentation is working code, then wheels.dev is the best Wheels 3.0 documentation we could write. 
                                </div>
                            </div>

                            <div class="d-flex gap-2 justify-content-between align-items-center">
                                <p class="fs-16 truncate fw-medium text--lightGray">March 05, 2026 by Peter Amiri</p>
                                <a href="/blog/wheels-dev-goes-public-a-production-wheels-3-0-application-you-can-actually-study"><button class="bg--primary text-nowrap fs-16 text-white rounded-2 px-3 py-1">Learn more</button></a>
                            </div>
                    </div>
                
                    <div class="p-4 bg-white rounded-5 shadow-sm swiper-slide">
                        
                            <div>
                                <p class="fs-18 mb-3 text--secondary/70 fw-bold line-clamp-1">Behind the Scenes: How a Single Commit Becomes a Running Application Across 40+ Configurations</p>
                                <div class="fs-16 mb-3 text--lightGray line-clamp-2">
                                    When a developer opens a pull request against the Wheels framework, it kicks off one of the most comprehensive CI/CD pipelines you'll find in any open-source project. Whether you're a first-time contributor fixing a typo or a core maintainer shipping a new feature, the moment your PR hits the `develop` branch, the same gauntlet runs: dozens of engine and database combinations are tested, four distinct packages are built and published to a package registry, documentation is synced, container images are built, and a production Docker Swarm deployment rolls out -- all without a single manual intervention.

You don't need commit access to trigger this. You just need a pull request.

This is the story of how that sausage gets made.

## The Scale of the Problem

Wheels is a Rails-inspired MVC framework for CFML (ColdFusion Markup Language). Unlike most frameworks that target a single runtime, Wheels supports **eight different server engines** -- Lucee 5, 6, and 7, Adobe ColdFusion 2018, 2021, 2023, and 2025, and the new BoxLang runtime. It also supports **six different databases**: MySQL, PostgreSQL, SQL Server, H2, Oracle, and SQLite.

That matrix creates over 40 unique test configurations. Every one of them runs on every commit to the development branch. There are no shortcuts.

## Stage 1: The Test Matrix

When a commit lands on the `develop` branch, GitHub Actions fires the `snapshot.yml` workflow, which immediately calls a reusable `tests.yml` workflow. This is where things get interesting.

The test matrix spins up parallel jobs for each valid engine-and-database combination. Some pairs are excluded -- Adobe 2018 doesn't support SQLite, for example -- but the remaining combinations all run simultaneously. Each job follows the same sequence:

1. **Start the CFML engine container** on a dedicated port (Lucee 5 gets port 60005, Adobe 2023 gets 62023, and so on)
2. **Start the database container** (except for embedded databases like H2 and SQLite)
3. **Wait for both services** with retry logic to handle cold-start delays
4. **Patch compatibility files** where needed -- Oracle on Adobe engines requires a serialization filter update
5. **Install engine-specific packages** via the CFML package manager
6. **Execute the full test suite** via HTTP, passing the database type as a parameter
7. **Capture and upload results** as JSON artifacts with detailed workflow logs

Each engine gets its own purpose-built Docker image. The Lucee images include H2, Oracle JDBC extensions, and SQLite drivers. The Adobe images handle their own package management quirks. BoxLang runs on its own runtime entirely. The test infrastructure treats each engine as a first-class citizen, not an afterthought.

If even one of those 40+ jobs fails, the pipeline stops. Nothing gets published until the entire matrix is green.

## Stage 2: Four Packages, One Pipeline

Once the test matrix passes, the release pipeline takes over. Wheels isn't distributed as a single monolithic package -- it's split into four distinct artifacts, each with its own purpose:

- **Wheels Core**: The framework engine itself -- routing, ORM, controllers, views, and the internal machinery
- **Wheels Base Template**: The application scaffold that developers start new projects from
- **Wheels CLI**: Command-line tooling for scaffolding, migrations, and development workflows
- **Wheels Starter App**: A ready-to-run example application for learning

Each package has its own preparation script that assembles the right files, replaces version placeholders (like `@build.version@` and `@build.number@`), and structures the output for publishing. The version string itself carries meaning: `3.0.0` is a stable release, `3.0.0-rc.1` is a release candidate, and `3.0.0-SNAPSHOT` marks bleeding-edge development builds. A build number suffix (e.g., `+1234`) tracks the exact CI run.

After preparation, each package goes through validation -- checking that `box.json` manifests parse correctly, file counts match expectations, and version strings are consistent. Only then does the pipeline authenticate with ForgeBox (the CFML package registry) and publish all four packages.

The pipeline also builds ZIP archives with MD5 and SHA512 checksums, uploading them as GitHub Actions artifacts and attaching them to GitHub Releases with auto-generated release notes pulled from the changelog.

## Stage 3: Documentation Sync

In parallel with package publishing, the pipeline syncs framework documentation to the community website. A dedicated `docs-sync.yml` workflow checks out both the framework repository and the website repository, then uses `rsync` to synchronize:

- **Guide content** (Markdown files) flows from the framework's `docs/src/` directory into the website's versioned guides path
- **Image assets** are copied additively so that old screenshots aren't accidentally removed
- **API documentation** (JSON) is synced to the website's public directory for the interactive API browser

If any files changed during the sync, the workflow commits and pushes to the website repository automatically. This triggers the next stage.

## Stage 4: Container Build

When the website repository receives a push to `main` -- whether from a documentation sync or a direct code change -- the `swarm-deploy.yml` workflow fires. This is where the application becomes a container.

The build job runs on a standard GitHub-hosted Ubuntu runner. It generates an environment file from GitHub Secrets containing database credentials, SMTP configuration for transactional email, a Sentry DSN for error tracking, and various application secrets. It installs CommandBox (the CFML build tool), pulls all dependencies, and builds a Docker image.

The base image is `ortussolutions/commandbox:lucee6`, which provides a Lucee 6 runtime managed by CommandBox. The Dockerfile layers on a PostgreSQL JDBC driver, copies the application code, and includes a production-tuned `server.json` that configures JVM heap sizes, connection pools, and the server warmup sequence.

The resulting image gets tagged twice -- once with `:latest` and once with the Git commit SHA for traceability -- then pushed to GitHub Container Registry (GHCR).

## Stage 5: Swarm Deployment

The final stage runs on a self-hosted GitHub Actions runner that lives inside the Docker Swarm cluster itself. This runner authenticates with GHCR, pulls the freshly-built image, and executes `docker stack deploy`.

The Swarm configuration deploys **three replicas** of the application behind a Traefik reverse proxy. Rolling updates proceed one replica at a time with a 15-second delay between each, using a start-first strategy -- meaning the new container must be healthy before the old one is removed. This ensures zero-downtime deployments.

Each replica is allocated up to 2 CPUs and 4 GB of memory, with reserved minimums of 0.25 CPUs and 1 GB to guarantee baseline performance. The JVM is tuned with a 2 GB minimum and 3 GB maximum heap, sized to fit comfortably within the container's memory limit.

Sessions are stored in the database with clustering enabled, so any replica can serve any request -- no sticky sessions required. Traefik handles load balancing and TLS termination, while a Cloudflare tunnel provides the public-facing edge with DDoS protection and global CDN caching.

Shared storage volumes backed by CephFS allow all three replicas to access the same uploaded images, file attachments, generated sitemaps, and documentation content. This is critical -- without shared storage, a file uploaded through one replica would be invisible to the others.

## The Full Picture

Here's what happens in the roughly 15-20 minutes between a developer pushing to `develop` and the changes being live:

```
git push origin develop
    |
    v
GitHub Actions: snapshot.yml
    |
    v
40+ parallel test jobs (8 engines x 6 databases)
    |
    v (all green)
    +---> Package 4 artifacts (core, base, cli, starter-app)
    +---> Validate and publish to ForgeBox
    +---> Upload to GitHub Releases with checksums
    +---> Sync documentation to wheels.dev repo
              |
              v
         wheels.dev repo receives push
              |
              v
         Build Docker image on ubuntu-latest
              |
              v
         Push to GitHub Container Registry
              |
              v
         Self-hosted runner deploys to Docker Swarm
              |
              v
         3 replicas with rolling updates
              |
              v
         Live at wheels.dev
```

## Why This Matters

For a framework that promises to run anywhere -- on any supported engine, against any supported database -- the CI/CD pipeline is the proof. It's not enough to claim compatibility; every commit verifies it across every combination.

The four-package distribution model means developers install only what they need. The automated documentation pipeline means the website is never stale. The container-based deployment with rolling updates means releases happen without anyone noticing downtime.

Is this level of orchestration overkill for an open-source CFML framework? Maybe. But for the developers who depend on Wheels in production, knowing that every commit survives a gauntlet of 40+ test configurations before it ever reaches them -- that's not overkill. That's trust. 
                                </div>
                            </div>

                            <div class="d-flex gap-2 justify-content-between align-items-center">
                                <p class="fs-16 truncate fw-medium text--lightGray">March 03, 2026 by Peter Amiri</p>
                                <a href="/blog/behind-the-scenes-how-a-single-commit-becomes-a-running-application-across-40-configurations"><button class="bg--primary text-nowrap fs-16 text-white rounded-2 px-3 py-1">Learn more</button></a>
                            </div>
                    </div>
                
                    <div class="p-4 bg-white rounded-5 shadow-sm swiper-slide">
                        
                            <div>
                                <p class="fs-18 mb-3 text--secondary/70 fw-bold line-clamp-1">Wheels CLI Environment Commands: set, show, merge, switch & validate</p>
                                <div class="fs-16 mb-3 text--lightGray line-clamp-2">
                                    # Introduction
In our previous deep dives, we explored how the Wheels CLI helps you inspect your application and validate configuration.

Now we’re focusing on something even more critical:
# Environment management.
Modern applications don’t run in just one mode. They operate across:
* development
* testing
* staging
* production
* maintenance
Managing these environments safely and consistently is essential — especially in Wheels 3.x.

This article explores five powerful environment-focused commands:
* wheels environment set
* wheels environment show
* wheels environment merge
* wheels environment switch
* wheels environment validate
These commands are about control, safety, and clarity.

Because in real-world development, environment mistakes are expensive.

# Why Environment Management Matters
Environment confusion causes real problems:
* Debug mode accidentally enabled in production
* Production database credentials used locally
* Caching disabled in staging
* Environment variables not loaded correctly
* CI/CD pipelines pointing to the wrong configuration
These mistakes aren’t code issues.

They’re environment issues.

The new environment commands in Wheels CLI are designed to prevent exactly that.

# wheels environment show
**See Your Active Environment Instantly**
`wheels environment show`

This command tells you:
* Which environment is currently active
* How it was detected
* Which configuration files are being loaded
* Relevant environment variables
No guessing.
No assumptions.

If something feels “off,” this is your first command.

**Why environment show Is Important**
You might think you're in staging. But are you really?
Running:

`wheels environment show`

Confirms it immediately.

This prevents:
* Accidental deployments
* Incorrect database connections
* Misaligned debugging settings
Clarity before action.

# wheels environment set
**Explicitly Define Your Environment**
`wheels environment set staging`

This command allows you to explicitly define the active environment.

Instead of relying only on system variables or automatic detection, you can directly control it.

**When to Use environment set**
* Preparing for deployment
* Testing production-like behavior locally
* Simulating staging configuration
* Overriding default detection temporarily
It gives you precision.

**Why It Matters**
Sometimes environment detection depends on:
* Server variables
* Hostnames
* System environment variables
* CI/CD configuration
If those aren’t set correctly, unexpected behavior occurs.

**environment set** eliminates uncertainty.

You choose the environment.

# wheels environment switch
**Seamlessly Move Between Environments**
`wheels environment switch production`

While **set** defines the environment, **switch** is optimized for fast transitions during development workflows.

Think of it as:
* Quick toggling between dev and staging
* Testing configuration differences
* Reproducing environment-specific bugs

**Real-World Scenario**
You discover a bug that only happens in production.

Instead of deploying blindly:

`wheels environment switch production`

Now your local app mirrors production behavior. You debug confidently. Then switch back:

`wheels environment switch development`

Fast. Controlled. Safe.

# wheels environment merge
**Combine Environment Configurations**
`wheels environment merge staging production`

The `merge` command allows you to merge configuration values from one environment into another.
This is powerful during:
* Preparing staging to match production
* Promoting tested configuration forward
* Synchronizing environment improvements

**Why environment merge Is Powerful**
Instead of manually copying configuration changes:
* It standardizes updates
* Reduces human error
* Ensures consistency
* Speeds up promotion workflows
This is especially useful in structured release processes.

Example Workflow
1. Test new config in staging
2. Validate everything works
3. Run:
 `wheels environment merge staging production`

Now production inherits the verified configuration.

Clean promotion.
Less risk.

# wheels environment validate
**Protect Against Environment Mistakes**
`wheels environment validate`

This command checks:
* Required environment variables exist
* Critical settings are properly defined
* Production safeguards are enabled
* No unsafe debug flags are active
* Database connections match expectations
Think of it as an environment safety audit.

**When to Use environment validate**
Before Deployment
Always run:

`wheels environment validate`

Especially before production deployments.
It can prevent:
* Debug mode in production
* Missing secret keys
* Incorrect datasource names
* Disabled caching

**During CI/CD Pipelines**
Add it to your automated workflow.

If validation fails, deployment stops.

That’s modern DevOps discipline.

# How These Commands Work Together
Here’s a safe environment workflow:

Step 1 – Confirm Current Environment
`wheels environment show`

Step 2 – Switch if Necessary
`wheels environment switch staging`

Step 3 – Validate Configuration
`wheels environment validate`

Step 4 – Merge Approved Changes
`wheels environment merge staging production`

Step 5 – Explicitly Set for Deployment
`wheels environment set production`

This structured approach prevents environment chaos.

# The Bigger Evolution of Wheels CLI
Earlier CLI generations focused heavily on:
* Generating models
* Creating controllers
* Scaffolding applications
Wheels 3.x is evolving beyond scaffolding.

It now emphasizes:
* Observability
* Configuration management
* Environment safety
* Deployment confidence
Modern development isn’t just about writing code.

It’s about managing complexity.

And environments are a major source of that complexity.

These commands bring order to it.

# What This Means for Wheels Developers
With **set**, **show**, **merge**, **switch**, and **validate**, you gain:
* Explicit environment control
* Faster debugging
* Safer deployments
* Cleaner promotion workflows
* Reduced configuration drift
* Stronger team collaboration

Environment mistakes are subtle — but costly.

These commands dramatically reduce that risk.

# Conclusion
The new environment commands in Wheels CLI 3.x transform how you manage application modes.
* environment show gives clarity
* environment set gives control
* environment switch gives speed
* environment merge gives consistency
* environment validate gives safety
If earlier CLI commands helped you build faster…

And inspection commands helped you debug smarter…

These environment tools help you deploy safer.

And in modern software development, safe environments mean stable applications.

Stay tuned — more deep dives into Wheels CLI are coming.
 
                                </div>
                            </div>

                            <div class="d-flex gap-2 justify-content-between align-items-center">
                                <p class="fs-16 truncate fw-medium text--lightGray">March 02, 2026 by Zain Ul Abideen</p>
                                <a href="/blog/wheels-cli-environment-commands-set-show-merge-switch-validate"><button class="bg--primary text-nowrap fs-16 text-white rounded-2 px-3 py-1">Learn more</button></a>
                            </div>
                    </div>
                
                    <div class="p-4 bg-white rounded-5 shadow-sm swiper-slide">
                        
                            <div>
                                <p class="fs-18 mb-3 text--secondary/70 fw-bold line-clamp-1">Wheels CLI Config Commands: check, diff & dump</p>
                                <div class="fs-16 mb-3 text--lightGray line-clamp-2">
                                    # Introduction
In our previous article, Wheels CLI Essentials: Inspect Your App with about & get Commands, we explored how Wheels 3.x helps you understand your application's runtime state. Those commands focused on visibility.

Now we go one layer deeper.

This article introduces three powerful configuration-focused commands:
* wheels config check
* wheels config diff
* wheels config dump
These commands are not about what is running. They’re about how your configuration is structured, validated, and compared. If **about** and **get** gave you awareness, these commands give you control.

# Why Configuration Commands Matter
In modern applications, configuration complexity grows quickly:
* Multiple environments
* Default framework settings
* Custom overrides
* Team-specific environment variables
* CI/CD configuration differences
* Production hotfixes

Over time, small configuration mismatches can cause major issues:
* “It works on my machine.”
* Staging behaves differently from production.
* A default value overrides a custom setting.
* A config file was edited but not deployed.
The new config commands are built to prevent exactly these problems.

They give you validation, comparison, and export tools — directly from the CLI.

# wheels config check
**Validate Your Configuration with Confidence**
`wheels config check`

The **check** command validates your configuration setup and ensures:
* Required settings exist
* No invalid configuration keys are present
* Environment files are structured correctly
* Overrides are applied properly
* No conflicting definitions exist
Think of it as a configuration health check.

**When to Use config check**
Before Deployment:
Run it before pushing to staging or production:
`wheels config check`

This ensures:
* No missing environment settings
* No accidental debug flags
* No incomplete overrides
It acts like a pre-flight checklist.

After Updating Configuration:
Changed a config file? Added a new environment variable?
Run:
`wheels config check`
It confirms everything is wired correctly.

Why config check Is Powerful:
* Prevents runtime configuration errors
* Catches typos in setting names
* Validates environment consistency
* Encourages safe deployment practices
Instead of discovering configuration errors in production…
You catch them instantly.

# wheels config diff
**Compare Configuration Across Environments**
`wheels config diff development production`

The diff command compares configuration values between environments.
It shows:
* What differs
* What exists in one environment but not another
* What values are overridden
This is extremely valuable in multi-environment workflows.

**Why config diff Matters**
Environment mismatches are one of the most common causes of bugs.
Examples:
* Caching enabled in production but not staging
* Different datasource names
* Different mail server settings
* Logging levels not aligned
Instead of manually comparing config files, run:
`wheels config diff staging production`

You instantly see differences in a clean, structured output.

**Real-World Scenario**
You deploy to production. Something behaves differently from staging.
Instead of guessing:

`wheels config diff staging production`

Now you know:
* Exactly what changed
* Whether a setting was missed
* Whether a production override is affecting behavior
This command alone can save hours of manual inspection.

**Why config diff Is Essential**
* Eliminates manual file comparisons
* Prevents environment drift
* Improves team collaboration
* Simplifies debugging
In larger teams, configuration drift is inevitable. This command keeps environments aligned.

# wheels config dump
Export Your Full Configuration Snapshot
`wheels config dump`

The **dump** command outputs your complete resolved configuration.
It includes:
* Default framework settings
* Application-level overrides
* Environment-specific settings
* Fully merged configuration values
Think of it as a raw configuration export.

**When to Use config dump**
Auditing:
Need to see everything at once?
`wheels config dump`

You get a complete configuration snapshot.

**Debugging Complex Overrides**
Sometimes a setting comes from:
* Framework defaults
* settings.cfm
* Environment-specific files
* System environment variables
Instead of tracing multiple layers manually, dump shows the final resolved result.

**Sharing Configuration Safely**
When collaborating with teammates, you can:
* Dump configuration
* Review it together
* Identify unexpected overrides
It creates transparency.

**Why config dump Is Valuable**
Full visibility into final configuration state
* Simplifies advanced debugging
* Helps audit production setups
* Encourages configuration discipline
It removes ambiguity.

# How These Commands Work Together
Here’s a practical workflow:

**Step 1 – Validate**
`wheels config check`

Ensure configuration structure is correct.

**Step 2 – Compare**
`wheels config diff staging production`

Identify environment differences.

**Step 3 – Export Snapshot**
`wheels config dump`

Review the full resolved configuration.
Together, they form a powerful configuration management toolkit.

# The Bigger Shift in CLI Philosophy
Earlier versions of CLI tools focused primarily on:
* Generating controllers
* Creating models
* Scaffolding applications
Wheels 3.x is expanding beyond scaffolding.

It’s becoming:
* A configuration validator
* An environment consistency enforcer
* A debugging assistant
* A deployment safety layer
This shift reflects modern development needs. Applications today are not just code. They are configuration-driven systems. And configuration must be inspectable, verifiable, and comparable.

# What This Means for Wheels Developers
With config check, config diff, and config dump, you gain:
* Safer deployments
* Fewer environmental surprises
* Faster debugging cycles
* Better team collaboration
* Stronger production confidence
These are not flashy commands. They don’t generate files. They don’t create scaffolds.

But they solve real-world development problems — the kind that cost time, trust, and production stability.

# Conclusion
The new configuration commands in Wheels CLI 3.x are small additions — but major upgrades to your workflow.
* **wheels config check** protects you from configuration mistakes
* **wheels config diff** prevents environment drift
* **wheels config dump** gives you full transparency

If previous CLI commands helped you build faster…
These help you deploy more safely. And in modern software development, safe deployments are everything.
Stay tuned — the next deep dive into Wheels CLI is coming.

Learn more here: https://youtu.be/6RJWe3RQp1Q 
                                </div>
                            </div>

                            <div class="d-flex gap-2 justify-content-between align-items-center">
                                <p class="fs-16 truncate fw-medium text--lightGray">February 26, 2026 by Zain Ul Abideen</p>
                                <a href="/blog/wheels-cli-config-commands-check-diff-dump"><button class="bg--primary text-nowrap fs-16 text-white rounded-2 px-3 py-1">Learn more</button></a>
                            </div>
                    </div>
                
                    <div class="p-4 bg-white rounded-5 shadow-sm swiper-slide">
                        
                            <div>
                                <p class="fs-18 mb-3 text--secondary/70 fw-bold line-clamp-1">Wheels CLI Essentials: Inspect Your App with about & get Commands</p>
                                <div class="fs-16 mb-3 text--lightGray line-clamp-2">
                                    # Introduction
In our previous article, [Wheels CLI: Modern Commands for Faster, Smarter Wheels 3.0 Development](https://wheels.dev/blog/wheels-cli-modern-commands-for-faster-smarter-wheels-3-0-development), we introduced the new generation of CLI capabilities coming to Wheels 3.x.

That article focused on the big picture — how the CLI is evolving beyond scaffolding into a complete development companion.

Now it’s time to zoom in.

This article explores three powerful inspection commands that help you understand your application’s current state instantly:
* wheels about
* wheels get environment
* wheels get settings
These commands are not about generating code. They’re about visibility, awareness, and confidence. When debugging, deploying, or supporting an application, knowing your environment and configuration matters just as much as writing good code.

# Why App Inspection Commands Matter
Modern development environments are rarely simple.
You may have:
* Multiple environments (development, staging, production)
* Different configuration overrides
* Environment-specific settings
* Multiple framework versions across projects
* Team members working on different machines
Without proper visibility, confusion happens quickly.

Questions like:
* “Which environment am I in?”
* “Is caching enabled here?”
* “Why is this behaving differently in staging?”
* “What version of Wheels is this app using?”

The new CLI inspection commands answer these instantly.
* No digging through files.
* No guessing.
* No assumptions.
Just clarity.

# wheels about
**Your Application’s Full Snapshot**
The about command provides a complete overview of your Wheels application.
`wheels about`

It displays:
* Wheels framework version
* CFML engine information
* Application name
* Current environment
* Configuration status
* Key runtime details
* Application statistics
Think of it as your application’s diagnostic summary.

**When to Use about**
Debugging Issues:
If something behaves unexpectedly, start with:
`wheels about`

You’ll quickly see:
* Whether you’re in the correct environment
* Which framework version is running
* Whether configuration values are being picked up properly

Support & Collaboration:
When helping a teammate, the first question often is:
“What version are you running?”
Instead of manually checking files, they can simply run:
`wheels about`

It standardizes the way teams share environment information.

Deployment Validation:
After deploying to staging or production, you can verify:
* Correct environment detection
* Correct configuration loading
* Framework version consistency
It’s a fast sanity check before declaring deployment success.

Why about Is Powerful:
* Reduces troubleshooting time
* Prevents environment confusion
* Makes support conversations easier
* Encourages environmental awareness

It’s your first command when something feels “off.”

# wheels get environment
**Know Exactly Where You Are**
Modern apps typically run in multiple environments:
* development
* testing
* staging
* production
* maintenance
The get environment command tells you exactly which one your app is currently using.
`wheels get environment`

**What It Shows**
* Active environment name
* How it was detected
* Where the configuration is coming from
This eliminates guesswork.
No more manually inspecting configuration files.

**Why This Is Important**
Environment mismatches are one of the most common causes of bugs.
For example:
* Caching enabled in staging but not locally
* Different database connections
* Different mail server settings
* Debug mode accidentally enabled in production

Instead of wondering, just run:
`wheels get environment`

Instant clarity.

**Real-World Scenario**
Imagine deploying to staging and noticing unexpected behavior.
You assume it’s running in staging.
But what if the environment variable wasn’t set correctly?
Running:
`wheels get environment`

Immediately confirms whether your assumption is correct.
This command alone can save hours of debugging.

# wheels get settings
**Inspect Your Active Configuration**
The get settings command shows the current Wheels application settings for your active environment.
`wheels get settings`

It displays:
* All active configuration values
* Default settings
* Custom overrides
* Environment-specific configurations
You can also filter for specific settings if needed.

**Why This Command Is Critical**
Configuration issues are subtle. Sometimes:
* A setting exists in one environment but not another
* A default value is overriding a custom one
* A configuration file isn’t being loaded as expected
Instead of manually opening multiple config files, this command aggregates everything into one clear output.

**Practical Use Cases**
Troubleshooting:
If something related to caching, sessions, or routing behaves differently:
`wheels get settings`

You’ll immediately see:
* What’s enabled
* What’s disabled
* What values are active

Configuration Validation:
Before going live:
* Confirm debugging is disabled
* Confirm production caching is enabled
* Confirm mail settings are correct
* Confirm custom overrides are loaded
This command provides verification without manual inspection.

The Bigger Picture:
These commands represent an important shift in the CLI philosophy.
Older CLI commands focused on generating files.
These new commands focus on observability and awareness.

They help you:
* Understand your app
* Validate your configuration
* Debug faster
* Avoid environment confusion
* Collaborate more efficiently
In modern development, visibility is productivity.

# How These Commands Work Together
Here’s a practical workflow:

**Step 1 – Confirm Environment**
`wheels get environment`

Make sure you're in the expected environment.

**Step 2 – Inspect Configuration**
`wheels get settings`

Verify important configuration values.

**Step 3 – Full Diagnostic Overview**
`wheels about`

Review the full application snapshot. Together, they provide a complete picture of your application’s runtime state.

# What This Means for Wheels Developers
With these inspection tools, Wheels CLI is evolving into more than just a scaffolding tool. It’s becoming:
* A diagnostic assistant
* A configuration validator
* An environment inspector
* A debugging companion

And this is just the beginning.

In upcoming articles, we’ll continue exploring:
* Environment management tools
* Database utilities
* Testing automation commands
* Asset workflows
* Documentation generation
* Advanced plugin tooling

Each module builds toward one goal:
* More control.
* More clarity.
* More confidence.

# Conclusion
The new inspection commands in Wheels CLI 3.x are small in size — but huge in impact.
* wheels about gives you a full application snapshot
* wheels get environment removes environment guesswork.
* wheels get settings exposes active configuration instantly.

If earlier CLI commands helped you build faster…
These help you debug smarter.

And in modern development, smart debugging is just as important as fast coding.

Stay tuned — the next deep dive is coming.

Learn more here: https://www.youtube.com/watch?v=NHx3-wncyFw 
                                </div>
                            </div>

                            <div class="d-flex gap-2 justify-content-between align-items-center">
                                <p class="fs-16 truncate fw-medium text--lightGray">February 23, 2026 by Zain Ul Abideen</p>
                                <a href="/blog/wheels-cli-essentials-inspect-your-app-with-about-get-commands"><button class="bg--primary text-nowrap fs-16 text-white rounded-2 px-3 py-1">Learn more</button></a>
                            </div>
                    </div>
                
            </div>
        </div>
    </div>


    <!-- welcome community -->
    
    <div class="container py-5 mt-5">
        <div class="row align-items-center gy-5">
            <div class="col-lg-12 space-y-3 text-center col-12">
                <p class="fs-60 line-height-70 fw-bold">Welcome to Our Community</p>
                <p class="fs-18 fw-medium text-center position-relative">
                    Welcome to Our Community - a place where like-minded people connect, share ideas, <br> and grow
                    together in a positive and supportive environment.
                </p>
                <a href="/community" class="bg--primary d-block w-max mx-auto fs-16 px-3 py-2 rounded-18 text-white">
                    <span>Explore community</span>
                </a>
            </div>
            <div class="text-center col-12">
                    <img src="/img/community.png" class="img-fluid" alt="Wheels.dev Community">
            </div>
        </div>
    </div>
    
    <!-- Cookie Consent Banner -->
    <div id="cookie-banner" class="cookie-banner">
        <button id="close-cookie-banner" aria-label="Dismiss" class="fs-14" style="position: absolute; top: 4px; right: 8px; border: none; background: transparent; font-size: 18px; cursor: pointer;">
            &times;
        </button>
        <p class="mt-2" style="line-height: 1.4;">
            This website uses essential cookies to improve your experience. By continuing to use the site, you consent to the use of cookies.
        </p>
        <div style="text-align: right;">
            <button id="accept-cookies" class="fs-14 fw-semibold bg--success px-2 py-1 rounded-2 text--secondary">Accept Necessary</button>
        </div>
    </div>
    
    <!-- Testimonials -->
    
    
    


    

    <!-- Top contribute -->
    
    <div  class="container mt-5 py-5">
        <div class="text-center">
            <p class="fs-60 mb-2 text--secondary line-height-70 fw-bold">
                Top Contributors
        </p>
        </div>
        
            <div class="swiper contributorsSwiper mt-5">
                <div class="swiper-wrapper">
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Per Djurner</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Per Djurner is a long-time core contributor and leader of the Wheels framework, with a history of shaping its direction since the project’s early days. He made the very first commit and has continued to contribute regularly, fixing important bugs, refining SQL handling, and enhancing model methods with more flexible options. In addition to code, he has improved documentation, templates, and overall project stability, ensuring Wheels remains reliable and developer-friendly. His work reflects both technical expertise and long-term commitment to the growth of the framework.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/perdjurner" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/160595?v=4" class="rounded-5 contributor-img" alt="Per Djurner profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Peter Amiri</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer and Project Manager 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Peter Amiri is a senior developer and community leader who has taken on a core team / maintainer role in the Wheels framework. He has decades of experience with ColdFusion (since version 1.5), including work in user-groups, large scale sites, and infrastructure. Since returning to the project, he’s helped revitalize it — organizing roadmap discussions, guiding structure changes, supervising modernization (including CLI improvements, package modularization, and updating workflows), and helping re-energize community contributions.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/peteramiri" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/180555?v=4" class="rounded-5 contributor-img" alt="Peter Amiri profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Zain Ul Abideen</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Zain Ul Abideen is an active contributor to the Wheels framework, playing a key role in improving its stability and usability. His work includes fixing issues like invalid columns not throwing exceptions, ensuring primary keys return correctly as numeric, and refining logic around calculated properties. He also enhanced view helpers to better handle active states and improved default routing behavior. Through these contributions, Zain has strengthened both the framework’s reliability and developer experience.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/zain4bjs" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/115699497?v=4" class="rounded-5 contributor-img" alt="Zain Ul Abideen profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Anthony Petruzzi</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Anthony Petruzzi has made valuable contributions to the Wheels through code improvements, bug fixes, and collaborative reviews. They’ve helped refine core components, enhanced framework stability, and actively participated in issue discussions to steer design decisions. Their efforts in writing clear, maintainable code and offering constructive feedback in pull requests have strengthened the project’s code quality. Overall, Anthony Petruzzi involvement showcases dedication to open-source collaboration and meaningful impact on the Wheels ecosystem.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/anthony-petruzzi/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/23683?v=4" class="rounded-5 contributor-img" alt="Anthony Petruzzi profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Tom King</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer and Maintainer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Tom King is one of the core maintainers of Wheels, with deep involvement in both development and leadership. He oversaw major releases, such as Wheels 2.0, which introduced features like RESTful routing, database migrations, improved CLI support, and a rewritten core in CFScript. 
 He also helps steer the project’s long-term direction — writing blog posts reflecting on its history (e.g. noting its first commits, celebrating milestones) and working to modernize both tooling and community engagement.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/tomkingoxford" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/381268?v=4" class="rounded-5 contributor-img" alt="Tom King profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Adam Chapman</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Adam Chapman has been a dedicated and influential contributor to the Wheels ecosystem. He joined the core team after years of community support, helping to steer architectural evolution and plugin integrations. Beyond code, he’s actively engaged in issue triage, proposing enhancements and shaping long-term design direction. His commitment to both community discussion and technical contributions has strengthened the project’s cohesion and future readiness.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/%F0%9F%87%A6%F0%9F%87%BAadam-chapman-81717736" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/1092563?v=4" class="rounded-5 contributor-img" alt="Adam Chapman profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">James</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            James has brought forward meaningful contributions to the Wheels through consistent code enhancements, test case development, and active engagement in issue resolution. He frequently submits detailed pull requests, helping to bolster the framework’s robustness and maintainability. Beyond code, James participates in discussion threads and reviews, offering thoughtful feedback which helps keep the project aligned with community needs. His steady involvement has strengthened both core modules and auxiliary features, making Wheels more reliable and polished for all users.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/29158?v=4" class="rounded-5 contributor-img" alt="James profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Andrew Bellenie</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer and Maintainer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Andrew Bellenie has played a pivotal role in the Wheels ecosystem, as a long-standing core team member and active community contributor. He brings deep experience in CFML development and framework architecture. Andy has contributed code, design feedback, documentation, and mentorship to newcomers. He also helps triage issues, guide feature direction, and maintain the project’s stability. His dedication helps keep the framework evolving and its community engaged.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/147703?v=4" class="rounded-5 contributor-img" alt="Andrew Bellenie profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">scahyono</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            scahyono has contributed thoughtful enhancements to the Wheels codebase, particularly in ensuring compatibility with Oracle setups. Notably, they worked on a module (or plugin) to allow ColdFusion on Wheels to correctly read table metadata across Oracle remote database links, which broadens database support and resilience. Their willingness to tackle specialized integration challenges strengthens the framework’s versatility and helps more users adopt Wheels in diverse environments.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/2072698?v=4" class="rounded-5 contributor-img" alt="scahyono profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">MvdO79</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            MvdO79 has shown his support for the Wheels not only through code but also as a financial backer. He contributes monthly via Open Collective, helping sustain the framework’s ongoing development. Beyond funding, his presence in issue discussions demonstrates engagement with bug tracking and community feedback. His dual role-as supporter and participant-reinforces the open-source spirit behind Wheels.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/marcovdoever/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/14022664?v=4" class="rounded-5 contributor-img" alt="MvdO79 profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Raul Riera</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Raúl Riera has been an enthusiastic supporter and contributor to the Wheels community-beyond writing code, he’s helped through design, advocacy, and community engagement. He has designed swag such as T-shirts for Wheels events and promoted the framework through his dev shop, Hipervínculo. As a software entrepreneur (founder of Odonto.me) and developer, Raúl bridges technical and community roles, helping raise awareness of Wheels and adding a touch of creativity and outreach to the project’s ecosystem.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/rieraraul" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/24159?v=4" class="rounded-5 contributor-img" alt="Raul Riera profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Michael Diederich</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Michael Diederich has contributed key fixes and enhancements to the Wheels, particularly around framework usability and interface issues. Notably, he addressed documentation and UI elements-changes such as showing the current Git branch in the debug layout in version 2.5.0 reflect his involvement. In earlier releases, he also fixed bugs (for example with form and URL handling in the startFormTag() and array routing) that improved reliability across use cases. His contributions help refine both developer-facing tools and core correctness.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/michael-diederich-a188932a3/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/15325153?v=4" class="rounded-5 contributor-img" alt="Michael Diederich profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Rob Cameron</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Rob Cameron had the original idea for CFWheels (and by extension, the foundation for Wheels), having built the framework with inspiration from Ruby on Rails in 2005. Though he eventually moved on from active core development to focus on other projects (such as Rails work), his early design and architectural direction still underpin much of the project's structure and philosophy.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/rob-cameron-924a852/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/300?v=4" class="rounded-5 contributor-img" alt="Rob Cameron profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Chris Peters</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Chris Peters has been foundational in the development, documentation, and promotion of the Wheels framework since its early days. He authored many of the earliest releases, oversaw version 1.3.0 that introduced HTML5 enhancements, table less models, and thread-safe startup, and managed releases like 1.0.5 with dozens of bug fixes and stability updates. He also wrote technical blog posts about core features (flash messages, asset query strings, error handling) and established guidelines for contributing and documentation, helping to build a strong community around the framework.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/chrisdpeters/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/159187?v=4" class="rounded-5 contributor-img" alt="Chris Peters profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">David Paul Belanger</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            David Paul Belanger has been a core force behind the Wheels, contributing both technically and strategically across many versions. He has co-authored features and bug fixes (such as updates to sendFile() and usesLayout()) in the 2.x releases. Beyond code, David has helped lead the transition of the framework’s governance and been active in community outreach-having participated in CF-Alive podcasts and collaborated with Tom King and others on guiding the project’s future direction.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/davidpbelanger/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/7602820?v=4" class="rounded-5 contributor-img" alt="David Paul Belanger profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">John Bampton</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer and Documentation Writer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            John Bampton made his mark as a contributor to the Wheels project beginning with version 2.4.0, where he helped fix broken links in documentation and correct spelling errors in the README and core templates. His attention to detail improved the documentation clarity and usability for future developers. Though he is noted as a “new contributor,” his work helped plug small but important gaps in the project’s written material, aiding the framework’s polish and accessibility.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/418747?v=4" class="rounded-5 contributor-img" alt="John Bampton profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Simon</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Simon contributed to the Wheels framework by refining code and improving framework functionality. His work helped address issues and enhance stability, making the project more reliable and easier for developers to use. These contributions support the continued growth and effectiveness of the Wheels ecosystem.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/341236?v=4" class="rounded-5 contributor-img" alt="Simon profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Brian Ramsey</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer and Quality Assurance Engineer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Brian Ramsey has been a long-time contributor and advocate within the Wheels community. His work spans both code contributions and knowledge sharing, with a focus on improving framework usability for everyday developers. Brian has participated in bug resolution, tested new releases, and provided feedback that shaped core improvements. Beyond code, he’s been active in community discussions, answering questions, and guiding newer users. His steady involvement has helped ensure Wheels remains both developer-friendly and reliable, reflecting his commitment to open-source collaboration and practical problem solving.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/ramseybrian/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/16235510?v=4" class="rounded-5 contributor-img" alt="Brian Ramsey profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Danny Beard</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Danny Beard has contributed to the Wheels framework through targeted code enhancements and thoughtful participation in issue discussions. His work has included fixing bugs, refining logic in core functions, and improving overall framework consistency. Danny’s involvement reflects an eye for detail and a practical approach to problem-solving, ensuring the framework remains dependable in real-world applications. Beyond code, his willingness to collaborate with other contributors has reinforced the community-driven nature of Wheels, helping maintain a strong and sustainable open-source project.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/155413?v=4" class="rounded-5 contributor-img" alt="Danny Beard profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Reuben Brown</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Reuben Brown has been a valuable contributor to the Wheels framework, offering code improvements and community input that strengthen the project’s overall quality. His work includes bug fixes and refinements that enhance stability and usability, ensuring developers can rely on Wheels in production environments. Reuben’s involvement extends beyond code, as he has taken part in discussions, reviewed issues, and provided practical feedback to guide development. His contributions reflect a thoughtful balance of technical skill and collaborative spirit, reinforcing the open-source ethos of the Wheels project.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/reubenbrown/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/320170?v=4" class="rounded-5 contributor-img" alt="Reuben Brown profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Seb</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Seb has provided important contributions to the Wheels that help improve framework robustness and usability. Through resolving issues, submitting pull requests, and polishing code, Seb has helped close gaps and make the system smoother for both new and experienced users. They’ve also participated in reviews, giving constructive feedback, which strengthens code quality and consistency across releases. Seb’s steady involvement supports the project’s open-source mission, making Wheels more reliable, maintainable, and welcoming for all contributors.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/sebfct/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/2982335?v=4" class="rounded-5 contributor-img" alt="Seb profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">timbadolato</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Timbadolato has contributed to the Wheels with a focus on improving functionality, fixing issues, and enhancing developer experience. His pull requests demonstrate a clear attention to detail, addressing edge cases and refining framework behavior to make it more predictable and reliable. By engaging in code reviews and community discussions, timbadolato has helped shape technical decisions and ensured smoother adoption for users. His contributions highlight a practical, solution-oriented approach that supports both the long-term stability and growth of the Wheels ecosystem.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/timbadolato/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/52912?v=4" class="rounded-5 contributor-img" alt="timbadolato profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Alex</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Alex has played a supportive and constructive role in the Wheels, contributing code improvements and feedback that strengthen the framework’s overall reliability. His efforts include bug fixes, refinements to core features, and helpful participation in discussions that guide project direction. By addressing issues and proposing practical solutions, Alex has contributed to making Wheels easier to use and more stable for developers. His involvement reflects a collaborative spirit and reinforces the open-source values that keep the project moving forward.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/alex-ni-529455142/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/12097569?v=4" class="rounded-5 contributor-img" alt="Alex profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Chris Geirman</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Chris Geirman made contributions to the Wheels that helped refine parts of the codebase and improve developer experience. While his involvement was smaller in scope, his participation still added value to the framework and reflects the spirit of open-source collaboration.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/geirman/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/1640318?v=4" class="rounded-5 contributor-img" alt="Chris Geirman profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Zac Spitzer</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Zac Spitzer provided contributions to the Wheels that helped address specific issues and improve framework stability. Though his involvement was brief, his work added value to the codebase and demonstrated the importance of community participation in strengthening and maintaining open-source projects.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/zspitzer/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/426404?v=4" class="rounded-5 contributor-img" alt="Zac Spitzer profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Nikolaj Frey</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Nikolaj Frey has made contributions to the Wheels framework that supported improvements in the project’s codebase and functionality. While his involvement was limited in scope, his participation still added meaningful value, reinforcing the collaborative nature of the open-source community that drives Wheels forward.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/nikolajfrey/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/83561452?v=4" class="rounded-5 contributor-img" alt="Nikolaj Frey profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Gralen</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Gralen contributed improvements to the Wheels framework that enhanced code quality and supported overall stability. Their work helped refine the project and contributed to making the framework more reliable for developers using it in real-world applications.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/2494246?v=4" class="rounded-5 contributor-img" alt="Gralen profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Doug McCaughan</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Doug McCaughan contributed to the Wheels framework by helping refine functionality and addressing issues that improved developer experience. His efforts supported the stability of the project and ensured smoother use of core features. Through his work, Doug added value to the framework’s ongoing development and its open-source community.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/juggler/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/5955?v=4" class="rounded-5 contributor-img" alt="Doug McCaughan profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Coleman Sperando</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Coleman Sperando contributed to the Wheels framework by making improvements that strengthened its functionality and reliability. His work addressed specific areas of the codebase, helping to refine features and ensure a smoother experience for developers. These contributions supported the project’s ongoing growth and the collaborative effort behind Wheels.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/33202952?v=4" class="rounded-5 contributor-img" alt="Coleman Sperando profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Charlie Arehart</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Charlie Arehart has supported the Wheels framework through his deep expertise in ColdFusion and the broader CFML ecosystem. He has provided valuable feedback, shared knowledge with the community, and highlighted best practices that strengthen adoption and reliability. His involvement helps connect Wheels development with the wider ColdFusion community, ensuring the framework remains relevant and accessible to developers.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/carehart/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/389746?v=4" class="rounded-5 contributor-img" alt="Charlie Arehart profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Charley Contreras</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Charley Contreras contributed to the Wheels framework by helping refine parts of the codebase and supporting improvements that enhance usability. His work added value to the project’s overall stability and reflects the collaborative effort of developers working together to keep the framework evolving and reliable.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/48992628?v=4" class="rounded-5 contributor-img" alt="Charley Contreras profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Brant Nielsen</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Brant Nielsen contributed to the Wheels framework by improving functionality and addressing issues that supported better performance and reliability. His work helped refine the codebase and enhance the developer experience, reinforcing the project’s commitment to building a stable and effective open-source framework.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/7863962?v=4" class="rounded-5 contributor-img" alt="Brant Nielsen profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Ben Nadel</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Ben Nadel is a veteran ColdFusion developer known for deep technical thought leadership and contributions to the community, including work around Wheels and related topics. He writes regularly about extending and customizing parts of Wheels (for example, customizing the router/proxy component behavior to suit specific workflow preferences). 
He also shares experiments and educational posts (e.g. integrating HTMX in ColdFusion apps) that help other developers understand modern patterns in CFML. 
While he may not always be contributing direct core framework commits, his influence shows up in how people use and adapt Wheels in real-world apps, and in sharing best practices, tutorials, and ideas that help shape how the framework is viewed and utilized.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/bennadel" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/563690?v=4" class="rounded-5 contributor-img" alt="Ben Nadel profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Andrei B.</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Andrei B. contributed to the Wheels framework by helping refine code and improve functionality in targeted areas of the project. His efforts supported greater stability and usability, making the framework more dependable for developers. These contributions reflect the collaborative spirit that drives the ongoing success of Wheels.
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/1703377?v=4" class="rounded-5 contributor-img" alt="Andrei B. profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Adam Larsen</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            Adam Larsen contributed to the Wheels framework by improving functionality and addressing issues that enhanced the stability and reliability of the codebase. His work helped refine features and ensure a smoother experience for developers, supporting the ongoing growth and maintenance of the project.
                                        </p>
                                    </div>
                                    
                                        <div class="mt-2">
                                            <a href="https://www.linkedin.com/in/adrox/" target="_blank" class="text-decoration-none me-3">
                                                <span class="fs-22 fw-medium">Linked </span><i class="bi bi-linkedin fs-24 text-primary"></i>
                                            </a>
                                            <!-- You can add more icons here -->
                                        </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/479607?v=4" class="rounded-5 contributor-img" alt="Adam Larsen profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Claude</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/81847?v=4" class="rounded-5 contributor-img" alt="Claude profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">github-actions[bot]</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/in/15368?v=4" class="rounded-5 contributor-img" alt="github-actions[bot] profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">mlibbe</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/17026613?v=4" class="rounded-5 contributor-img" alt="mlibbe profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Zain Ul Abideen</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/8832358?v=4" class="rounded-5 contributor-img" alt="Zain Ul Abideen profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                        <div class="swiper-slide overflow-hidden rounded-30">
                            <div class="p-5 bg-white overflow-hidden d-flex row">
                                <div class="col-lg-8 col-12 d-flex flex-column justify-content-between">
                                    <div>
                                        <p class="fs-36 fw-bold text--secondary">Zain Ul Abideen</p>
                                        <p class="fs-18 text--lightGray fw-medium">
                                            Contributed as a Software Developer 
                                        </p>
                                        <p class="col-lg-11 fs-16 pt-4 text--secondary fw-normal text-justify">
                                            
                                        </p>
                                    </div>
                                    
                                </div>
                                <div class="col-lg-4 col-12">
                                    <img src="https://avatars.githubusercontent.com/u/8832358?v=4" class="rounded-5 contributor-img" alt="Zain Ul Abideen profile picture"/>
                                </div>
                            </div>
                        </div>
                    
                </div>
            </div>
            <div class="swiper contributorsSwiperThumb mt-5">
                <div class="swiper-wrapper">
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/160595?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/180555?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/115699497?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/23683?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/381268?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/1092563?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/29158?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/147703?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/2072698?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/14022664?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/24159?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/15325153?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/300?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/159187?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/7602820?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/418747?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/341236?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/16235510?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/155413?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/320170?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/2982335?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/52912?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/12097569?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/1640318?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/426404?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/83561452?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/2494246?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/5955?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/33202952?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/389746?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/48992628?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/7863962?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/563690?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/1703377?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/479607?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/81847?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/in/15368?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/17026613?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/8832358?v=4"
                            />
                        </div>
                    
                        <div class="swiper-slide d-flex justify-content-center align-items-center">
                            <img
                                class="rounded-circle size-100"
                                src="https://avatars.githubusercontent.com/u/8832358?v=4"
                            />
                        </div>
                    
                </div>
                <div class="swiper-button-next contributors-swiper-button-next end-0"></div>
                <div class="swiper-button-prev contributors-swiper-button-prev start-0"></div>
            </div>
        
    </div>

    <!-- Testimonial Popup Modal -->
    
        <div class="modal fade" id="testimonialPromptModal" tabindex="-1" aria-labelledby="testimonialPromptModalLabel" aria-hidden="true">
            <div class="modal-dialog">
                <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title fw-bold fs-18 text--primary" id="testimonialPromptModalLabel">Share Your Experience!</h5>
                    <button type="button" class="btn-close text--primary" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <p class="mb-2">We'd love to hear about your experience! Would you take a moment to share a testimonial?</p>
                </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
                        <button type="button" class="btn bg--primary text-white" 
                        hx-get="/testimonial/new"
                        hx-target="main"
                        hx-trigger="click"
                        hx-swap="outerHTML" data-bs-dismiss="modal">Share Now</button>
                        
                    </div>
                </div>
            </div>
        </div>

        
    
</main>

    <script>
        function initUserTable() {
            if (window.jQuery && $.fn.DataTable) {
                if ($.fn.DataTable.isDataTable('#userTable')) {
                    $('#userTable').DataTable().destroy();
                }
                window.userTableInstance = $('#userTable').DataTable({
                    columnDefs: [
                        { targets: [6,7], orderable: false }
                    ]
                });
                window.userTableInstance.on('draw', function() {
                    if (window.htmx) htmx.process(document.body);
                });
            }
        }
        document.addEventListener('htmx:afterSwap', function(evt) {
            if (evt.target && evt.target.id === 'users-container') {
                initUserTable();
            }
        });
        document.addEventListener('DOMContentLoaded', function() {
            initUserTable();
        });
    </script>

    <style>
        .logo-swiper-container {
            width: 100%;
            padding: 20px 0;
        }

        .logoSwiper {
            width: 100%;
            height: 100px;
        }

        .logo-slide {
            display: flex;
            align-items: center;
            justify-content: center;
            height: 100%;
        }

        .logo-image {
            max-height: 60px;
            max-width: 150px;
            object-fit: contain;
            filter: grayscale(100%);
            opacity: 0.7;
            transition: all 0.3s ease;
        }

        .logo-image:hover {
            filter: grayscale(0%);
            opacity: 1;
            transform: scale(1.1);
        }

        /* Swiper pagination styling */
        .logoSwiper .swiper-pagination {
            position: relative;
            margin-top: 20px;
        }

        .logoSwiper .swiper-pagination-bullet {
            width: 10px;
            height: 10px;
            background-color: #ccc;
            opacity: 0.5;
            transition: all 0.3s ease;
        }

        .logoSwiper .swiper-pagination-bullet-active {
            background-color: #007bff;
            opacity: 1;
            transform: scale(1.2);
        }

        /* Responsive adjustments */
        @media (max-width: 768px) {
            .logoSwiper {
                height: 80px;
            }
            
            .logo-image {
                max-height: 50px;
                max-width: 120px;
            }
        }

        @media (max-width: 480px) {
            .logoSwiper {
                height: 70px;
            }
            
            .logo-image {
                max-height: 40px;
                max-width: 100px;
            }
        }
    </style>

    <script>
        // Initialize Swiper logo slider
        document.addEventListener('DOMContentLoaded', function() {
            const logoSwiper = new Swiper('.logoSwiper', {
                slidesPerView: 1,
                spaceBetween: 30,
                loop: true,
                autoplay: {
                    delay: 3000,
                    disableOnInteraction: false,
                },
                pagination: {
                    el: '.swiper-pagination',
                    clickable: true,
                    dynamicBullets: true,
                },
                breakpoints: {
                    640: {
                        slidesPerView: 2,
                        spaceBetween: 20,
                    },
                    768: {
                        slidesPerView: 3,
                        spaceBetween: 30,
                    },
                    1024: {
                        slidesPerView: 4,
                        spaceBetween: 40,
                    },
                    1200: {
                        slidesPerView: 5,
                        spaceBetween: 50,
                    }
                }
            });
        });
        document.addEventListener("DOMContentLoaded", function () {
            
        });
    </script>
			

			<footer class="bg-white  pt-5 pb-3 border-top">
					<div class="container">
						<div class="row gy-lg-0 gy-3 gx-sm-5">
							<div class="col-lg-4">
								<img src="/img/wheels-logo.png" width="284" alt="wheels.dev Logo">
								<div class="mt-3">
									<p class="fs-18 fw-semibold p-0 m-0">Let's Keep in touch</p>
									<p class="fs-12 fw-semibold">Enter your email to stay up to date with the
										latest updates from
										Wheels.Dev</p>
								</div>
								<div class="pt-3">
								
									<form hx-post="/newsletter/subscribe" hx-swap="outerHTML">
										<div class="input-group">
											<input name="authenticityToken" type="hidden" value="w3stb2pbx8qg2unc50velkt5pukr7b9e5lwtyhkc">
											<input type="email" name="email" class="form-control form-check-input-primary py-2 rounded-2 mb-2 fs-12" placeholder="Enter your email" required>
											<button type="submit" class="text-white fw-medium py-2 fs-12 rounded-2 bg--primary w-100">Subscribe to newsletter</button>
										</div>
									</form>
								
								</div>
							</div>
							<div class="col-lg-2 text-lg-start text-center">
								<h6 class="fw-bold fs-16 text--secondary">Docs</h6>
								<ul class="list-unstyled">
									<li class="mt-2"><a href="/3.0.0/guides/introduction/frameworks-and-wheels" target="_blank"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">Introduction</a>
									</li>
									<li class="mt-2"><a href="/3.0.0/guides/command-line-tools/cli-overview" target="_blank"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">Command Line
											Tools</a></li>
									<li class="mt-2"><a href="https://www.youtube.com/@wheels-dev" target="_blank"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">Follow a Tutorial</a></li>
									<li class="mt-2"><a href="/guides" target="_blank"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">Read the Guides</a></li>
									<li class="mt-2"><a href="/api/v3.0.0"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">API Documentation</a></li>
									<li class="mt-2"><a href="https://github.com/wheels-dev/wheels/discussions" target="_blank"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">Join the Conversation</a></li>
									<li class="mt-2"><a href="https://github.com/wheels-dev/wheels" target="_blank"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">Contribute to Wheels</a></li>
								</ul>
							</div>
							<div class="col-lg-2 text-lg-start text-center">
								<h6 class="fw-bold fs-16 text--secondary">Meta</h6>
								<ul class="list-unstyled">
									
									
										<li class="mt-2"><a href="/login"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">Login</a>
										</li>
										<li class="mt-2"><a href="/register"
												class="text--secondary fs-14 text-decoration-none cursor-pointer">Register</a>
										</li>
									

									<li class="mt-2"><a href="/blog/feed"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">RSS Blog Feed</a>
									</li>
									<li class="mt-2"><a href="/comment/feed"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">RSS Comments
											Feed</a>
									</li>
									<li class="mt-2"><a
											class="text--secondary fs-14 text-decoration-none cursor-pointer"></a>
									</li>
									
								</ul>
							</div>
							<div class="col-lg-2 text-lg-start text-center">
								<h6 class="fw-bold fs-16 text--secondary">Plugins</h6>
								<ul class="list-unstyled">
									<li class="mt-2"><a href="https://www.forgebox.io/type/cfwheels-plugins" target="_blank"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">Plugins</a></li>
								</ul>
								<h6 class="fw-bold fs-16 text--secondary">Downloads</h6>
								
									<ul class="list-unstyled">
										<li class="mt-2"><a href="/downloads"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">Download Wheels
											</a></li>
										<li class="mt-2"><a href="https://marketplace.visualstudio.com/items?itemName=wheels-dev.wheels-vscode" target="_blank"
											class="text--secondary fs-14 text-decoration-none cursor-pointer">VS Code Extension</a></li>
									</ul>
								
							</div>
							<div class="col-lg-2 text-lg-start text-center">
								<h6 class="fw-bold fs-16 text--secondary">External Links</h6>
								<ul class="list-unstyled">
									<li class="mt-2"><a href="https://github.com/wheels-dev/wheels/releases"
											class="text--secondary fs-14 text-decoration-none cursor-pointer" target="_blank">Source
											Code</a></li>
									<li class="mt-2"><a href="https://github.com/wheels-dev/wheels/issues"
											class="text--secondary fs-14 text-decoration-none cursor-pointer" target="_blank">Issue
											Tracker</a>
									</li>
									<li class="mt-2"><a href="https://opencollective.com/wheels-dev"
											class="text--secondary fs-14 text-decoration-none cursor-pointer" target="_blank">Sponsor
											Us</a>
									</li>
									
										<li class="mt-2"><a href="/community"
												class="text--secondary fs-14 text-decoration-none cursor-pointer">Community</a>
										</li>
									
								</ul>
							</div>
						</div>
						<hr>
						<div
							class="text-muted d-flex flex-wrap gap-2 justify-content-lg-between justify-content-center align-items-center">
							<div>
								<p class="p-0 m-0 fs-12 text--secondary text-lg-start text-center">
										&copy; 2005-2026 Wheels.Dev. All rights are reserved.<br>
										Wheels is licensed under the Apache License, Version 2.0.
								</p>
							</div>
							<div class="d-flex justify-content-center gap-3">
								<a href="https://github.com/wheels-dev/" class="text-dark" target="_blank">
									<svg width="25" height="24" viewBox="0 0 25 24" fill="none"
										xmlns="http://www.w3.org/2000/svg">
										<path
											d="M12.2852 0.248535C10.6719 0.248535 9.07436 0.56256 7.58385 1.17268C6.09334 1.7828 4.73904 2.67707 3.59825 3.80442C1.29433 6.08121 0 9.16921 0 12.3891C0 17.7552 3.52585 22.3079 8.40307 23.9226C9.01733 24.0197 9.21389 23.6434 9.21389 23.3156V21.2638C5.8109 21.9923 5.08607 19.637 5.08607 19.637C4.52095 18.2287 3.72241 17.8523 3.72241 17.8523C2.60446 17.0996 3.80841 17.1239 3.80841 17.1239C5.03693 17.2089 5.68804 18.3744 5.68804 18.3744C6.75686 20.2197 8.56278 19.6734 9.26303 19.382C9.3736 18.5929 9.69302 18.0587 10.037 17.7552C7.30969 17.4517 4.44724 16.4076 4.44724 11.7821C4.44724 10.4345 4.91408 9.35395 5.71261 8.49197C5.58976 8.18845 5.15978 6.92584 5.83547 5.28686C5.83547 5.28686 6.86742 4.95907 9.21389 6.5252C10.1844 6.25811 11.241 6.12456 12.2852 6.12456C13.3294 6.12456 14.386 6.25811 15.3565 6.5252C17.703 4.95907 18.7349 5.28686 18.7349 5.28686C19.4106 6.92584 18.9806 8.18845 18.8578 8.49197C19.6563 9.35395 20.1231 10.4345 20.1231 11.7821C20.1231 16.4197 17.2484 17.4396 14.5088 17.7431C14.9511 18.1194 15.3565 18.86 15.3565 19.9891V23.3156C15.3565 23.6434 15.5531 24.0319 16.1796 23.9226C21.0568 22.2958 24.5704 17.7552 24.5704 12.3891C24.5704 10.7948 24.2526 9.21605 23.6352 7.7431C23.0178 6.27014 22.1129 4.93177 20.9721 3.80442C19.8313 2.67707 18.477 1.7828 16.9865 1.17268C15.496 0.56256 13.8985 0.248535 12.2852 0.248535Z"
											fill="#0C1620" />
									</svg>
								</a>
								<a href="https://github.com/wheels-dev/wheels/discussions" class="text-dark" target="_blank">
									<svg width="22" height="22" viewBox="0 0 22 22" fill="none"
										xmlns="http://www.w3.org/2000/svg">
										<path
											d="M10.5201 0.248536C8.69846 0.247922 6.90798 0.721253 5.32461 1.62202C3.74124 2.52279 2.41945 3.81999 1.48913 5.38619C0.558809 6.95238 0.0519596 8.73366 0.0183855 10.555C-0.0151887 12.3764 0.425667 14.1751 1.29764 15.7745L0.0551367 20.132C0.011417 20.285 0.0102522 20.4471 0.051768 20.6007C0.0932837 20.7543 0.175908 20.8937 0.290748 21.0039C0.405588 21.114 0.548296 21.1908 0.703512 21.2259C0.858728 21.261 1.02058 21.2531 1.17164 21.203L5.26313 19.8398C6.65763 20.6456 8.21882 21.1199 9.82592 21.2258C11.433 21.3317 13.043 21.0666 14.5312 20.4508C16.0194 19.835 17.346 18.8851 18.4084 17.6745C19.4708 16.464 20.2404 15.0253 20.6578 13.4698C21.0753 11.9142 21.1292 10.2835 20.8156 8.70372C20.5019 7.12397 19.8291 5.63754 18.849 4.35943C17.869 3.08132 16.6081 2.04579 15.1638 1.33295C13.7196 0.620115 12.1307 0.249074 10.5201 0.248536ZM7.02013 8.99854C7.02013 8.76647 7.11232 8.54391 7.27641 8.37982C7.4405 8.21572 7.66306 8.12354 7.89513 8.12354H13.1451C13.3772 8.12354 13.5997 8.21572 13.7638 8.37982C13.9279 8.54391 14.0201 8.76647 14.0201 8.99854C14.0201 9.2306 13.9279 9.45316 13.7638 9.61725C13.5997 9.78135 13.3772 9.87354 13.1451 9.87354H7.89513C7.66306 9.87354 7.4405 9.78135 7.27641 9.61725C7.11232 9.45316 7.02013 9.2306 7.02013 8.99854ZM7.89513 11.6235H11.3951C11.6272 11.6235 11.8497 11.7157 12.0138 11.8798C12.1779 12.0439 12.2701 12.2665 12.2701 12.4985C12.2701 12.7306 12.1779 12.9532 12.0138 13.1173C11.8497 13.2814 11.6272 13.3735 11.3951 13.3735H7.89513C7.66306 13.3735 7.4405 13.2814 7.27641 13.1173C7.11232 12.9532 7.02013 12.7306 7.02013 12.4985C7.02013 12.2665 7.11232 12.0439 7.27641 11.8798C7.4405 11.7157 7.66306 11.6235 7.89513 11.6235Z"
											fill="#0C1620" />
									</svg>

								</a>
								<a href="https://twitter.com/CFonWheels" class="text-dark" target="_blank">
									<svg width="25" height="24" viewBox="0 0 25 24" fill="none"
										xmlns="http://www.w3.org/2000/svg">
										<mask id="mask0_129_385" style="mask-type:luminance"
											maskUnits="userSpaceOnUse" x="0" y="0" width="25" height="24">
											<path d="M0.845703 0.248535H24.5386V23.9414H0.845703V0.248535Z"
												fill="white" />
										</mask>
										<g mask="url(#mask0_129_385)">
											<path
												d="M19.5038 1.35693H23.1373L15.2002 10.4516L24.5386 22.8295H17.2276L11.4973 15.3239L4.94795 22.8295H1.3111L9.79992 13.0985L0.845703 1.35863H8.3428L13.5146 8.21772L19.5038 1.35693ZM18.2261 20.6497H20.24L7.24278 3.42329H5.08334L18.2261 20.6497Z"
												fill="#0C1620" />
										</g>
									</svg>
								</a>
								<a href="https://www.facebook.com/cfwheels" class="text-dark" target="_blank">
									<svg width="13" height="24" viewBox="0 0 13 24" fill="none"
										xmlns="http://www.w3.org/2000/svg">
										<path
											d="M8.71454 13.8719H11.6396L12.8096 9.13336H8.71454V6.76407C8.71454 5.54389 8.71454 4.39479 11.0546 4.39479H12.8096V0.414385C12.4282 0.363446 10.9879 0.248535 9.46686 0.248535C6.29026 0.248535 4.03447 2.21149 4.03447 5.81636V9.13336H0.524414V13.8719H4.03447V23.9414H8.71454V13.8719Z"
											fill="#0C1620" />
									</svg>
								</a>
							</div>
						</div>
					</div>
				</div>
			</footer>
			<script src="/js/swiper.js"></script>
			<script src="/js/infinite-scroll.pkgd.min.js"></script>
			<script src="/js/global.js"></script>
			<script>
				// Convert UTC dates to local timezone for elements with data-utc attribute
				document.addEventListener("DOMContentLoaded", function() {
					var utcElements = document.querySelectorAll('[data-utc]');
					utcElements.forEach(function(el) {
						var utcDate = el.getAttribute('data-utc');
						if (utcDate) {
							var date = new Date(utcDate);
							if (!isNaN(date.getTime())) {
								el.textContent = date.toLocaleString();
							}
						}
					});
				});
			</script>
		</body>
	</html>


