PageSourceSearch

https://pedestal.io/pedestal/0.8/index.html

html pedestal.io collected 2026-09-25 21:20:55 UTC 19,523 bytes, 502 lines download raw bytes

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&#8217;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  (-&gt; (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&#8217;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&#8217;s extraordinary asynchronous capabilities and Java&#8217;
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>&copy; 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.