Build Status Build Status Maven Central

Pine is a functional HTML5 and XML library for the Scala platform. It supports parsing, manipulating and rendering of HTML. Pine provides type-safe bindings for HTML5 generated from MDN. Tree nodes are immutable and can be constructed from compile-time or runtime HTML/XML content. The tree may be manipulated and rendered back as HTML or as a browser node.


  • Immutable and typed trees
  • Type-safe bindings, generated from MDN
  • Support for custom elements and attributes
  • HTML5 and XML parser based on recursive descent
  • Macros for compile-time HTML string/file parsing
  • Tree manipulation
  • Rendering as HTML strings
  • DSL for common operations
  • Unit and property-based tests
  • Few dependencies

JavaScript back end

  • Rendering as DOM nodes
  • Updating nodes in DOM
  • DSL for attaching/detaching events


Platform Platform version Scala versions
JVM 2.11 (T), 2.12 (T), 2.13 (L)
Scala.js 1.0 2.12 (T), 2.13 (L)
Scala Native 0.4.0-M2 2.11 (T)
  • (T): Typelevel Scala
  • (L): Lightbend Scala


import pine._

val url  = ""
val root = html"<a href=$url>GitHub</a>"

println(root.toHtml)  // <a href="">GitHub</a>


import pine.dom._
println(root.toDom)  // [object HTMLAnchorElement]


Pine makes use of a language extension called literal types, see SIP-23. For Scala 2.11 and 2.12, only Typelevel Scala implements this feature. However, it is available in Lightbend Scala from 2.13 onwards.

2.13 onwards

scalaVersion := "2.<version>"
libraryDependencies += scalaOrganization.value % "scala-reflect" % scalaVersion.value

< 2.13

scalaVersion      := "2.12.4-bin-typelevel-4"  // or "2.11.11-bin-typelevel-4"
scalaOrganization := "org.typelevel"
scalacOptions     += "-Yliteral-types"

libraryDependencies += scalaOrganization.value % "scala-reflect" % scalaVersion.value

Scala.js settings

libraryDependencies := libraryDependencies.value.filterNot( == "scalajs-compiler") 
addCompilerPlugin("org.scala-js" % "scalajs-compiler" % scalaJSVersion cross CrossVersion.patch)

Scala Native settings

libraryDependencies := libraryDependencies.value.filterNot( == "nscplugin")
addCompilerPlugin("org.scala-native" % "nscplugin" % nativeVersion cross CrossVersion.patch)


libraryDependencies += "tech.sparse" %%  "pine" % "<version>"  // JVM
libraryDependencies += "tech.sparse" %%% "pine" % "<version>"  // JavaScript, Native



Pine is licensed under the terms of the Apache v2.0 licence.


  • Tim Nieradzik
  • Matt Hicks
  • Anatoliy Kmetyuk
  • Keven Wright