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>Pkl :: Pkl Docs</title> 7 <link rel="canonical" href="https://pkl-lang.org/index.html"> 8 <link rel="next" href="community.html"> 9 <meta name="generator" content="Antora 3.1.15"> 10 <link rel="stylesheet" href="./_/css/site.css"> 11<link rel="stylesheet" href="./_/css/theme-vars.css"> 12<link rel="stylesheet" href="./_/css/theme-switch.css"> 13<link rel="stylesheet" href="./_/css/site-extra.css"> 14<link rel="stylesheet" href="./_/css/search.css"> 15<link rel="stylesheet" href="./_/css/syntax-highlights.css"> 16<link rel="stylesheet" href="./_/css/vendor/tabs.css"> 17<link rel="icon" type="image/svg+xml" href="./_/img/favicon.svg"> 18<link rel="apple-touch-icon" sizes="180x180" href="./_/img/apple-touch-icon.png"> 19<link rel="icon" type="image/png" sizes="32x32" href="./_/img/favicon-32x32.png"> 20<link rel="icon" type="image/png" sizes="16x16" href="./_/img/favicon-16x16.png">
21<script src="./_/js/theme-switcher.js"></script>
21 22 <link rel="stylesheet" href="./_/css/landing.css"> 23</head> 24<body> 25 <header class="header"> 26 <nav class="navbar navbar-top"> 27 <div class="navbar-brand"> 28 <div class="navbar-item"> 29 <a href="./index.html"><img src="./_/img/favicon.svg" alt="Pkl" height="35" width="35"/></a> 30 <a href="./index.html">Pkl</a> 31 </div> 32 <button class="navbar-burger" aria-controls="topbar-nav" aria-expanded="false" aria-label="Toggle main menu"> 33 <span></span> 34 <span></span> 35 <span></span> 36 </button> 37 </div> 38 <div id="topbar-nav" class="navbar-menu"> 39 <div class="navbar-item search hide-for-print"> 40 <div id="search-field" class="field"> 41 <input id="search-input" type="text" placeholder="Enter Search Term" autofocus> 42 </div> 43 </div> 44 <div class="navbar-end"> 45 <a class="navbar-item" href="./main/current/index.html">Language</a> 46 <div class="navbar-item has-dropdown is-hoverable"> 47 <a href="./main/current/language-bindings.html" class="navbar-link">Bindings</a> 48 <div class="navbar-dropdown"> 49 <a class="navbar-item" href="./main/current/java-binding/index.html">Java</a> 50 <a class="navbar-item" href="./main/current/kotlin-binding/index.html">Kotlin</a> 51 <a class="navbar-item" href="./swift/current/index.html">Swift</a> 52 <a class="navbar-item" href="./go/current/index.html">Go</a> 53 </div> 54 </div> 55 <div class="navbar-item has-dropdown is-hoverable"> 56 <a href="./main/current/integrations.html" class="navbar-link">Frameworks</a> 57 <div class="navbar-dropdown"> 58 <a class="navbar-item" href="./spring/current/index.html">Spring (Boot)</a> 59 </div> 60 </div> 61 <div class="navbar-item has-dropdown is-hoverable"> 62 <a href="./main/current/tools.html" class="navbar-link">Editors</a> 63 <div class="navbar-dropdown"> 64 <a class="navbar-item" href="./intellij/current/index.html">IntelliJ</a> 65 <a class="navbar-item" href="./neovim/current/index.html">Neovim</a> 66 <a class="navbar-item" href="./vscode/current/index.html">VS Code</a> 67 <a class="navbar-item" href="./lsp/current/index.html">Pkl Language Server</a> 68 </div> 69 </div> 70 <div class="navbar-item has-dropdown is-hoverable"> 71 <a href="./main/current/resources.html" class="navbar-link">Resources</a> 72 <div class="navbar-dropdown"> 73 <a class="navbar-item" href="https://github.com/apple/pkl">GitHub</a> 74 <a class="navbar-item" href="https://pkl-lang.org/package-docs/pkl/current/index.html">Standard Library</a> 75 <a class="navbar-item" href="https://pkl-lang.org/package-docs/">Package Docs</a> 76 <a class="navbar-item" href="./main/current/style-guide/index.html">Style Guide</a> 77 <a class="navbar-item" href="./security.html">Security</a> 78 </div> 79 </div> 80 <div class="navbar-item has-dropdown is-hoverable"> 81 <a href="./community.html" class="navbar-link">Community</a> 82 <div class="navbar-dropdown is-right"> 83 <a class="navbar-item" href="https://github.com/apple/pkl/discussions" target="_blank">GitHub Discussions</a> 84 <a class="navbar-item" href="./blog/index.html">Blog</a> 85 </div> 86 </div> 87 </div> 88 </div> 89 </nav> 90</header> 91 <div class="exampleblock container-land"> 92<div class="content"> 93<div class="header-spacer"></div> 94<div class="exampleblock hero-big"> 95<div class="content"> 96<div class="exampleblock title"> 97<div class="content"> 98<div class="paragraph"> 99<p>Configuration that is <strong>Programmable</strong>, <strong>Scalable</strong>, and <strong>Safe</strong></p> 100</div> 101<div class="hero-actions"> 102<!--<a href="main/current/language-tutorial/index.html" class="xref page">Get Started</a>--> 103<a href="main/current/pkl-cli/index.html#installation" class="xref page">Install</a> 104</div> 105</div> 106</div> 107<div class="separator"></div> 108</div> 109</div> 110<div class="hero-duo"> 111<div class="exampleblock doc"> 112<div class="content"> 113<div class="listingblock"> 114<div class="title">bird.pkl</div> 115<div class="content"> 116<pre class="highlightjs highlight"><code class="language-pkl hljs" data-lang="pkl"><span class="hljs-property">
116name</span> <span class="hljs-operator">=</span> <span class="hljs-string">"Swallow"</span> 117 118<span class="hljs-property">job</span> <span class="hljs-punctuation">{</span> 119 <span class="hljs-property">title</span> <span class="hljs-operator">=</span> <span class="hljs-string">"Sr. Nest Maker"</span> 120 <span class="hljs-property">company</span> <span class="hljs-operator">=</span> <span class="hljs-string">"Nests R Us"</span> 121 <span class="hljs-property">yearsOfExperience</span> <span class="hljs-operator">=</span> <span class="hljs-number">2</span> 122<span class="hljs-punctuation">}</span></code></pre> 123</div> 124</div> 125<div class="paragraph hero-arrow"> 126<p>â</p> 127</div> 128<div role="tablist" class="automatic"> 129 <button id="tab-1" type="button" role="tab" aria-selected="true" aria-controls="tabpanel-1"> 130 <span>bird.json</span> 131 </button><button id="tab-2" type="button" role="tab" aria-selected="false" aria-controls="tabpanel-2"> 132 <span>bird.yaml</span> 133 </button><button id="tab-3" type="button" role="tab" aria-selected="false" aria-controls="tabpanel-3"> 134 <span>bird.plist</span> 135 </button><button id="tab-4" type="button" role="tab" aria-selected="false" aria-controls="tabpanel-4"> 136 <span>bird.properties</span> 137 </button> 138</div> 139<div id="tabpanel-1" role="tabpanel" tabindex="0" aria-labelledby="tab-1"> 140<div class="listingblock"> 141<div class="content"> 142<pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">{ 143 "name": "Swallow", 144 "job": { 145 "title": "Sr. Nest Maker", 146 "company": "Nests R Us", 147 "yearsOfExperience": 2 148 } 149}</code></pre> 150</div> 151</div> 152</div> 153<div id="tabpanel-2" role="tabpanel" tabindex="0" aria-labelledby="tab-2" class="is-hidden"> 154<div class="listingblock"> 155<div class="content"> 156<pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">name: Swallow 157job: 158 title: Sr. Nest Maker 159 company: Nests R Us 160 yearsOfExperience: 2</code></pre> 161</div> 162</div> 163</div> 164<div id="tabpanel-3" role="tabpanel" tabindex="0" aria-labelledby="tab-3" class="is-hidden"> 165<div class="listingblock"> 166<div class="content"> 167<pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><?xml version="1.0" encoding="UTF-8"?> 168<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 169<plist version="1.0"> 170<dict> 171 <key>name</key> 172 <string>Swallow</string> 173 <key>job</key> 174 <dict> 175 <key>title</key> 176 <string>Sr. Nest Maker</string> 177 <key>company</key> 178 <string>Nests R Us</string> 179 <key>yearsOfExperience</key> 180 <integer>2</integer> 181 </dict> 182</dict> 183</plist></code></pre> 184</div> 185</div> 186</div> 187<div id="tabpanel-4" role="tabpanel" tabindex="0" aria-labelledby="tab-4" class="is-hidden"> 188<div class="listingblock"> 189<div class="content"> 190<pre class="highlightjs highlight"><code class="language-properties hljs" data-lang="properties">name = Swallow 191job.title = Sr. Nest Maker 192job.company = Nests R Us 193job.yearsOfExperience = 2</code></pre> 194</div> 195</div> 196</div> 197</div> 198</div> 199<div class="exampleblock doc"> 200<div class="content"> 201<div class="openblock hero-title"> 202<div class="content"> 203<div class="paragraph"> 204<p>Generate any static configuration format</p> 205</div> 206</div> 207</div> 208<div class="paragraph"> 209<p>Define all your data in Pkl, and generate output for JSON, YAML, Property Lists, and other 210configuration formats.</p> 211</div> 212</div> 213</div> 214</div> 215<div class="hero-duo secondary"> 216<div class="exampleblock doc"> 217<div class="content"> 218<div class="openblock hero-title"> 219<div class="content"> 220<div class="paragraph"> 221<p>Integrated application configuration</p> 222</div> 223</div> 224</div> 225<div class="paragraph"> 226<p>Embed Pkl into your applications for runtime configuration, and receive code generation for 227<strong>Java</strong>, <strong>Kotlin</strong>, <strong>Swift</strong>, and <strong>Go</strong>.</p> 228</div> 229<div class="paragraph logos"> 230<p><span class="image"><img src="_images/java_logo.svg" alt="java logo"></span> <span class="image"><img src="_images/kotlin_logo.svg" alt="kotlin logo"></span> <span class="image"><img src="_images/swift_logo.svg" alt="swift logo"></span> <span class="image"><img src="_images/go_logo.svg" alt="go logo"></span></p> 231</div> 232</div> 233</div> 234<div class="exampleblock doc"> 235<div class="content"> 236<div role="tablist" class="automatic"> 237 <button id="tab2-1" type="button" role="tab" aria-selected="true" aria-controls="tabpanel2-1"> 238 <span>Pkl</span> 239 </button> 240 <button id="tab2-2" type="button" role="tab" aria-selected="false" aria-controls="tabpanel2-2"> 241 <span>Java</span> 242 </button> 243 <button id="tab2-3" type="button" role="tab" aria-selected="false" aria-controls="tabpanel2-3"> 244 <span>Kotlin</span> 245 </button> 246 <button id="tab2-4" type="button" role="tab" aria-selected="false" aria-controls="tabpanel2-4"> 247 <span>
247Swift</span> 248 </button> 249 <button id="tab2-5" type="button" role="tab" aria-selected="false" aria-controls="tabpanel2-5"> 250 <span>Go</span> 251 </button> 252</div> 253<div id="tabpanel2-1" role="tabpanel" tabindex="0" aria-labelledby="tab2-1"> 254<div class="listingblock"> 255<div class="content"> 256<pre class="highlightjs highlight"><code class="language-pkl hljs" data-lang="pkl"><span class="hljs-keyword">module</span> example<span class="hljs-punctuation">.</span><span class="hljs-title class_">MyAppConfig</span> 257 258<span class="hljs-comment">/// The hostname for the application</span> 259<span class="hljs-property">host</span><span class="hljs-punctuation">:</span> <span class="hljs-title class_">String</span> 260 261<span class="hljs-comment">/// The port to listen on</span> 262<span class="hljs-property">port</span><span class="hljs-punctuation">:</span> <span class="hljs-title class_">UInt16</span><span class="hljs-punctuation">(</span><span class="hljs-keyword">this</span> <span class="hljs-operator">></span> <span class="hljs-number">1000</span><span class="hljs-punctuation">)</span></code></pre> 263</div> 264</div> 265</div> 266<div id="tabpanel2-2" role="tabpanel" tabindex="0" aria-labelledby="tab2-2" class="is-hidden"> 267<div class="listingblock"> 268<div class="content"> 269<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">package example; 270 271public final class MyAppConfig { 272 /** 273 * The hostname for the application 274 */ 275 public final @NonNull String host; 276 277 /** 278 * The port to listen on 279 */ 280 public final int port; 281 282 public MyAppConfig( 283 @Named("host") @NonNull String host, 284 @Named("port") int port) { 285 this.host = host; 286 this.port = port; 287 } 288 289 public MyAppConfig withHost(@NonNull String host) { /*...*/ } 290 291 public MyAppConfig withPort(int port) { /*...*/ } 292 293 @Override 294 public boolean equals(Object obj) { /*...*/ } 295 296 @Override 297 public int hashCode() { /*...*/ } 298 299 @Override 300 public String toString() { /*...*/ } 301}</code></pre> 302</div> 303</div> 304</div> 305<div id="tabpanel2-3" role="tabpanel" tabindex="0" aria-labelledby="tab2-3" class="is-hidden"> 306<div class="listingblock"> 307<div class="content"> 308<pre class="highlightjs highlight"><code class="language-kotlin hljs" data-lang="kotlin">package example 309 310data class MyAppConfig( 311 /** 312 * The hostname for the application 313 */ 314 val host: String, 315 /** 316 * The port to listen on 317 */ 318 val port: Int 319)</code></pre> 320</div> 321</div> 322</div> 323<div id="tabpanel2-4" role="tabpanel" tabindex="0" aria-labelledby="tab2-4" class="is-hidden"> 324<div class="listingblock"> 325<div class="content"> 326<pre class="highlightjs highlight"><code class="language-swift hljs" data-lang="swift">// Code generated from Pkl module `example.myAppConfig`. DO NOT EDIT. 327enum MyAppConfig {} 328 329extension MyAppConfig { 330 struct Module { 331 /// The hostname for the application 332 let host: String 333 334 /// The port to listen on 335 let port: UInt16 336 } 337}</code></pre> 338</div> 339</div> 340</div> 341<div id="tabpanel2-5" role="tabpanel" tabindex="0" aria-labelledby="tab2-5" class="is-hidden"> 342<div class="listingblock"> 343<div class="content"> 344<pre class="highlightjs highlight"><code class="language-go hljs" data-lang="go">// Code generated from Pkl module `example.myAppConfig`. DO NOT EDIT. 345package myappconfig 346 347import ( 348 "context" 349 350 "github.com/apple/pkl-go/pkl" 351) 352 353type MyAppConfig struct { 354 // The hostname for the application 355 Host string `pkl:"host"` 356 357 // The port to listen on 358 Port uint16 `pkl:"port"` 359}</code></pre> 360</div> 361</div> 362</div> 363</div> 364</div> 365</div> 366<div class="hero-duo"> 367<div class="exampleblock doc"> 368<div class="content"> 369<div class="imageblock"> 370<div class="content"> 371<img src="_images/intellij.gif" alt="intellij"> 372</div> 373</div> 374</div> 375</div> 376<div class="exampleblock doc"> 377<div class="content"> 378<div class="openblock hero-title"> 379<div class="content"> 380<div class="paragraph"> 381<p>Incredible IDE Integration</p> 382</div> 383</div> 384</div> 385<div class="paragraph"> 386<p>Great tooling for writing Pkl with the same ease as a static typed language. We offer plugins and extensions for IntelliJ, 387Visual Studio Code, and Neovim, and also provide the Pkl Language Server so you can easily create your own editor integrations.</p> 388</div> 389</div> 390</div> 391</div> 392<div class="hero-duo secondary"> 393<div class="exampleblock doc"> 394<div class="content"> 395<div class="openblock hero-title"> 396<div class="content"> 397<div class="paragraph"> 398<p>Catch errors before deployment</p> 399</div> 400</div> 401</div> 402<div class="paragraph"> 403<p>With a rich type and validation system, catch configuration errors before deploying your application.</p> 404</div> 405</div> 406</div> 407<div class="exampleblock doc"> 408<div class="content"> 409<div class="listingblock"> 410<div class="content"> 411<pre class="highlightjs highlight"><code class="language-pkl hljs" data-lang="pkl"><span class="hljs-property">email</span><span class="hljs-punctuation">:</span> <span class="hljs-title class_">String</span> <span class="hljs-operator">=</span> <span class="hljs-string">"[email protected]"</span> 412 413<span class="hljs-property">port</span><span class="hljs-punctuation">:</span> <span class="hljs-title class_">Int</span><span class="hljs-punctuation">(</span><span class="hljs-keyword">this</span> <span class="hljs-operator">></span> <span class="hljs-number">1000</span><span class="hljs-punctuation">)</span> <span class="hljs-operator">=</span> <span class="hljs-number">80</span></code></pre> 414</div> 415</div> 416<div class="paragraph hero-arrow"> 417<p>â</p> 418</div> 419<div class="listingblock"> 420<div class="content"> 421<pre class="highlightjs highlight"><code class="language-text hljs" data-lang="text"><span style="color:var(--ansi-red, #cc0000);">ââ Pkl Error ââ</span> 422<span style="color:var(--ansi-red, #cc0000);font-weight:var(--ansi-bold-font-weight, 600);">Type constraint `this > 1000` violated. 423Value: 80 424 425</span> this > 1000 426 <span style="opacity:var(--ansi-dim-opacity, 0.7);">â</span> <span style="opacity:var(--ansi-dim-opacity, 0.7);">â</span> 427 <span style="color:var(--ansi-green, #4e9a06);">80</span> <span style="color:var(--ansi-cyan, #06989a);">
427false</span><span style="color:var(--ansi-red, #cc0000);font-weight:var(--ansi-bold-font-weight, 600);"></span> 428 429<span style="color:var(--ansi-yellow, #c4a000);"></span><span style="opacity:var(--ansi-dim-opacity, 0.7);">3 | </span>port: Int(<span style="color:var(--ansi-blue, #3465a4);">this</span> > <span style="color:var(--ansi-green, #4e9a06);">1000</span>) = <span style="color:var(--ansi-green, #4e9a06);">80</span> 430<span style="color:var(--ansi-yellow, #c4a000);"></span> <span style="color:var(--ansi-red, #cc0000);">^^^^^^^^^^^</span> 431<span style="color:var(--ansi-yellow, #c4a000);"></span><span style="opacity:var(--ansi-dim-opacity, 0.7);">at config#port (file:///config.pkl, line 3</span><span style="opacity:var(--ansi-dim-opacity, 0.7);">) 432</span><span style="color:var(--ansi-yellow, #c4a000);"></span> 433<span style="color:var(--ansi-yellow, #c4a000);"></span><span style="opacity:var(--ansi-dim-opacity, 0.7);">3 | </span>port: Int(<span style="color:var(--ansi-blue, #3465a4);">this</span> > <span style="color:var(--ansi-green, #4e9a06);">1000</span>) = <span style="color:var(--ansi-green, #4e9a06);">80</span> 434<span style="color:var(--ansi-yellow, #c4a000);"></span> <span style="color:var(--ansi-red, #cc0000);">^^</span> 435<span style="color:var(--ansi-yellow, #c4a000);"></span><span style="opacity:var(--ansi-dim-opacity, 0.7);">at config#port (file:///config.pkl, line 3</span><span style="opacity:var(--ansi-dim-opacity, 0.7);">) 436</span><span style="color:var(--ansi-yellow, #c4a000);"></span> 437<span style="color:var(--ansi-yellow, #c4a000);"></span><span style="opacity:var(--ansi-dim-opacity, 0.7);">131 | </span>renderer.renderDocument(value) 438<span style="color:var(--ansi-yellow, #c4a000);"></span> <span style="color:var(--ansi-red, #cc0000);">^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</span> 439<span style="color:var(--ansi-yellow, #c4a000);"></span><span style="opacity:var(--ansi-dim-opacity, 0.7);">at pkl.base#Module.output.text 440</span></code></pre> 441</div> 442</div> 443</div> 444</div> 445</div> 446</div> 447</div> 448 <footer class="footer"> 449 <div class="footer-content"> 450 <p>Copyright © 2024-2025 Apple Inc. All rights reserved.</p> 451 <div class="theme-selector"> 452 <label for="theme-select">Theme</label> 453 <select id="theme-select" class="theme-dropdown"> 454 <option value="system">ð» System</option> 455 <option value="light">âï¸ Light</option> 456 <option value="dark">ð Dark</option> 457 </select> 458 </div> 459 </div> 460</footer> 461
461<script src="./_/js/site.js"></script>
vendor: 1 bytes, line 461
461
462<script src="./_/js/site-support.js"></script>
vendor: 1 bytes, line 462
462
463<script async src="./_/js/vendor/highlight.js"></script>
vendor: 1 bytes, line 463
463
464<script src="./_/js/landing-page-support.js"></script>
464 465</body> 466</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.