1<html lang="en" class="flex flex-col h-dvh scroll-smooth"> 2<head> 3 <!-- Meta title --> 4 5 <title>Blog — Tempest</title> 6 7 <link rel="alternate" type="application/rss+xml" title="Tempest RSS" href="https://tempestphp.com/rss"> 8 9 <meta name="title" content="Blog â Tempest"> 10 <meta name="twitter:title" content="Blog â Tempest"> 11 <meta property="og:title" content="Blog â Tempest"> 12 <meta itemprop="name" content="Blog â Tempest"> 13 14 <meta charset="UTF-8"> 15 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 16 17 <!-- Meta description --> 18 19 <meta name="description" content="Tempest is a modern framework designed to enable developers to write as little framework-specific code as possible, so that they can focus on application code instead."> 20 <meta name="twitter:description" content="Tempest is a modern framework designed to enable developers to write as little framework-specific code as possible, so that they can focus on application code instead."> 21 <meta property="og:description" content="Tempest is a modern framework designed to enable developers to write as little framework-specific code as possible, so that they can focus on application code instead."> 22 <meta itemprop="description" content="Tempest is a modern framework designed to enable developers to write as little framework-specific code as possible, so that they can focus on application code instead."> 23 24 <!-- Meta image --> 25 <meta property="og:image" content="https://tempestphp.com/meta/blog"> 26 <meta name="twitter:image" content="https://tempestphp.com/meta/blog"> 27 <meta name="image" content="https://tempestphp.com/meta/blog"> 28 <meta name="twitter:card" content="summary_large_image"> 29 <meta property="og:type" content="article"> 30 31 <!-- Favicon --> 32 <link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png"> 33 <link rel="icon" type="image/png" sizes="32x32" href="/favicon/favicon-32x32.png"> 34 <link rel="icon" type="image/png" sizes="16x16" href="/favicon/favicon-16x16.png"> 35 <link rel="manifest" href="/favicon/site.webmanifest"> 36 37 <!-- Vite tags --> 38 39 40
41<script type="module" src="/build/assets/main.entrypoint-BCjeSVPN.js"></script>
41<link rel="stylesheet" href="/build/assets/main-BK7cdzvE.css" />
41<script type="module" src="/build/assets/palette.entrypoint-DqmRhDKF.js"></script>
41 42 43 <!-- Dark mode --> 44
44<script> 45 function isDark() { 46 return localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches) 47 } 48 49 function applyTheme(theme = undefined) { 50 if (theme) { 51 localStorage.theme = theme 52 } 53 54 document.documentElement.classList.toggle('dark', isDark()) 55 document.dispatchEvent(new CustomEvent('theme-changed', {detail: {isDark: isDark()}})) 56 } 57 58 function toggleDarkMode() { 59 applyTheme(isDark() ? 'light' : 'dark') 60 } 61 62 applyTheme() 63 </script>
63 64 65 66</head> 67<body class="relative antialiased flex flex-col grow selection:bg-(--ui-primary)/20 selection:text-(--ui-primary) font-sans text-(--ui-text) bg-(--ui-bg) scheme-light dark:scheme-dark overflow-visible! pr-0! "> 68<div class="absolute inset-0 bg-repeat pointer-events-none" style="background-image: url(/noise.svg)"> 69 <div id="command-palette"></div> 70</div> 71 72 73 74<!-- Header --> 75 76 77<div class="relative inset-x-0 z-[1] h-(--ui-header-height)"> 78 <header class="group transition-[top,border] z-[1] fixed top-4 data-[scrolling]:top-0 flex justify-center bg-[transparent] border-b border-transparent data-[scrolling]:border-(--ui-border) w-full duration-200 data-[scrolling]:backdrop-blur data-[scrolling]:bg-(--ui-bg)/75" id="header"> 79 <div class="grid grid-cols-[auto_1fr_auto] items-center gap-x-4 px-8 py-4 w-full 2xl:max-w-8xl lg:max-w-5xl xl:max-w-7xl"> 80 <!-- Left side --> 81 <div class="flex items-center gap-4"> 82 <a href="/" class="flex items-center gap-4"> 83 <!-- Logo --> 84 <div class="size-8"> 85 <img src="/img/tempest-logo.png" alt="Tempest logo" class="size-full"> 86 </div> 87 <span class="hidden lg:inline font-medium">Tempest</span> 88 </a> 89 90 <a class="hidden md:inline text-xs tracking-wide font-medium text-(--ui-text-muted) bg-(--ui-bg)/50 px-2 py-1 rounded-lg border border-(--ui-border)" href="https://github.com/tempestphp/tempest-framework/releases/v3.19.2"> 91 v3.19.2 </a> 92 </div> 93 94 <!-- Center --> 95 <div class="flex items-center gap-4 min-w-0 xl:ml-32"> 96 <button toggle-palette class="hidden sm:flex items-center gap-2 min-w-0 cursor-pointer rounded-lg border border-(--ui-border) bg-(--ui-bg)/50 dark:bg-transparent px-3 py-1.5 text-sm text-(--ui-text-muted) hover:bg-(--ui-bg-elevated) hover:border-(--ui-border-accented) transition group-data-[scrolling]:border-transparent group-data-[scrolling]:bg-transparent group-data-[scrolling]:hover:bg-(--ui-bg-elevated)"> 97 <label for="search" class="sr-only">Search</label> 98 99 100 101<svg class="size-4 shrink-0 text-(--ui-text-dimmed)" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10a7 7 0 1 0 14 0a7 7 0 1 0-14 0m18 11l-6-6"/></svg> 102 <span class="truncate">Search docs, blog...</span> 103 <kbd class="ml-2 inline-flex items-center gap-0.5 rounded border border-(--ui-border) bg-(--ui-bg-muted) px-1.5 py-0.5 text-xs text-(--ui-text-dimmed) font-medium"> 104 / 105 </kbd> 106</button> 107 108 109 </div> 110 <!-- Right side --> 111 <div class="flex items-center gap-5 font-medium text-(--ui-text-muted)"> 112 <a class="transition hover:text-(--ui-text-highlighted) " href="https://tempestphp.com/community"> 113 Community 114 </a> 115 <a class="transition hover:text-(--ui-text-highlighted) md:text-(--ui-primary)" href="https://tempestphp.com/blog"> 116 Blog 117 </a> 118 <a class="transition hover:text-(--ui-text-highlighted) " href="https://tempestphp.com/documentation"> 119 <span class="sm:hidden">Docs</span> 120 <span class="hidden sm:inline">Documentation</span> 121 </a> 122 <a href="https://github.com/tempestphp/tempest-framework" class="transition hover:text-(--ui-text-highlighted) flex items-center gap-x-1.5 ml-4"> 123 124 125 126<svg class="size-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.5-2c2.8-.3 5.5-1.4 5.5-6a4.6 4.6 0 0 0-1.3-3.2a4.2 4.2 0 0 0-.1-3.2s-1.1-.3-3.5 1.3a12.3 12.3 0 0 0-6.2 0C6.5 2.8 5.4 3.1 5.4 3.1a4.2 4.2 0 0 0-.1 3.2A4.6 4.6 0 0 0 4 9.5c0 4.6 2.7 5.7 5.5 6c-.6.6-.6 1.2-.5 2V21"/></svg> 127 <span class="hidden lg:inline font-mono">2.3K</span> 128 </a> 129 </div> 130 </div> 131 </header> 132</div> 133 134 135
136<script> 137const header = document.getElementById('header') 138 139window.addEventListener('scroll', () => { 140 if (window.scrollY > 0) { 141 header.dataset.scrolling = true 142 } else { 143 delete header.dataset.scrolling 144 } 145}) 146</script>
146 147 148 149 150 151<!-- Main container --> 152 153 154<main class="isolate flex flex-col mx-auto px-4 xl:px-8 container grow"> 155 <!-- Main content --> 156 <div class="flex flex-col lg:mt-10 px-2 lg:pl-12 w-full min-w-0 grow"> 157 <!-- Header --> 158 <div class="flex flex-col pb-8 max-w-xl"> 159 <h1 class="font-display text-gray-900 dark:text-white text-3xl sm:text-4xl lg:text-5xl tracking-tight">Blog</h1> 160 <p class="mt-4 text-gray-500 dark:text-gray-400 text-lg"> 161 Read the latest news and announcements about Tempest, from framework updates to real-world applications and expert insights. 162 </p> 163 <div class="mt-4"> 164 <a href="/rss" class="inline-flex items-center gap-1 bg-gray-300/20 dark:bg-gray-400/10 px-2.5 py-1 rounded font-medium text-gray-700 dark:text-gray-400 text-sm" rel="noopener noreferrer" target="_blank"> 165 166 167 168<svg class="size-4 shrink-0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 19a1 1 0 1 0 2 0a1 1 0 1 0-2 0M4 4a16 16 0 0 1 16 16M4 11a9 9 0 0 1 9 9"/></svg> 169 <span>RSS</span> 170 </a> 171 </div> 172 </div> 173 <!-- Articles --> 174 <ul class="gap-4 lg:gap-6 grid md:grid-cols-2 lg:grid-cols-3 mt-0 lg:mt-4 2xl:mt-8 mb-8"> 175 <li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 176 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 177 <a class="absolute inset-0" href="https://tempestphp.com/blog/tempest-mcp"></a> 178 <div> 179 <span class="font-medium">Your application is already an MCP server</span> 180 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Building tools, resources and prompts with Tempest</p> 181 </div> 182 <div class="flex justify-between items-center gap-x-2 mt-4"> 183 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 184 Release </span> 185 <span class="text-(--ui-text-dimmed) text-sm"> 186 by <span class="text-(--ui-text-muted)">Márk</span> on <span class="text-(--ui-text-muted)">July 29, 2026</span> 187 </span> 188 </div> 189 </div> 190 </li> 191<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 192 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 193 <a class="absolute inset-0" href="https://tempestphp.com/blog/frankenphp-tempest"></a> 194 <div> 195 <span class="font-medium">FrankenPHP worker mode in Tempest</span> 196 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">We're adding support for FrankenPHP worker mode in Tempest</p> 197 </div> 198 <div class="flex justify-between items-center gap-x-2 mt-4"> 199 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 200 Release </span> 201 <span class="text-(--ui-text-dimmed) text-sm"> 202 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">July 07, 2026</span> 203 </span> 204 </div> 205 </div> 206 </li> 207<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 208 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 209 <a class="absolute inset-0" href="https://tempestphp.com/blog/a-generic-tragedy"></a> 210 <div> 211 <span class="font-medium">A generic tragedy</span> 212 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">PHP devs talk about generics in real life</p> 213 </div> 214 <div class="flex justify-between items-center gap-x-2 mt-4">
215 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 216 Thoughts </span> 217 <span class="text-(--ui-text-dimmed) text-sm"> 218 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">June 15, 2026</span> 219 </span> 220 </div> 221 </div> 222 </li> 223<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 224 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 225 <a class="absolute inset-0" href="https://tempestphp.com/blog/tempest-markdown"></a> 226 <div> 227 <span class="font-medium">A new Markdown parser</span> 228 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Introducing tempest/markdown, its design goals, and how it works</p> 229 </div> 230 <div class="flex justify-between items-center gap-x-2 mt-4"> 231 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 232 Thoughts </span> 233 <span class="text-(--ui-text-dimmed) text-sm"> 234 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">June 05, 2026</span> 235 </span> 236 </div> 237 </div> 238 </li> 239<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 240 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 241 <a class="absolute inset-0" href="https://tempestphp.com/blog/new-orm-relations"></a> 242 <div> 243 <span class="font-medium">New ORM relations</span> 244 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest's ORM now supports HasOneThrough, HasManyThrough, and BelongsToMany relations</p> 245 </div> 246 <div class="flex justify-between items-center gap-x-2 mt-4"> 247 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 248 Release </span> 249 <span class="text-(--ui-text-dimmed) text-sm"> 250 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">March 27, 2026</span> 251 </span> 252 </div> 253 </div> 254 </li> 255<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 256 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 257 <a class="absolute inset-0" href="https://tempestphp.com/blog/idempotency-in-tempest"></a> 258 <div> 259 <span class="font-medium">Idempotency in Tempest</span> 260 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">We've recently added an idempotency feature into Tempest to help you avoid code running twice when it shouldn't.</p> 261 </div> 262 <div class="flex justify-between items-center gap-x-2 mt-4"> 263 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 264 Release </span> 265 <span class="text-(--ui-text-dimmed) text-sm"> 266 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">March 26, 2026</span> 267 </span> 268 </div> 269 </div> 270 </li> 271<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 272 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 273 <a class="absolute inset-0" href="https://tempestphp.com/blog/truly-decoupled-discovery"></a> 274 <div>
275 <span class="font-medium">Truly decoupled discovery</span> 276 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest's discovery can now be used in any project</p> 277 </div> 278 <div class="flex justify-between items-center gap-x-2 mt-4"> 279 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 280 Release </span> 281 <span class="text-(--ui-text-dimmed) text-sm"> 282 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">March 13, 2026</span> 283 </span> 284 </div> 285 </div> 286 </li> 287<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 288 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 289 <a class="absolute inset-0" href="https://tempestphp.com/blog/view-source-mapping"></a> 290 <div> 291 <span class="font-medium">Tempest View with source mapping</span> 292 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest 3.2 improves View debugging by introducing source maps.</p> 293 </div> 294 <div class="flex justify-between items-center gap-x-2 mt-4"> 295 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 296 Release </span> 297 <span class="text-(--ui-text-dimmed) text-sm"> 298 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">February 20, 2026</span> 299 </span> 300 </div> 301 </div> 302 </li> 303<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 304 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 305 <a class="absolute inset-0" href="https://tempestphp.com/blog/generating-typescript-types-with-tempest"></a> 306 <div> 307 <span class="font-medium">Generating TypeScript types with Tempest</span> 308 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest now has the ability to generate TypeScript interfaces from PHP classes to ease integration with TypeScript-based front-ends.</p> 309 </div> 310 <div class="flex justify-between items-center gap-x-2 mt-4"> 311 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 312 Release </span> 313 <span class="text-(--ui-text-dimmed) text-sm"> 314 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">February 16, 2026</span> 315 </span> 316 </div> 317 </div> 318 </li> 319<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 320 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 321 <a class="absolute inset-0" href="https://tempestphp.com/blog/tempest-3"></a> 322 <div> 323 <span class="font-medium">Tempest 3.0</span> 324 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest 3.0 comes with a new exception handler, several performance improvements, PHP 8.5 support, and more.</p> 325 </div> 326 <div class="flex justify-between items-center gap-x-2 mt-4"> 327 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 328 Release </span>
329 <span class="text-(--ui-text-dimmed) text-sm"> 330 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">February 12, 2026</span> 331 </span> 332 </div> 333 </div> 334 </li> 335<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 336 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 337 <a class="absolute inset-0" href="https://tempestphp.com/blog/open-source-strategies"></a> 338 <div> 339 <span class="font-medium">Open source strategies</span> 340 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Staying happy and productive while doing open source</p> 341 </div> 342 <div class="flex justify-between items-center gap-x-2 mt-4"> 343 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 344 Thoughts </span> 345 <span class="text-(--ui-text-dimmed) text-sm"> 346 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">January 13, 2026</span> 347 </span> 348 </div> 349 </div> 350 </li> 351<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 352 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 353 <a class="absolute inset-0" href="https://tempestphp.com/blog/route-decorators"></a> 354 <div> 355 <span class="font-medium">Route decorators in Tempest 2.8</span> 356 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Taking a deep dive in a new Tempest feature</p> 357 </div> 358 <div class="flex justify-between items-center gap-x-2 mt-4"> 359 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 360 Release </span> 361 <span class="text-(--ui-text-dimmed) text-sm"> 362 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">November 10, 2025</span> 363 </span> 364 </div> 365 </div> 366 </li> 367<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 368 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 369 <a class="absolute inset-0" href="https://tempestphp.com/blog/re-the-journey-thus-far"></a> 370 <div> 371 <span class="font-medium">RE: the journey this far</span> 372 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Replying to someone trying out Tempest</p> 373 </div> 374 <div class="flex justify-between items-center gap-x-2 mt-4"> 375 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 376 Thoughts </span> 377 <span class="text-(--ui-text-dimmed) text-sm"> 378 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">October 27, 2025</span> 379 </span> 380 </div> 381 </div> 382 </li> 383<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 384 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 385 <a class="absolute inset-0" href="https://tempestphp.com/blog/oauth-in-tempest"></a> 386 <div>
387 <span class="font-medium">OAuth in Tempest 2.2</span> 388 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest 2.2 gets a new OAuth integration which makes authentication super simple</p> 389 </div> 390 <div class="flex justify-between items-center gap-x-2 mt-4"> 391 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 392 Release </span> 393 <span class="text-(--ui-text-dimmed) text-sm"> 394 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">October 02, 2025</span> 395 </span> 396 </div> 397 </div> 398 </li> 399<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 400 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 401 <a class="absolute inset-0" href="https://tempestphp.com/blog/migrations-in-tempest-2"></a> 402 <div> 403 <span class="font-medium">No more down migrations</span> 404 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Database migrations have had a serious refactor in the newest Tempest release</p> 405 </div> 406 <div class="flex justify-between items-center gap-x-2 mt-4"> 407 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 408 Thoughts </span> 409 <span class="text-(--ui-text-dimmed) text-sm"> 410 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">September 19, 2025</span> 411 </span> 412 </div> 413 </div> 414 </li> 415<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 416 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 417 <a class="absolute inset-0" href="https://tempestphp.com/blog/tempest-2"></a> 418 <div> 419 <span class="font-medium">Tempest 2.0</span> 420 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">We've just tagged Tempest 2.0. It's a release focussed on fine-tuning and fixing lots of details. It also signifies that we're committed to Tempest, we're in this for the long run!</p> 421 </div> 422 <div class="flex justify-between items-center gap-x-2 mt-4"> 423 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 424 Release </span> 425 <span class="text-(--ui-text-dimmed) text-sm"> 426 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">September 16, 2025</span> 427 </span> 428 </div> 429 </div> 430 </li> 431<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 432 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 433 <a class="absolute inset-0" href="https://tempestphp.com/blog/tempest-1-5"></a> 434 <div> 435 <span class="font-medium">Tempest 1.5</span> 436 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">This release brings a new markdown view component, CSRF support, installable view components, and more.</p> 437 </div> 438 <div class="flex justify-between items-center gap-x-2 mt-4">
439 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 440 Release </span> 441 <span class="text-(--ui-text-dimmed) text-sm"> 442 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">July 29, 2025</span> 443 </span> 444 </div> 445 </div> 446 </li> 447<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 448 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 449 <a class="absolute inset-0" href="https://tempestphp.com/blog/tempest-view-updates"></a> 450 <div> 451 <span class="font-medium">Major updates to Tempest views</span> 452 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest 1.5 released with some major improvements to its templating engine</p> 453 </div> 454 <div class="flex justify-between items-center gap-x-2 mt-4"> 455 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 456 Release </span> 457 <span class="text-(--ui-text-dimmed) text-sm"> 458 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">July 28, 2025</span> 459 </span> 460 </div> 461 </div> 462 </li> 463<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 464 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 465 <a class="absolute inset-0" href="https://tempestphp.com/blog/mail-component"></a> 466 <div> 467 <span class="font-medium">Mailing with Tempest</span> 468 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">The newest Tempest release adds mailing support</p> 469 </div> 470 <div class="flex justify-between items-center gap-x-2 mt-4"> 471 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 472 Release </span> 473 <span class="text-(--ui-text-dimmed) text-sm"> 474 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">July 17, 2025</span> 475 </span> 476 </div> 477 </div> 478 </li> 479<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 480 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 481 <a class="absolute inset-0" href="https://tempestphp.com/blog/tempest-1-1"></a> 482 <div> 483 <span class="font-medium">Tempest 1.1 released</span> 484 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">A new minor version is available</p> 485 </div> 486 <div class="flex justify-between items-center gap-x-2 mt-4"> 487 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 488 Release </span> 489 <span class="text-(--ui-text-dimmed) text-sm"> 490 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">July 05, 2025</span> 491 </span> 492 </div> 493 </div> 494 </li> 495<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 496 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 497 <a class="absolute inset-0" href="https://tempestphp.com/blog/ten-tempest-tips"></a> 498 <div>
499 <span class="font-medium">Ten Tempest Tips</span> 500 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Ten things you might now know about Tempest</p> 501 </div> 502 <div class="flex justify-between items-center gap-x-2 mt-4"> 503 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 504 Thoughts </span> 505 <span class="text-(--ui-text-dimmed) text-sm"> 506 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">June 29, 2025</span> 507 </span> 508 </div> 509 </div> 510 </li> 511<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 512 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 513 <a class="absolute inset-0" href="https://tempestphp.com/blog/tempest-1"></a> 514 <div> 515 <span class="font-medium">Tempest 1.0</span> 516 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest's first stable release</p> 517 </div> 518 <div class="flex justify-between items-center gap-x-2 mt-4"> 519 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 520 Release </span> 521 <span class="text-(--ui-text-dimmed) text-sm"> 522 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">June 27, 2025</span> 523 </span> 524 </div> 525 </div> 526 </li> 527<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 528 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 529 <a class="absolute inset-0" href="https://tempestphp.com/blog/tempests-vision"></a> 530 <div> 531 <span class="font-medium">Tempest's vision</span> 532 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">What sets Tempest apart as a framework for modern PHP development.</p> 533 </div> 534 <div class="flex justify-between items-center gap-x-2 mt-4"> 535 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 536 Thoughts </span> 537 <span class="text-(--ui-text-dimmed) text-sm"> 538 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">May 26, 2025</span> 539 </span> 540 </div> 541 </div> 542 </li> 543<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 544 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 545 <a class="absolute inset-0" href="https://tempestphp.com/blog/beta-1"></a> 546 <div> 547 <span class="font-medium">Tempest is beta</span> 548 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Today we release the first beta version of Tempest, the PHP framework for web and console apps that gets out of your way. It's one of the final steps towards a stable 1.0 release. We'll use this beta phase to fix bugs, and we're committed to not making any breaking changes anymore, apart from experimental features. 549</p> 550 </div> 551 <div class="flex justify-between items-center gap-x-2 mt-4">
552 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 553 Release </span> 554 <span class="text-(--ui-text-dimmed) text-sm"> 555 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">May 08, 2025</span> 556 </span> 557 </div> 558 </div> 559 </li> 560<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 561 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 562 <a class="absolute inset-0" href="https://tempestphp.com/blog/about-route-attributes"></a> 563 <div> 564 <span class="font-medium">About route attributes</span> 565 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Let's explore Tempest's route attributes in depth</p> 566 </div> 567 <div class="flex justify-between items-center gap-x-2 mt-4"> 568 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 569 Thoughts </span> 570 <span class="text-(--ui-text-dimmed) text-sm"> 571 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">March 30, 2025</span> 572 </span> 573 </div> 574 </div> 575 </li> 576<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 577 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 578 <a class="absolute inset-0" href="https://tempestphp.com/blog/alpha-6"></a> 579 <div> 580 <span class="font-medium">The final alpha release</span> 581 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest alpha 6 is released, we'll talk about Tempest's future and highlight the most important new features in this release</p> 582 </div> 583 <div class="flex justify-between items-center gap-x-2 mt-4"> 584 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 585 Release </span> 586 <span class="text-(--ui-text-dimmed) text-sm"> 587 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">March 24, 2025</span> 588 </span> 589 </div> 590 </div> 591 </li> 592<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 593 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 594 <a class="absolute inset-0" href="https://tempestphp.com/blog/discovery-explained"></a> 595 <div> 596 <span class="font-medium">Tempest's Discovery explained</span> 597 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">A deep dive into the heart of Tempest.</p> 598 </div> 599 <div class="flex justify-between items-center gap-x-2 mt-4"> 600 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-teal-400/20 dark:bg-teal-400/10 text-teal-700 dark:text-teal-400"> 601 Tutorial </span> 602 <span class="text-(--ui-text-dimmed) text-sm"> 603 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">March 16, 2025</span> 604 </span> 605 </div> 606 </div> 607 </li> 608<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 609 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 610 <a class="absolute inset-0" href="https://tempestphp.com/blog/request-objects-in-tempest"></a> 611 <div>
612 <span class="font-medium">Request objects in Tempest</span> 613 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Why Tempest requests are super intuitive</p> 614 </div> 615 <div class="flex justify-between items-center gap-x-2 mt-4"> 616 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-teal-400/20 dark:bg-teal-400/10 text-teal-700 dark:text-teal-400"> 617 Tutorial </span> 618 <span class="text-(--ui-text-dimmed) text-sm"> 619 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">March 13, 2025</span> 620 </span> 621 </div> 622 </div> 623 </li> 624<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 625 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 626 <a class="absolute inset-0" href="https://tempestphp.com/blog/static-websites-with-tempest"></a> 627 <div> 628 <span class="font-medium">Static websites with Tempest</span> 629 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest makes it super convenient to convert any controller action in statically generated pages.</p> 630 </div> 631 <div class="flex justify-between items-center gap-x-2 mt-4"> 632 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-teal-400/20 dark:bg-teal-400/10 text-teal-700 dark:text-teal-400"> 633 Tutorial </span> 634 <span class="text-(--ui-text-dimmed) text-sm"> 635 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">March 08, 2025</span> 636 </span> 637 </div> 638 </div> 639 </li> 640<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 641 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 642 <a class="absolute inset-0" href="https://tempestphp.com/blog/chasing-bugs-down-rabbit-holes"></a> 643 <div> 644 <span class="font-medium">Chasing bugs down rabbit holes</span> 645 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">I had to debug the most interesting bug in Tempest to date.</p> 646 </div> 647 <div class="flex justify-between items-center gap-x-2 mt-4"> 648 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 649 Thoughts </span> 650 <span class="text-(--ui-text-dimmed) text-sm"> 651 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">February 02, 2025</span> 652 </span> 653 </div> 654 </div> 655 </li> 656<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 657 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 658 <a class="absolute inset-0" href="https://tempestphp.com/blog/alpha-5"></a> 659 <div> 660 <span class="font-medium">Tempest alpha 5</span> 661 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest alpha 5 is released with PHP 8.4 support, a major console overhaul, and more!</p> 662 </div> 663 <div class="flex justify-between items-center gap-x-2 mt-4"> 664 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 665 Release </span>
666 <span class="text-(--ui-text-dimmed) text-sm"> 667 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">January 22, 2025</span> 668 </span> 669 </div> 670 </div> 671 </li> 672<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 673 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 674 <a class="absolute inset-0" href="https://tempestphp.com/blog/start-with-the-customer-experience"></a> 675 <div> 676 <span class="font-medium">Start with developer experience</span> 677 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Everything else is secondary.</p> 678 </div> 679 <div class="flex justify-between items-center gap-x-2 mt-4"> 680 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 681 Thoughts </span> 682 <span class="text-(--ui-text-dimmed) text-sm"> 683 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">January 16, 2025</span> 684 </span> 685 </div> 686 </div> 687 </li> 688<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 689 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 690 <a class="absolute inset-0" href="https://tempestphp.com/blog/alpha-4"></a> 691 <div> 692 <span class="font-medium">Tempest alpha 4</span> 693 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest alpha 4 is released with support for asynchronous commands, the new filesystem component, partial discovery cache, and more!</p> 694 </div> 695 <div class="flex justify-between items-center gap-x-2 mt-4"> 696 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 697 Release </span> 698 <span class="text-(--ui-text-dimmed) text-sm"> 699 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">November 25, 2024</span> 700 </span> 701 </div> 702 </div> 703 </li> 704<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 705 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 706 <a class="absolute inset-0" href="https://tempestphp.com/blog/exit-codes-fallacy"></a> 707 <div> 708 <span class="font-medium">Exit code fallacy</span> 709 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Was I wrong about exit codes?</p> 710 </div> 711 <div class="flex justify-between items-center gap-x-2 mt-4"> 712 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 713 Thoughts </span> 714 <span class="text-(--ui-text-dimmed) text-sm"> 715 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">November 15, 2024</span> 716 </span> 717 </div> 718 </div> 719 </li> 720<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 721 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 722 <a class="absolute inset-0" href="https://tempestphp.com/blog/unfair-advantage"></a> 723 <div>
724 <span class="font-medium">Unfair advantage</span> 725 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Why Tempest instead of Symfony or Laravel?</p> 726 </div> 727 <div class="flex justify-between items-center gap-x-2 mt-4"> 728 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-yellow-400/20 dark:bg-yellow-400/10 text-yellow-700 dark:text-yellow-400"> 729 Thoughts </span> 730 <span class="text-(--ui-text-dimmed) text-sm"> 731 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">November 08, 2024</span> 732 </span> 733 </div> 734 </div> 735 </li> 736<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 737 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 738 <a class="absolute inset-0" href="https://tempestphp.com/blog/alpha-3"></a> 739 <div> 740 <span class="font-medium">Tempest alpha 3</span> 741 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest alpha 3 is released with deferred tasks support, installers, a refactored view engine, and more!</p> 742 </div> 743 <div class="flex justify-between items-center gap-x-2 mt-4"> 744 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 745 Release </span> 746 <span class="text-(--ui-text-dimmed) text-sm"> 747 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">October 31, 2024</span> 748 </span> 749 </div> 750 </div> 751 </li> 752<li class="p-0.5 relative border border-(--ui-border) bg-(--ui-bg-elevated)/30 hover:bg-(--ui-bg-elevated)/75 rounded-lg transition"> 753 <div class="h-full flex flex-col justify-between border border-dashed border-(--ui-border) p-4 rounded-md"> 754 <a class="absolute inset-0" href="https://tempestphp.com/blog/alpha-2"></a> 755 <div> 756 <span class="font-medium">Tempest alpha 2</span> 757 <p class="text-(--ui-text-dimmed) mt-1 line-clamp-2">Tempest alpha 2 is released with auth support, caching, and more!</p> 758 </div> 759 <div class="flex justify-between items-center gap-x-2 mt-4"> 760 <span class="inline-flex items-center gap-1 px-2 py-1 rounded font-medium text-xs uppercase bg-blue-400/20 dark:bg-blue-400/10 text-blue-700 dark:text-blue-400"> 761 Release </span> 762 <span class="text-(--ui-text-dimmed) text-sm"> 763 by <span class="text-(--ui-text-muted)">Brent</span> on <span class="text-(--ui-text-muted)">October 02, 2024</span> 764 </span> 765 </div> 766 </div> 767 </li> 768 </ul> 769 </div> 770 </main> 771 772 773 774 775 776 777<footer class="flex justify-center items-center gap-4 mb-8"> 778 <a class="flex items-center gap-1 text-lg font-medium transition hover:text-(--ui-primary)" href="https://tempestphp.com/github"> 779 780 781 782<svg class="size-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.5-2c2.8-.3 5.5-1.4 5.5-6a4.6 4.6 0 0 0-1.3-3.2a4.2 4.2 0 0 0-.1-3.2s-1.1-.3-3.5 1.3a12.3 12.3 0 0 0-6.2 0C6.5 2.8 5.4 3.1 5.4 3.1a4.2 4.2 0 0 0-.1 3.2A4.6 4.6 0 0 0 4 9.5c0 4.6 2.7 5.7 5.5 6c-.6.6-.6 1.2-.5 2V21"/></svg> 783 </a> 784 <a class="flex items-center gap-1 text-lg font-medium transition hover:text-(--ui-primary)" href="https://tempestphp.com/bluesky/brent"> 785 786 787 788<svg class="size-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
788<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6.335 5.144C4.681 3.945 2 3.017 2 5.97c0 .59.35 4.953.556 5.661C3.269 14.094 5.686 14.381 8 14c-4.045.665-4.889 3.208-2.667 5.41C6.363 20.428 7.246 21 8 21c2 0 3.134-2.769 3.5-3.5q.5-1 .5-1.5q0 .5.5 1.5c.366.731 1.5 3.5 3.5 3.5c.754 0 1.637-.571 2.667-1.59C20.889 17.207 20.045 14.664 16 14c2.314.38 4.73.094 5.444-2.369c.206-.708.556-5.072.556-5.661c0-2.953-2.68-2.025-4.335-.826C15.372 6.806 12.905 10.192 12 12c-.905-1.808-3.372-5.194-5.665-6.856"/></svg> 789 </a> 790 <a class="flex items-center gap-1 text-lg font-medium transition hover:text-(--ui-primary)" href="https://tempestphp.com/twitter/brent"> 791 792 793 794<svg class="size-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m4 4l11.733 16H20L8.267 4zm0 16l6.768-6.768m2.46-2.46L20 4"/></svg> 795 </a> 796 <a href="/rss" class="flex items-center gap-1 text-lg font-medium transition hover:text-(--ui-primary)"> 797 798 799 800<svg class="size-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 19a1 1 0 1 0 2 0a1 1 0 1 0-2 0M4 4a16 16 0 0 1 16 16M4 11a9 9 0 0 1 9 9"/></svg> 801 </a> 802 <button id="toggle-theme" class="relative size-6 cursor-pointer overflow-hidden transition hover:text-(--ui-primary)"> 803 804 805 806<svg class="absolute inset-0 dark:opacity-0 size-full dark:translate-y-full duration-200" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3h.393a7.5 7.5 0 0 0 7.92 12.446A9 9 0 1 1 12 2.992z"/></svg> 807 808 809 810<svg class="absolute inset-0 opacity-0 dark:opacity-100 size-full -translate-y-full dark:translate-y-0 duration-200" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12a4 4 0 1 0 8 0a4 4 0 1 0-8 0m-5 0h1m8-9v1m8 8h1m-9 8v1M5.6 5.6l.7.7m12.1-.7l-.7.7m0 11.4l.7.7m-12.1-.7l-.7.7"/></svg> 811 </button> 812</footer> 813 814 815
816<script> 817 document.getElementById('toggle-theme').addEventListener('click', () => { 818 toggleDarkMode() 819 }) 820</script>
820 821 822 823 824</body> 825</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.