1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width,initial-scale=1"> 6 <title>What is Pedestal? :: Pedestal</title> 7 <meta name="generator" content="Antora 3.2.0"> 8<link rel="stylesheet" href="../../_/css/site.css"> 9<link rel="stylesheet" href="../../_/css/custom.css"> 10 </head> 11 <body class="article -toc"> 12<header class="header"> 13 <nav class="navbar"> 14 <div class="navbar-brand"> 15 <img src="../../_/img/pedestal-glyph.png" /> 16 <a class="navbar-item logo-text" href="../../index.html">Pedestal</a> 17 <button class="navbar-burger" data-target="topbar-nav"> 18 <span></span> 19 <span></span> 20 <span></span> 21 </button> 22</div> 23<div id="topbar-nav" class="navbar-menu"> 24 <div class="navbar-end"> 25 <a class="navbar-item" href="../../index.html">Home</a> 26 <div class="navbar-item has-dropdown is-hoverable"> 27 <a class="navbar-link" href="#">Links</a> 28 <div class="navbar-dropdown"> 29 <a class="navbar-item" href="https://github.com/pedestal/pedestal">GitHub Repo</a> 30 <a class="navbar-item" href="https://clojurians.slack.com/archives/C0K65B20P">Clojurians #pedestal slack</a> 31 <a class="navbar-item" href="https://bsky.app/profile/clj-pedestal.bsky.social">Pedestal on Bluesky</a> 32 <a class="navbar-item" href="http://pedestal.io/api/0.8">API Docs</a> 33 </div> 34 </div> 35 </div> 36 <div class="navbar-item search hide-for-print"> 37 <div id="search-field" class="field"> 38 <input id="search-input" type="text" placeholder="Search the docs" autofocus> 39 </div> 40 </div> 41</div> 42 </nav> 43</header> 44<div class="body"> 45<div class="nav-container" data-component="pedestal" data-version="0.8"> 46 <aside class="nav"> 47 <div class="panels"> 48<div class="nav-panel-menu is-active" data-panel="menu"> 49 <nav class="nav-menu"> 50 <button class="nav-menu-toggle" aria-label="Toggle expand/collapse all" style="display: none"></button> 51 <h3 class="title"><a href="index.html">Pedestal</a></h3> 52<ul class="nav-list"> 53 <li class="nav-item" data-depth="0"> 54<ul class="nav-list"> 55 <li class="nav-item is-current-page" data-depth="1"> 56 <a class="nav-link" href="index.html">What is Pedestal?</a> 57 </li> 58 <li class="nav-item" data-depth="1"> 59 <a class="nav-link" href="decision-log.html">Decision Log</a> 60 </li> 61 <li class="nav-item" data-depth="1"> 62 <a class="nav-link" href="deprecations.html">Deprecations</a> 63 </li> 64 <li class="nav-item" data-depth="1"> 65 <a class="nav-link" href="terms.html">Terminology</a> 66 </li> 67</ul> 68 </li> 69 <li class="nav-item" data-depth="0"> 70<ul class="nav-list"> 71 <li class="nav-item" data-depth="1"> 72 <button class="nav-item-toggle"></button> 73 <span class="nav-text">Guides</span> 74<ul class="nav-list"> 75 <li class="nav-item" data-depth="2"> 76 <button class="nav-item-toggle"></button> 77 <span class="nav-text">Getting Started</span> 78<ul class="nav-list"> 79 <li class="nav-item" data-depth="3"> 80 <a class="nav-link" href="guides/hello-world.html">Hello World</a> 81 </li> 82 <li class="nav-item" data-depth="3"> 83 <a class="nav-link" href="guides/hello-world-query-parameters.html">Hello World, With Parameters</a> 84 </li> 85 <li class="nav-item" data-depth="3"> 86 <a class="nav-link" href="guides/hello-world-content-types.html">Hello World, With Content Types</a> 87 </li> 88 <li class="nav-item" data-depth="3"> 89 <a class="nav-link" href="guides/your-first-api.html">Your First API</a> 90 </li> 91</ul> 92 </li> 93 <li class="nav-item" data-depth="2"> 94 <a class="nav-link" href="guides/embedded-template.html">Embedded Template</a> 95 </li> 96 <li class="nav-item" data-depth="2"> 97 <a class="nav-link" href="guides/defining-routes.html">Defining Routes</a> 98 </li> 99 <li class="nav-item" data-depth="2"> 100 <a class="nav-link" href="guides/what-is-an-interceptor.html">What is an Interceptor?</a> 101 </li> 102 <li class="nav-item" data-depth="2"> 103 <a class="nav-link" href="guides/live-repl.html">Reloading at the REPL</a> 104 </li> 105 <li class="nav-item" data-depth="2"> 106 <a class="nav-link" href="guides/pedestal-with-component.html">Using Pedestal With Component</a> 107 </li> 108 <li class="nav-item" data-depth="2"> 109 <a class="nav-link" href="guides/pedestal-with-ssl.html">Using Pedestal With SSL</a> 110 </li> 111 <li class="nav-item" data-depth="2"> 112 <a class="nav-link" href="guides/pedestal-component-2.html">Pedestal with Component (Redux)</a> 113 </li> 114 <li class="nav-item" data-depth="2"> 115 <a class="nav-link" href="guides/unit-testing.html">Unit testing</a> 116 </li> 117 <li class="nav-item" data-depth="2"> 118 <a class="nav-link" href="guides/async.html">Async Request Processing</a> 119 </li> 120 <li class="nav-item" data-depth="2"> 121 <a class="nav-link" href="guides/sse.html">Server-Sent Events</a> 122 </li> 123 <li class="nav-item" data-depth="2"> 124 <a class="nav-link" href="guides/websockets.html">WebSockets</a> 125 </li> 126 <li class="nav-item" data-depth="2"> 127 <a class="nav-link" href="guides/war-deployment.html">WAR Deployment</a> 128 </li> 129</ul> 130 </li> 131</ul> 132 </li> 133 <li class="nav-item" data-depth="0"> 134<ul class="nav-list"> 135 <li class="nav-item" data-depth="1"> 136 <button class="nav-item-toggle"></button> 137 <span class="nav-text">Reference</span> 138<ul class="nav-list"> 139 <li class="nav-item" data-depth="2"> 140 <button class="nav-item-toggle"></button> 141 <span class="nav-text">Pedestal Architecture</span> 142<ul class="nav-list"> 143 <li class="nav-item" data-depth="3"> 144 <a class="nav-link" href="reference/architecture-overview.html">Architecture Overview</a> 145 </li> 146 <li class="nav-item" data-depth="3"> 147 <a class="nav-link" href="reference/important-protocols.html">Important Protocols</a> 148 </li> 149 <li class="nav-item" data-depth="3"> 150 <a class="nav-link" href="reference/context-map.html">Context Map</a> 151 </li> 152 <li class="nav-item" data-depth="3"> 153 <a class="nav-link" href="reference/interceptors.html">Interceptors</a> 154 </li> 155 <li class="nav-item" data-depth="3"> 156 <a class="nav-link" href="reference/connector.html">Connector</a> 157 </li> 158 <li class="nav-item" data-depth="3"> 159 <a class="nav-link" href="reference/chain-providers.html">Chain Providers</a> 160 </li> 161 <li class="nav-item" data-depth="3"> 162 <a class="nav-link" href="reference/error-handling.html">Error Handling</a> 163 </li> 164 <li class="nav-item" data-depth="3">
165 <a class="nav-link" href="reference/specs.html">Specs</a> 166 </li> 167 <li class="nav-item" data-depth="3"> 168 <a class="nav-link" href="reference/dev-mode.html">Development Mode</a> 169 </li> 170</ul> 171 </li> 172 <li class="nav-item" data-depth="2"> 173 <button class="nav-item-toggle"></button> 174 <span class="nav-text">HTTP Handling</span> 175<ul class="nav-list"> 176 <li class="nav-item" data-depth="3"> 177 <a class="nav-link" href="reference/servlet-interceptor.html">Servlet Interceptor</a> 178 </li> 179 <li class="nav-item" data-depth="3"> 180 <a class="nav-link" href="reference/connector-map.html">Connector Map</a> 181 </li> 182 <li class="nav-item" data-depth="3"> 183 <a class="nav-link" href="reference/request-map.html">Request Map</a> 184 </li> 185 <li class="nav-item" data-depth="3"> 186 <a class="nav-link" href="reference/response-map.html">Response Map</a> 187 </li> 188 <li class="nav-item" data-depth="3"> 189 <a class="nav-link" href="reference/response-bodies.html">Response Bodies</a> 190 </li> 191 <li class="nav-item" data-depth="3"> 192 <a class="nav-link" href="reference/resources.html">Resources</a> 193 </li> 194 <li class="nav-item" data-depth="3"> 195 <a class="nav-link" href="reference/parameters.html">Parameters</a> 196 </li> 197 <li class="nav-item" data-depth="3"> 198 <a class="nav-link" href="reference/ring.html">Ring Middleware</a> 199 </li> 200 <li class="nav-item" data-depth="3"> 201 <a class="nav-link" href="reference/default-interceptors.html">Default Interceptors</a> 202 </li> 203 <li class="nav-item" data-depth="3"> 204 <a class="nav-link" href="reference/streaming.html">Streaming Responses</a> 205 </li> 206 <li class="nav-item" data-depth="3"> 207 <a class="nav-link" href="reference/server-sent-events.html">Server-Sent Events</a> 208 </li> 209 <li class="nav-item" data-depth="3"> 210 <a class="nav-link" href="reference/websockets.html">WebSockets</a> 211 </li> 212</ul> 213 </li> 214 <li class="nav-item" data-depth="2"> 215 <button class="nav-item-toggle"></button> 216 <span class="nav-text">Routing and Linking</span> 217<ul class="nav-list"> 218 <li class="nav-item" data-depth="3"> 219 <a class="nav-link" href="reference/routing-quick-reference.html">Routing Quick Reference</a> 220 </li> 221 <li class="nav-item" data-depth="3"> 222 <button class="nav-item-toggle"></button> 223 <span class="nav-text">Routing Specification Syntax</span> 224<ul class="nav-list"> 225 <li class="nav-item" data-depth="4"> 226 <a class="nav-link" href="reference/table-syntax.html">Table Syntax</a> 227 </li> 228 <li class="nav-item" data-depth="4"> 229 <a class="nav-link" href="reference/terse-syntax.html">Terse Syntax</a> 230 </li> 231 <li class="nav-item" data-depth="4"> 232 <a class="nav-link" href="reference/verbose-syntax.html">Verbose Syntax</a> 233 </li> 234</ul> 235 </li> 236 <li class="nav-item" data-depth="3"> 237 <a class="nav-link" href="reference/routing-changes.html">Routing Changes in 0.8</a> 238 </li> 239 <li class="nav-item" data-depth="3"> 240 <button class="nav-item-toggle"></button> 241 <span class="nav-text">Routers</span> 242<ul class="nav-list"> 243 <li class="nav-item" data-depth="4"> 244 <a class="nav-link" href="reference/sawtooth-router.html">Sawtooth Router</a> 245 </li> 246 <li class="nav-item" data-depth="4"> 247 <a class="nav-link" href="reference/map-tree-router.html">Map Tree Router</a> 248 </li> 249 <li class="nav-item" data-depth="4"> 250 <a class="nav-link" href="reference/linear-search-router.html">Linear Search Router</a> 251 </li> 252 <li class="nav-item" data-depth="4"> 253 <a class="nav-link" href="reference/prefix-tree-router.html">Prefix Tree Router</a> 254 </li> 255</ul> 256 </li> 257</ul> 258 </li> 259 <li class="nav-item" data-depth="2"> 260 <a class="nav-link" href="reference/verb-smuggling.html">Verb Smuggling</a> 261 </li> 262 <li class="nav-item" data-depth="2"> 263 <button class="nav-item-toggle"></button> 264 <span class="nav-text">Deployment and Operations</span> 265<ul class="nav-list"> 266 <li class="nav-item" data-depth="3"> 267 <a class="nav-link" href="reference/config.html">Configuration</a> 268 </li> 269 <li class="nav-item" data-depth="3"> 270 <button class="nav-item-toggle"></button> 271 <span class="nav-text">Connectors</span> 272<ul class="nav-list"> 273 <li class="nav-item" data-depth="4"> 274 <a class="nav-link" href="reference/jetty.html">Jetty 12</a> 275 </li> 276 <li class="nav-item" data-depth="4"> 277 <a class="nav-link" href="reference/http-kit.html">Http-Kit</a> 278 </li> 279 <li class="nav-item" data-depth="4"> 280 <a class="nav-link" href="reference/immutant.html">Immutant</a> 281 </li> 282 <li class="nav-item" data-depth="4"> 283 <a class="nav-link" href="reference/tomcat.html">Tomcat</a> 284 </li> 285</ul> 286 </li> 287 <li class="nav-item" data-depth="3"> 288 <a class="nav-link" href="reference/logging.html">Logging</a> 289 </li> 290 <li class="nav-item" data-depth="3"> 291 <a class="nav-link" href="reference/metrics.html">Metrics</a> 292 </li> 293</ul> 294 </li> 295 <li class="nav-item" data-depth="2"> 296 <a class="nav-link" href="reference/libraries.html">Pedestal Libraries</a> 297 </li> 298 <li class="nav-item" data-depth="2"> 299 <a class="nav-link" href="http://pedestal.io/api/0.8">API Docs</a> 300 </li> 301</ul> 302 </li> 303</ul> 304 </li> 305 <li class="nav-item" data-depth="0"> 306<ul class="nav-list"> 307 <li class="nav-item" data-depth="1"> 308 <a class="nav-link" href="contributing.html">Contributing to Pedestal</a> 309 </li> 310 <li class="nav-item" data-depth="1"> 311 <a class="nav-link" href="code-of-conduct.html">Code of Conduct</a> 312 </li> 313 <li class="nav-item" data-depth="1"> 314 <a class="nav-link" href="privacy.html">Privacy Policy</a> 315 </li> 316</ul> 317 </li> 318</ul> 319 </nav> 320</div> 321<div class="nav-panel-explore" data-panel="explore"> 322 <div class="context"> 323 <span class="title">Pedestal</span> 324 <span class="version">0.8</span> 325 </div> 326 <ul class="components"> 327 <li class="component is-current"> 328 <div class="title"><a href="index.html">Pedestal</a></div> 329 <ul class="versions"> 330 <li class="version is-current is-latest"> 331 <a href="index.html">0.8</a> 332 </li> 333 <li class="version"> 334 <a href="../0.7/index.html">0.7</a> 335 </li> 336 <li class="version"> 337 <a href="../0.6/index.html">0.6</a> 338 </li> 339 </ul> 340 </li> 341 </ul> 342</div> 343 </div> 344 </aside> 345</div> 346<main class="article"> 347<div class="toolbar" role="navigation"> 348<button class="nav-toggle"></button> 349 <a href="index.html" class="home-link is-current"></a> 350<nav class="breadcrumbs" aria-label="breadcrumbs"> 351 <ul> 352 <li><a href="index.html">Pedestal</a></li> 353 <li><a href="index.html">What is Pedestal?</a></li> 354 </ul> 355</nav> 356<div class="page-versions"> 357 <button class="version-menu-toggle" title="Show other versions of page">0.8</button> 358 <div class="version-menu"> 359 <a class="version is-current" href="index.html">0.8</a> 360 <a class="version" href="../0.7/index.html">0.7</a> 361 <a class="version" href="../0.6/index.html">0.6</a> 362 </div> 363</div> 364<div class="edit-this-page"><a href="https://github.com/pedestal/pedestal/edit/master/docs/modules/ROOT/pages/index.adoc">Edit this Page</a></div> 365</div> 366 <div class="content"> 367<aside class="toc sidebar" data-title="Contents" data-levels="2"> 368 <div class="toc-menu"></div> 369</aside> 370<article class="doc"> 371<h1 class="page">What is Pedestal?</h1> 372<div id="preamble"> 373<div class="sectionbody"> 374<div class="paragraph"> 375<p>Pedestal is a sturdy and reliable base for services, APIs, and applications. Pedestal runs in the back-end and can handle
376anything from tiny static web sites, to traditional page oriented applications, to dynamic single page applications utilizing server-sent events and WebSockets.</p> 377</div> 378<div class="paragraph"> 379<p>Pedestal was created to bring Clojure’s key attributes, <strong>Focus</strong>, <strong>Empowerment</strong>, and <strong>Simplicity</strong>, to the domain of Clojure web development.</p> 380</div> 381<div class="listingblock front-page-sample"> 382<div class="content"> 383<pre class="highlightjs highlight"><code class="language-clojure hljs" data-lang="clojure">(ns front-page 384 (:require [io.pedestal.connector :as conn] 385 [io.pedestal.http.http-kit :as hk])) 386 387(defn- greet-handler 388 [_request] 389 {:status 200 390 :body "Hello, world!"}) 391 392(defn start! 393 [] 394 (-> (conn/default-connector-map 8080) 395 (conn/with-default-interceptors) 396 (conn/with-routes 397 #{["/greet" :get greet-handler]}) 398 (hk/create-connector nil) 399 (conn/start!)))</code></pre> 400</div> 401</div> 402<div class="paragraph"> 403<p>Pedestal applications can start <strong>tiny</strong>, but Pedestal scales up with your needs.</p> 404</div> 405<div class="paragraph"> 406<p>This documentation is for Pedestal version <strong>0.8.2-beta-11</strong>.</p> 407</div> 408<div class="paragraph"> 409<p><span class="image"><img src="https://github.com/pedestal/pedestal/workflows/CI/badge.svg" alt="CI"></span> 410<a href="https://clojars.org/io.pedestal/pedestal.service"><span class="image"><img src="https://img.shields.io/clojars/v/io.pedestal/pedestal.service.svg" alt="pedestal.service"></span></a></p> 411</div> 412<div class="paragraph"> 413<p>Pedestal requires Clojure 1.11 or later.</p> 414</div> 415<div class="paragraph"> 416<p>Pedestal is agnostic about the underlying HTTP library; it works with both the <a href="https://jakarta.ee/specifications/servlet/">Jakarta Servlet API</a> and non-servlet libraries via 417network connectors; it currently provides connectors for:</p> 418</div> 419<div class="ulist"> 420<ul> 421<li> 422<p><a href="reference/jetty.html" class="xref page">Jetty 12</a> and Servlet API 5</p> 423</li> 424<li> 425<p><a href="reference/http-kit.html" class="xref page">Http-Kit</a></p> 426</li> 427</ul> 428</div> 429<div class="paragraph"> 430<p>... with more connectors coming.</p> 431</div> 432</div> 433</div> 434<div class="sect1"> 435<h2 id="_features"><a class="anchor" href="#_features"></a>Features</h2> 436<div class="sectionbody"> 437<div class="sect2"> 438<h3 id="_ready_for_production"><a class="anchor" href="#_ready_for_production"></a>Ready for Production</h3> 439<div class="paragraph"> 440<p>Pedestal runs where Java runs: Applications can be deployed as standalone Clojure applications, or as WAR files in a servlet container. 441Pedestal integrates with <a href="https://opentelemetry.io/">Open Telemetry</a> to give you visibility into your running services.</p> 442</div> 443</div> 444<div class="sect2"> 445<h3 id="_secure_by_default"><a class="anchor" href="#_secure_by_default"></a>Secure By Default</h3> 446<div class="paragraph"> 447<p>Pedestal automatically uses secure headers, 448enables <a href="https://en.wikipedia.org/wiki/Cross-site_request_forgery">cross site request forgery</a> protection, 449and other best practices.</p> 450</div> 451<div class="paragraph"> 452<p>It works with <a href="https://en.wikipedia.org/wiki/Cross-origin_resource_sharing">cross-origin resource sharing</a> to 453allow secure front end applications.</p> 454</div> 455</div> 456<div class="sect2"> 457<h3 id="_easy_ramp_up"><a class="anchor" href="#_easy_ramp_up"></a>Easy Ramp Up</h3> 458<div class="paragraph"> 459<p>A simple Pedestal app fits into a few lines of Clojure; Pedestal includes a 460<a href="guides/embedded-template.html" class="xref page">deps-new template</a> for getting you started. 461When you need more power, it’s ready for you.</p> 462</div> 463</div> 464<div class="sect2"> 465<h3 id="_testable"><a class="anchor" href="#_testable"></a>Testable</h3> 466<div class="paragraph"> 467<p>Pedestal embraces testability as a first-class concern. 468The core interceptor model breaks request processing into small pieces that are simple, often free of side effects, and therefore easy to 469test; then lets you stack those pieces up to form your full application. Pedestal provides a testing API that can fully exercise your 470synchronous and asynchronous code without actually starting a web server.</p> 471</div> 472</div> 473<div class="sect2"> 474<h3 id="_streaming"><a class="anchor" href="#_streaming"></a>Streaming</h3> 475<div class="paragraph"> 476<p>Pedestal supports creating dynamic applications with server-sent events and WebSockets. 477Pedestal leverages Clojure’s extraordinary asynchronous capabilities and Java’
477s efficient non-blocking IO runtime.</p> 478</div> 479</div> 480<div class="sect2"> 481<h3 id="_composable_and_extensible"><a class="anchor" href="#_composable_and_extensible"></a>Composable and Extensible</h3> 482<div class="paragraph"> 483<p>Pedestal is built from components that connect via protocols, giving you the flexibility to swap out any part with something 484customized to your application.</p> 485</div> 486</div> 487</div> 488</div> 489</article> 490 </div> 491</main> 492</div> 493<footer class="footer"> 494 <p>© 2013-2026 NuBank NA</p> 495</footer>
496<script id="site-script" src="../../_/js/site.js" data-ui-root-path="../../_"></script>
vendor: 1 bytes, line 496
496
497<script async src="../../_/js/vendor/highlight.js"></script>
vendor: 1 bytes, line 497
497
498<script src="../../_/js/vendor/lunr.js"></script>
vendor: 1 bytes, line 498
498
499<script src="../../_/js/search-ui.js" id="search-ui-script" data-site-root-path="../.." data-snippet-length="100" data-stylesheet="../../_/css/search.css"></script>
vendor: 1 bytes, line 499
499
500<script async src="../../search-index.js"></script>
500 501 </body> 502</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.