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 Blog :: Pkl Docs</title> 7 <link rel="canonical" href="https://pkl-lang.org/blog/index.html"> 8 <meta name="generator" content="Antora 3.1.15"> 9 <link rel="stylesheet" href="../_/css/site.css"> 10<link rel="stylesheet" href="../_/css/theme-vars.css"> 11<link rel="stylesheet" href="../_/css/theme-switch.css"> 12<link rel="stylesheet" href="../_/css/site-extra.css"> 13<link rel="stylesheet" href="../_/css/search.css"> 14<link rel="stylesheet" href="../_/css/syntax-highlights.css"> 15<link rel="stylesheet" href="../_/css/vendor/tabs.css"> 16<link rel="icon" type="image/svg+xml" href="../_/img/favicon.svg"> 17<link rel="apple-touch-icon" sizes="180x180" href="../_/img/apple-touch-icon.png"> 18<link rel="icon" type="image/png" sizes="32x32" href="../_/img/favicon-32x32.png"> 19<link rel="icon" type="image/png" sizes="16x16" href="../_/img/favicon-16x16.png">
20<script src="../_/js/theme-switcher.js"></script>
20 21 </head> 22 <body class="article"> 23<header class="header"> 24 <nav class="navbar"> 25 <div class="navbar-brand"> 26 <div class="navbar-item"> 27 <a href="../index.html"><img src="../_/img/favicon.svg" alt="Pkl" height="35" width="35"/></a> 28 <a href="../index.html">Pkl</a> 29 <span class="separator">//</span> 30 <a href="../main/current/index.html">Docs</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"> 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="body"> 92<div class="nav-container" data-component="blog" data-version=""> 93 <aside class="nav"> 94 <div class="panels"> 95<div class="nav-panel-menu is-active" data-panel="menu"> 96 <nav class="nav-menu"> 97 <button class="nav-menu-toggle" aria-label="Toggle expand/collapse all" style="display: none"></button> 98 <h3 class="title"><a href="index.html">Pkl Blog</a></h3> 99<ul class="nav-list"> 100 <li class="nav-item" data-depth="0"> 101<ul class="nav-list"> 102 <li class="nav-item" data-depth="1"> 103 <a class="nav-link" href="building-cli-tools-with-pkl.html">Building CLI Tools with Pkl</a> 104 </li> 105 <li class="nav-item" data-depth="1"> 106 <a class="nav-link" href="how-we-manage-github-actions.html">How we manage GitHub Actions</a> 107 </li> 108 <li class="nav-item" data-depth="1"> 109 <a class="nav-link" href="using-packages-in-air-gapped-environments.html">Using packages in air-gapped environments</a> 110 </li> 111 <li class="nav-item" data-depth="1"> 112 <a class="nav-link" href="know-your-place.html">Know Your Place</a> 113 </li> 114 <li class="nav-item" data-depth="1"> 115 <a class="nav-link" href="using-types.html">Taking types to the next level</a> 116 </li> 117 <li class="nav-item" data-depth="1"> 118 <a class="nav-link" href="class-as-a-function.html">Class-as-a-Function Pattern</a> 119 </li> 120 <li class="nav-item" data-depth="1"> 121 <a class="nav-link" href="pkl-evolution.html">Pkl Evolution</a> 122 </li> 123 <li class="nav-item" data-depth="1"> 124 <a class="nav-link" href="testing-in-pkl.html">Testing in Pkl</a> 125 </li> 126 <li class="nav-item" data-depth="1"> 127 <a class="nav-link" href="introducing-pkl.html">Introducing Pkl, a programming language for configuration</a> 128 </li> 129</ul> 130 </li> 131</ul> 132 </nav> 133</div> 134<div class="nav-panel-explore" data-panel="explore"> 135 <div class="context"> 136 <span class="title">Pkl Blog</span> 137 <span class="version"></span> 138 </div> 139 <ul class="components"> 140 <li class="component"> 141 <div class="title"><a href="../intellij/current/index.html">IntelliJ Plugin</a></div> 142 <ul class="versions"> 143 <li class="version is-latest"> 144 <a href="../intellij/current/index.html">0.37.1</a> 145 </li> 146 <li class="version"> 147 <a href="../intellij/0.36.1/index.html">0.36.1</a> 148 </li> 149 <li class="version"> 150 <a href="../intellij/0.35.1/index.html">0.35.1</a> 151 </li> 152 <li class="version"> 153 <a href="../intellij/0.34.1/index.html">0.34.1</a> 154 </li> 155 <li class="version"> 156 <a href="../intellij/0.33.0/index.html">0.33.0</a> 157 </li> 158 <li class="version"> 159 <a href="../intellij/0.32.0/index.html">0.32.0</a> 160 </li> 161 <li class="version"> 162 <a href="../intellij/0.31.1/index.html">0.31.1</a> 163 </li> 164 <li class="version"> 165 <a href="../intellij/0.30.1/index.html">0.30.1</a> 166 </li> 167 <li class="version"> 168 <a href="../intellij/0.29.0/index.html">0.29.0</a> 169 </li> 170 <li class="version"> 171 <a href="../intellij/0.28.0/index.html">0.28.0</a> 172 </li> 173 <li class="version"> 174 <a href="../intellij/0.27.0/index.html">0.27.0</a> 175 </li> 176 <li class="version"> 177 <a href="../intellij/0.26.0/index.html">0.26.0</a> 178 </li> 179 </ul> 180 </li> 181 <li class="component"> 182 <div class="title"><a href="../main/current/index.html">Main Project</a></div> 183 <ul class="versions"> 184 <li class="version"> 185 <a href="../main/latest/index.html">0.33.0-dev</a> 186 </li> 187 <li class="version is-latest"> 188 <a href="../main/current/index.html">0.32.1</a> 189 </li> 190 <li class="version"> 191 <a href="../main/0.31.1/index.html">0.31.1</a> 192 </li> 193 <li class="version"> 194 <a href="../main/0.30.2/index.html">0.30.2</a> 195 </li> 196 <li class="version"> 197 <a href="../main/0.29.1/index.html">0.29.1</a> 198 </li> 199 <li class="version"> 200 <a href="../main/0.28.2/index.html">0.28.2</a> 201 </li> 202 <li class="version"> 203 <a href="../main/0.27.2/index.html">0.27.2</a> 204 </li> 205 <li class="version"> 206 <a href="../main/0.26.3/index.html">0.26.3</a> 207 </li> 208 <li class="version"> 209 <a href="../main/0.25.3/index.html">0.25.3</a> 210 </li> 211 </ul> 212 </li> 213 <li class="component"> 214 <div class="title"><a href="../neovim/current/index.html">Neovim Plugin</a></div> 215 <ul class="versions"> 216 <li class="version is-latest"> 217 <a href="../neovim/current/index.html">0.6.0</a> 218 </li> 219 </ul> 220 </li> 221 <li class="component is-current"> 222 <div class="title"><a href="index.html">Pkl Blog</a></div> 223 </li> 224 <li class="component"> 225 <div class="title"><a href="../go/current/index.html">Pkl Go Bindings</a></div> 226 <ul class="versions"> 227 <li class="version is-latest"> 228 <a href="../go/current/index.html">0.14.0</a> 229 </li> 230 <li class="version"> 231 <a href="../go/0.13.2/index.html">0.13.2</a> 232 </li> 233 <li class="version"> 234 <a href="../go/0.12.1/index.html">0.12.1</a> 235 </li> 236 <li class="version"> 237 <a href="../go/0.11.1/index.html">0.11.1</a> 238 </li> 239 <li class="version">
240 <a href="../go/0.10.0/index.html">0.10.0</a> 241 </li> 242 <li class="version"> 243 <a href="../go/0.9.0/index.html">0.9.0</a> 244 </li> 245 <li class="version"> 246 <a href="../go/0.8.0/index.html">0.8.0</a> 247 </li> 248 <li class="version"> 249 <a href="../go/0.7.0/index.html">0.7.0</a> 250 </li> 251 <li class="version"> 252 <a href="../go/0.6.0/index.html">0.6.0</a> 253 </li> 254 <li class="version"> 255 <a href="../go/0.5.3/index.html">0.5.3</a> 256 </li> 257 </ul> 258 </li> 259 <li class="component"> 260 <div class="title"><a href="../lsp/current/index.html">Pkl Language Server</a></div> 261 <ul class="versions"> 262 <li class="version is-latest"> 263 <a href="../lsp/current/index.html">0.8.0</a> 264 </li> 265 <li class="version"> 266 <a href="../lsp/0.7.1/index.html">0.7.1</a> 267 </li> 268 <li class="version"> 269 <a href="../lsp/0.6.0/index.html">0.6.0</a> 270 </li> 271 <li class="version"> 272 <a href="../lsp/0.5.1/index.html">0.5.1</a> 273 </li> 274 <li class="version"> 275 <a href="../lsp/0.4.0/index.html">0.4.0</a> 276 </li> 277 <li class="version"> 278 <a href="../lsp/0.3.2/index.html">0.3.2</a> 279 </li> 280 <li class="version"> 281 <a href="../lsp/0.2.0/index.html">0.2.0</a> 282 </li> 283 <li class="version"> 284 <a href="../lsp/0.1.2/index.html">
2840.1.2</a> 285 </li> 286 </ul> 287 </li> 288 <li class="component"> 289 <div class="title"><a href="../swift/current/index.html">Pkl Swift Bindings</a></div> 290 <ul class="versions"> 291 <li class="version is-latest"> 292 <a href="../swift/current/index.html">0.10.0</a> 293 </li> 294 <li class="version"> 295 <a href="../swift/0.9.0/index.html">0.9.0</a> 296 </li> 297 <li class="version"> 298 <a href="../swift/0.8.2/index.html">0.8.2</a> 299 </li> 300 <li class="version"> 301 <a href="../swift/0.7.2/index.html">0.7.2</a> 302 </li> 303 <li class="version"> 304 <a href="../swift/0.6.0/index.html">0.6.0</a> 305 </li> 306 <li class="version"> 307 <a href="../swift/0.5.0/index.html">0.5.0</a> 308 </li> 309 <li class="version"> 310 <a href="../swift/0.4.2/index.html">0.4.2</a> 311 </li> 312 <li class="version"> 313 <a href="../swift/0.3.0/index.html">0.3.0</a> 314 </li> 315 <li class="version"> 316 <a href="../swift/0.2.3/index.html">0.2.3</a> 317 </li> 318 </ul> 319 </li> 320 <li class="component"> 321 <div class="title"><a href="../index.html">ROOT</a></div> 322 </li> 323 <li class="component"> 324 <div class="title"><a href="../spring/current/index.html">Spring Boot Integration</a></div> 325 <ul class="versions"> 326 <li class="version is-latest"> 327 <a href="../spring/current/index.html">0.18.0</a> 328 </li> 329 <li class="version"> 330 <a href="../spring/0.17.1/index.html">0.17.1</a> 331 </li> 332 <li class="version"> 333 <a href="../spring/0.16.0/index.html">0.16.0</a> 334 </li> 335 <li class="version"> 336 <a href="../spring/0.15.0/index.html">0.15.0</a> 337 </li> 338 </ul> 339 </li> 340 <li class="component"> 341 <div class="title"><a href="../vscode/current/index.html">VS Code Extension</a></div> 342 <ul class="versions"> 343 <li class="version is-latest"> 344 <a href="../vscode/current/index.html">0.23.1</a> 345 </li> 346 <li class="version"> 347 <a href="../vscode/0.22.0/index.html">0.22.0</a> 348 </li> 349 <li class="version"> 350 <a href="../vscode/0.21.0/index.html">0.21.0</a> 351 </li> 352 <li class="version"> 353 <a href="../vscode/0.20.0/index.html">0.20.0</a> 354 </li> 355 <li class="version"> 356 <a href="../vscode/0.19.0/index.html">0.19.0</a> 357 </li> 358 <li class="version"> 359 <a href="../vscode/0.18.2/index.html">0.18.2</a> 360 </li> 361 <li class="version"> 362 <a href="../vscode/0.17.0/index.html">0.17.0</a> 363 </li> 364 <li class="version"> 365 <a href="../vscode/0.16.0/index.html">0.16.0</a> 366 </li> 367 <li class="version"> 368 <a href="../vscode/0.11.0/index.html">0.11.0</a> 369 </li> 370 </ul> 371 </li> 372 </ul> 373</div> 374 </div> 375 </aside> 376</div> 377<main class="article"> 378<div class="toolbar" role="navigation"> 379<button class="nav-toggle"></button> 380 <a href="../index.html" class="home-link"></a> 381<nav class="breadcrumbs" aria-label="breadcrumbs"> 382 <ul> 383 <li><a href="index.html">Pkl Blog</a></li> 384 </ul> 385</nav> 386<div class="edit-this-page"><a href="https://github.com/apple/pkl-lang.org/edit/main/blog/modules/ROOT/pages/index.adoc">Edit this Page</a></div> 387</div> 388 <div class="content"> 389<aside class="toc sidebar" data-title="Page Contents" data-levels="2"> 390 <div class="toc-menu"></div> 391</aside> 392<article class="doc"> 393<h1 class="page">Pkl Blog</h1> 394<h3 id="building-cli-tools-with-pkl" class="discrete"><a href="building-cli-tools-with-pkl.html" class="xref page">Building CLI Tools with Pkl</a></h3> 395<div class="blog-byline"> 396<div class="paragraph"> 397<p>by <a href="https://github.com/HT154">Jen Basch</a> on May 13th, 2026</p> 398</div> 399</div> 400<div class="blog-excerpt"> 401<div class="paragraph"> 402<p>Some Pkl use cases require evaluation to be parameterized by data supplied at runtime by a user, such as code generation or dataset analysis tools. 403<a href="../main/current/language-reference/index.html#resources" class="xref page">External property (<code>prop:</code>) resources</a> provide a mechanism for soliciting user input, but they’re limited and using them can be a clunky experience. 404Pkl 0.31 introduced the <a href="../main/current/pkl-cli/index.html#cli-tools" class="xref page"><code>pkl run</code> command</a> and <a href="https://pkl-lang.org/package-docs/pkl/current/Command/index.html"><code>pkl:Command</code> standard library module</a> to provide a framework for building CLI tools that look, feel, and work like good tools should: standard flag syntax, input validation, subcommands, generated help text, and shell completion.</p> 405</div> 406</div> 407<hr> 408<h3 id="how-we-manage-github-actions" class="discrete"><a href="how-we-manage-github-actions.html" class="xref page">How we manage GitHub Actions</a></h3> 409<div class="blog-byline"> 410<div class="paragraph"> 411<p>by <a href="https://github.com/bioball">Dan Chao</a> on January 15th, 2026.</p> 412</div> 413</div> 414<div class="blog-excerpt"> 415<div class="paragraph"> 416<p>The Pkl project comprises multiple repositories on GitHub (23 at the time of this writing). 417These repositories are built in different ways, and thus require different CI configurations.</p> 418</div> 419</div> 420<hr> 421<h3 id="using-packages-in-air-gapped-environments" class="discrete"><a href="using-packages-in-air-gapped-environments.html" class="xref page">Using packages in air-gapped environments</a></h3> 422<div class="blog-byline"> 423<div class="paragraph"> 424<p>by <a href="https://github.com/bioball">Dan Chao</a> on November 21, 2025</p> 425</div> 426</div> 427<div class="blog-excerpt"> 428<div class="paragraph"> 429<p>In some cases, Pkl evaluation needs to occur in environments that do not have internet access. 430At the same time, these evaluations can use packages that are published to the internet. 431To enable using such packages, Pkl provides three approaches: HTTP proxying, mirroring, and vendoring.</p> 432</div> 433</div> 434<hr> 435<h3 id="know-your-place" class="discrete"><a href="know-your-place.html" class="xref page">Know Your Place</a></h3> 436<div class="blog-byline"> 437<div class="paragraph"> 438<p>by <a href="https://github.com/holzensp">Philip Hölzenspies</a> on January 24th, 2025</p> 439</div> 440</div> 441<div class="blog-excerpt"> 442<div class="paragraph"> 443<p>
443Configuration generally, and Pkl code especially, tends to be organized hierarchically. 444When configurations grow, they typically spread across files in a directory structure along similar hierarchical organization. 445To make one more ergonomically fit the other, Pkl offers a few mechanisms that can be used in module definitions for, for example, validating that modules are organized as expected, or to populate default values.</p> 446</div> 447</div> 448<hr> 449<h3 id="taking-types-to-the-next-level" class="discrete"><a href="using-types.html" class="xref page">Taking types to the next level</a></h3> 450<div class="blog-byline"> 451<div class="paragraph"> 452<p>by <a href="https://github.com/stackoverflow">Islon Scherer</a> on October 15th, 2024</p> 453</div> 454</div> 455<div class="blog-excerpt"> 456<div class="paragraph"> 457<p>One of the main points of using Pkl is to describe what your configuration looks like. 458An often overlooked design goal (arguably, the most important), is to 459<strong>forbid</strong> invalid configurations. Pkl types allow a great degree of freedom 460and power in constraining what your data looks like.</p> 461</div> 462</div> 463<hr> 464<h3 id="class-as-a-function-pattern" class="discrete"><a href="class-as-a-function.html" class="xref page">Class-as-a-Function Pattern</a></h3> 465<div class="blog-byline"> 466<div class="paragraph"> 467<p>by <a href="https://github.com/HT154">Jen Basch</a> on August 13th, 2024</p> 468</div> 469</div> 470<div class="blog-excerpt"> 471<div class="paragraph"> 472<p>In many languages, function and method parameters may be assigned default values allowing the argument to be omitted in calls. 473Many languages also offer named parameters, which aid in API self-documentation. 474Pkl <a href="../main/current/language-reference/index.html#methods" class="xref page">methods</a> do not provide either feature, but one way to achieve similar results is the "class-as-a-function" (CaaF) pattern.</p> 475</div> 476</div> 477<hr> 478<h3 id="pkl-evolution" class="discrete"><a href="pkl-evolution.html" class="xref page">Pkl Evolution</a></h3> 479<div class="blog-byline"> 480<div class="paragraph"> 481<p>by <a href="https://github.com/bioball">Dan Chao</a> on April 29th, 2024</p> 482</div> 483</div> 484<div class="blog-excerpt"> 485<div class="paragraph"> 486<p>Today, we launch <a href="https://github.com/apple/pkl-evolution">Pkl Evolution</a>, a new repository that holds Suggested Pkl Improvements, Changes, or Enhancements (SPICEs) for Pkl’s language, tooling, and ecosystem.</p> 487</div> 488</div> 489<hr> 490<h3 id="testing-in-pkl" class="discrete"><a href="testing-in-pkl.html" class="xref page">Testing in Pkl</a></h3> 491<div class="blog-byline"> 492<div class="paragraph"> 493<p>by <a href="https://github.com/bioball">Dan Chao</a> on April 9th, 2024</p> 494</div> 495</div> 496<div class="blog-excerpt"> 497<div class="paragraph"> 498<p>Pkl files are programs that get evaluated to produce a result. 499Like any other program, it can be useful to have tests that verify their business logic. 500To address this, Pkl provides tooling for writing and running tests.</p> 501</div> 502</div> 503<hr> 504<h3 id="introducing-pkl-a-programming-language-for-configuration" class="discrete"><a href="introducing-pkl.html" class="xref page">Introducing Pkl, a programming language for configuration</a></h3> 505<div class="blog-byline"> 506<div class="paragraph"> 507<p>by the Pkl Team on February 1st, 2024</p> 508</div> 509</div> 510<div class="blog-excerpt"> 511<div class="paragraph"> 512<p>We are delighted to announce the open source first release of Pkl (pronounced <em>Pickle</em>), a programming language for producing configuration.</p> 513</div> 514</div> 515<div class="blog-feed"> 516<a href="feed.xml"><img src="_images/feed_icon.png" alt="Atom Feed"/></a> 517</div> 518</article> 519 </div> 520</main> 521</div> 522<footer class="footer"> 523 <div class="footer-content"> 524 <p>Copyright © 2024-2025 Apple Inc. All rights reserved.</p> 525 <div class="theme-selector"> 526 <label for="theme-select">Theme</label> 527 <select id="theme-select" class="theme-dropdown"> 528 <option value="system">ð» System</option> 529 <option value="light">âï¸ Light</option> 530 <option value="dark">ð Dark</option> 531 </select> 532 </div> 533 </div> 534</footer>
535<script src="../_/js/site.js"></script>
vendor: 1 bytes, line 535
535
536<script src="../_/js/site-support.js"></script>
vendor: 1 bytes, line 536
536
537<script async src="../_/js/vendor/highlight.js"></script>
vendor: 1 bytes, line 537
537
538<script async src="../_/js/vendor/tabs.js"></script>
vendor: 1 bytes, line 538
538
539<script src="../_/js/vendor/lunr.js"></script>
vendor: 1 bytes, line 539
539
540<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 540
540
541<script async src="../search-index.js"></script>
541 542 </body> 543</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.