<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Jonas Bonér</title>

<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link id="google-fonts" rel="stylesheet" href="">

<link rel="stylesheet" href="fonts.css">
<link rel="stylesheet" href="site.css">
</head>
<body>
  <div id="root"></div>

  <script>
window.__TWEAKS_DISABLED__     = true;
window.__INLINE_CONTENT__      = {
  "bio": {
    "name": "Jonas Bonér",
    "tagline": [
      "Present.",
      "Entrepreneur.",
      "Hacker.",
      "Public Speaker.",
      "Powder Skier.",
      "Perpetual Learner.",
      "Jazz Fanatic.",
      "Wannabee Musician."
    ],
    "photo": "assets/jonas_headshot.jpg",
    "social": [
      {
        "name": "LinkedIn",
        "href": "https://linkedin.com/in/jonasboner",
        "handle": "/in/jonasboner"
      },
      {
        "name": "GitHub",
        "href": "https://github.com/jboner",
        "handle": "@jboner"
      },
      {
        "name": "Keybase",
        "href": "https://keybase.io/jonas",
        "handle": "/jonas"
      }
    ]
  },
  "featuredPhotos": {
    "speaking": {
      "src": "assets/jonas-speaking.jpg",
      "credit": "Photo: Devoxx — Antwerp, Belgium"
    },
    "lofoten": {
      "src": "assets/lofoten_sunset.jpg",
      "credit": "Photo: Jonas Bonér — Lofoten, Norway"
    },
    "qcon": {
      "src": "assets/jonas-qcon-nyc.jpg",
      "credit": "Photo: QCon — New York, US"
    },
    "austria": {
      "src": "assets/jacob-arlberg.jpg",
      "credit": "Photo: Jonas Bonér — Schröcken, Austria"
    },
    "are": {
      "src": "assets/are_jonas.jpg",
      "credit": "Photo: Sara Bonér — Åre, Sweden"
    }
  },
  "home": {
    "quote": {
      "text": "If you can't solve a problem, it's because you're playing by the rules.",
      "author": "Paul Arden"
    },
    "work": [
      "I'm Founder, CTO, and Chairman of <a href=\"https://akka.io\">Akka</a>, building an Agentic AI platform for developing, operating, and evaluating multi-agent AI apps and microservices, and scaling them out to multi-region, multi-cloud, and edge.",
      "In 2011 I became a <a href=\"https://javachampions.org/members.html\" target=\"_blank\" rel=\"noopener\">Java Champion</a>, in 2012 I was voted as the <a data-route=\"resume\">number-one developer</a> in Sweden, and in 2013 I wrote the <a href=\"https://www.reactivemanifesto.org\" target=\"_blank\" rel=\"noopener\">Reactive Manifesto</a>. See the <a data-route=\"interviews\">Interviews</a> and <a data-route=\"about\">Résumé</a> pages for more."
    ],
    "code": [
      "Long-time contributor to the Open Source community; most notably created the <a href=\"https://akka.io\" target=\"_blank\" rel=\"noopener\">Akka</a> actor-based distributed systems and agentic AI platform, and the <a href=\"https://github.com/jboner/aspectwerkz\" target=\"_blank\" rel=\"noopener\">AspectWerkz</a> AOP compiler and runtime. See my <a href=\"https://github.com/jboner\" target=\"_blank\" rel=\"noopener\">GitHub page</a> for some of my projects.",
      "On the <a data-route=\"talks\">Talks</a> page you can find video recordings from my talks throughout the years, and for articles, books, and white papers, head over to <a data-route=\"writings\">Writings</a>."
    ]
  },
  "about": {
    "title": "About This Site",
    "body": "\n      <p>Welcome to Jonas Bonér's home on the Internet since 2003.</p>\n      <p>These pages collect two-plus decades of talks, writings, and posts on distributed systems, multi-agent systems, the actor model, reactive architecture, and—more recently—agentic AI. The archive goes all the way back to the AspectWerkz years; nothing has been pruned.</p>\n      <p>The typography draws on Matthew Butterick's writing in <a href=\"https://practicaltypography.com\" target=\"_blank\" rel=\"noopener\">Practical Typography</a>—read it twice. Typography matters.</p>\n    "
  },
  "writings": {
    "title": "Writings",
    "lede": "Here is a list with some of the more recent books, articles, and white papers I've written.",
    "books": [
      {
        "src": "O'Reilly",
        "title": "Principles and Patterns for Distributed Application Architecture",
        "url": "resources/Principles and Patterns for Distributed Application Architecture.pdf"
      },
      {
        "src": "O'Reilly",
        "title": "Reactive Microsystems: The Evolution of Microservices at Scale",
        "url": "resources/Reactive Microsystems - The Evolution of Microservices at Scale.pdf"
      },
      {
        "src": "O'Reilly",
        "title": "Reactive Microservices Architecture: Design Principles for Distributed Systems",
        "url": "resources/Reactive_Microservices_Architecture.pdf"
      }
    ],
    "whitePapers": [
      {
        "src": "The Reactive Principles",
        "url": "https://reactiveprinciples.org",
        "title": "The Reactive Principles and Patterns"
      },
      {
        "src": "The Reactive Manifesto",
        "url": "https://www.reactivemanifesto.org",
        "title": "Defining the Four Traits of Reactive Systems"
      }
    ],
    "articles": [
      {
        "src": "Lightbend",
        "url": "https://www.lightbend.com/blog/lightbend-record-growth-fifty-new-customers-cash-flow-positive-new-growth-executives/",
        "title": "Lightbend closes FY24 with record growth; Adds over 50 new customers; Achieves cash flow positive operations; Hires new growth executives."
      },
      {
        "src": "App Developer Magazine",
        "url": "https://appdevelopermagazine.com/Cloud-native-market%C2%A0predictions-from-lightbend/",
        "title": "Cloud Native 2024 Predictions"
      },
      {
        "src": "Venture Beat",
        "url": "https://venturebeat.com/programming-development/leveraging-a-truly-unified-cloud-and-edge-with-the-actor-model/",
        "title": "Leveraging a truly unified cloud and edge with the actor model"
      },
      {
        "src": "Lightbend",
        "url": "https://www.lightbend.com/blog/akka-edge-unifying-the-cloud-and-edge",
        "title": "Akka Edge: Unifying the Cloud and Edge"
      },
      {
        "src": "Datanami",
        "url": "https://www.datanami.com/2023/03/28/climbing-the-ladder-of-abstraction/",
        "title": "Climbing the Ladder of Abstraction"
      },
      {
        "src": "IT Brief",
        "url": "https://itbrief.co.uk/story/climbing-the-ladder-of-abstraction",
        "title": "Climbing the Ladder of Abstraction"
      },
      {
        "src": "VMBlog",
        "url": "https://vmblog.com/archive/2022/12/12/lightbend-2023-predictions-climbing-the-ladder-of-abstractions-to-make-cloud-native-solutions-useable.aspx",
        "title": "2023: Climbing the ladder of abstractions to make cloud native solutions useable"
      },
      {
        "src": "DevOps.com",
        "url": "https://devops.com/when-the-cloud-and-the-edge-are-the-same-thing/",
        "title": "When Cloud and Edge are the same thing"
      },
      {
        "src": "Edge IR",
        "url": "https://www.edgeir.com/building-a-data-plane-extending-real-time-data-and-computing-to-the-edge-20220815",
        "title": "Building a data plane: extending real-time data and computing to the edge"
      },
      {
        "src": "Lightbend",
        "url": "https://www.lightbend.com/blog/why-we-are-changing-the-license-for-akka",
        "title": "Why We Are Changing the License for Akka"
      },
      {
        "src": "Edge IR",
        "url": "https://www.edgeir.com/serverless-plus-stateful-a-new-programming-model-comes-to-edge-computing-20220516",
        "title": "Serverless plus stateful: a new programming model comes to edge computing"
      },
      {
        "src": "InfoQ",
        "url": "https://www.infoq.com/news/2019/04/serverless-needs-state",
        "title": "In a Serverless World, We Still Need State"
      },
      {
        "src": "The New Stack",
        "url": "https://thenewstack.io/serverless-needs-a-bolder-stateful-vision/",
        "title": "Serverless Needs a Bolder, Stateful Vision"
      },
      {
        "src": "Lightbend",
        "url": "https://www.lightbend.com/stateful-cloud-native-services-with-akka-and-kubernetes",
        "title": "How To Build Stateful, Cloud-Native Services With Akka And Kubernetes"
      },
      {
        "src": "InfoQ",
        "url": "https://www.infoq.com/articles/stateful-service-design-kubernetes",
        "title": "Stateful Service Design Considerations for the Kubernetes Stack"
      },
      {
        "src": "The New Stack",
        "url": "https://thenewstack.io/akka-java-middleware-what-goes-inside-the-containers-counts/",
        "title": "Akka Java Middleware: What Goes Inside the Containers Counts"
      },
      {
        "src": "InfoQ",
        "url": "https://www.infoq.com/news/2018/03/events-distributed-systems",
        "title": "Events Are Reshaping the Future of Distributed Systems"
      },
      {
        "src": "O'Reilly",
        "url": "https://www.oreilly.com/ideas/transforming-enterprise-integration-with-reactive-streams",
        "title": "Transforming Enterprise Integration With Reactive Streams"
      },
      {
        "src": "DZone",
        "url": "https://dzone.com/articles/why-developers-should-bet-big-on-streaming",
        "title": "Why Developers Should Bet Big on Streaming"
      },
      {
        "src": "O'Reilly",
        "url": "https://www.oreilly.com/ideas/the-evolution-of-scalable-microservices",
        "title": "The Evolution of Scalable Microservices"
      },
      {
        "src": "O'Reilly",
        "url": "https://www.oreilly.com/ideas/reactive-programming-vs-reactive-systems",
        "title": "Reactive programming vs. Reactive systems"
      },
      {
        "src": "InfoQ",
        "url": "https://www.infoq.com/news/2017/03/microliths-microsystems",
        "title": "From Microliths to Microsystems"
      },
      {
        "src": "Article",
        "url": "posts/bla-bla-microservices-bla-bla.html",
        "title": "bla bla microservices bla bla"
      },
      {
        "src": "The New Stack",
        "url": "https://thenewstack.io/typesafes-jonas-boner-how-reactive-programming-addresses-the-scale-out-problem/",
        "title": "How Reactive Programming Addresses the Scale-out Problem"
      }
    ],
    "forewords": [
      {
        "url": "posts/foreword-reactive-application-development.html",
        "title": "Reactive Application Development"
      },
      {
        "url": "posts/foreword-reactive-design-patterns.html",
        "title": "Reactive Design Patterns"
      },
      {
        "url": "posts/foreword-functional-and-reactive-domain-modeling.html",
        "title": "Functional And Reactive Domain Modeling"
      },
      {
        "url": "posts/foreword-reactive-messaging-patterns.html",
        "title": "Reactive Messaging Patterns With The Actor Model"
      },
      {
        "url": "posts/foreword-developing-reactive-microservices.html",
        "title": "Developing Reactive Microservices"
      },
      {
        "url": "posts/foreword-programming-scala.html",
        "title": "Programming Scala"
      }
    ]
  },
  "talks": {
    "title": "Talks",
    "lede": "Video recordings from my talks throughout the years. Slides for some of these can be found on <a href=\"https://www.slideshare.net/jboner/\" target=\"_blank\" rel=\"noopener\">Slideshare</a> and <a href=\"https://speakerdeck.com/jboner\" target=\"_blank\" rel=\"noopener\">Speaker Deck</a>.",
    "byYear": [
      {
        "year": "2026",
        "items": [
          {
            "venue": "Jfokus",
            "url": "https://www.youtube.com/watch?v=NgXfxTVbBXw",
            "title": "Herding LLMs: Predictable Outcomes from Unpredictable Agents"
          }
        ]
      },
      {
        "year": "2024",
        "items": [
          {
            "venue": "InfoQ Panel",
            "title": "Designing Cloud Applications for Elasticity and Resilience",
            "url": "https://www.infoq.com/presentations/cloud-resilience-elasticity/"
          },
          {
            "venue": "InfoQ Webinar",
            "title": "The Architects Guide To Elasticity",
            "url": "https://www.youtube.com/watch?v=qBbGeDQoSKc"
          },
          {
            "venue": "O'Reilly Superstream",
            "title": "Transcending the Barriers to Elasticity",
            "url": "https://www.youtube.com/watch?v=tvEPF2ngWVU"
          }
        ]
      },
      {
        "year": "2023",
        "items": [
          {
            "venue": "GOTO",
            "title": "Climbing the Ladder of Abstraction Towards the Cloud-to-Edge Continuum",
            "url": "https://youtu.be/L2kkRvqHcFg"
          },
          {
            "venue": "Kalix Webinar",
            "title": "Designing Events-first Microservices",
            "url": "https://www.kalix.io/developer/webinar/designing-event-first-microservices"
          },
          {
            "venue": "Kalix Webinar",
            "title": "Climbing the Ladder of Abstraction",
            "url": "https://www.kalix.io/webinar/climbing-the-ladder-of-abstraction"
          }
        ]
      },
      {
        "year": "2022",
        "items": [
          {
            "venue": "Reactive Summit · Keynote",
            "title": "We Are Drowning in Complexity. Can We Do Better?",
            "url": "https://www.youtube.com/watch?v=DVEahSZF2yk"
          },
          {
            "venue": "Kalix Webinar",
            "title": "Kalix: Tackling the Cloud to Edge Continuum",
            "url": "https://www.kalix.io/webinar/kalix-tackling-the-cloud-to-edge-continuum"
          }
        ]
      },
      {
        "year": "2021",
        "items": [
          {
            "venue": "University of São Paulo · Keynote",
            "title": "Designing Events-first Microservices",
            "url": "https://www.youtube.com/watch?v=Q5chQ0_9G4I"
          }
        ]
      },
      {
        "year": "2020",
        "items": [
          {
            "venue": "Code Mesh",
            "title": "Cloudstate: Towards Stateful Serverless",
            "url": "https://www.youtube.com/watch?v=fb8e1MymApg"
          },
          {
            "venue": "Reactive Summit · Keynote",
            "title": "Design Principles For Cloud Native Applications",
            "url": "https://www.youtube.com/watch?v=e5kek8vx2ws"
          },
          {
            "venue": "Ray Summit",
            "title": "Cloudstate: Towards Stateful Serverless",
            "url": "https://www.youtube.com/watch?v=fFein01olEA"
          },
          {
            "venue": "KubeCon",
            "title": "Cloudstate: Towards Stateful Serverless",
            "url": "https://www.youtube.com/watch?v=D3bYGIo2kiQ"
          },
          {
            "venue": "Jfokus",
            "title": "Cloudstate: Towards Stateful Serverless",
            "url": "https://www.youtube.com/watch?v=DVTf5WQlgB8"
          }
        ]
      },
      {
        "year": "2019",
        "items": [
          {
            "venue": "HPTS",
            "title": "Beyond FaaS, Towards Stateful Serverless",
            "url": "http://www.hpts.ws/agenda.html"
          },
          {
            "venue": "KubeCon",
            "title": "Serverless is Interesting But FaaS is Not Enough",
            "url": "https://www.youtube.com/watch?v=J3PyYmdTsnQ&list=PLj6h78yzYM2PpmMAnvpvsnR4c27wJePh3"
          },
          {
            "venue": "Lightbend Webinar",
            "title": "Designing Events-First Microservices For A Cloud Native World",
            "url": "https://www.lightbend.com/blog/designing-events-first-microservices-for-a-cloud-native-world"
          }
        ]
      },
      {
        "year": "2018",
        "items": [
          {
            "venue": "Øredev",
            "title": "Designing Events-First Microservices",
            "url": "https://vimeo.com/311988496"
          },
          {
            "venue": "QCon New York",
            "title": "Designing Events-first Microservices",
            "url": "https://www.infoq.com/presentations/microservices-events-first-design"
          },
          {
            "venue": "J On The Beach",
            "title": "Designing Events-first Microservices",
            "url": "https://www.youtube.com/watch?v=iDey1GoAJy0"
          },
          {
            "venue": "MicroCPH",
            "title": "Designing Events-first Microservices",
            "url": "https://www.youtube.com/watch?v=oWAhmOcaXHk"
          },
          {
            "venue": "QCon London",
            "title": "How Events Are Reshaping Modern Systems",
            "url": "https://www.infoq.com/presentations/systems-event-driven"
          }
        ]
      },
      {
        "year": "2017",
        "items": [
          {
            "venue": "ACM Learning Webinar",
            "title": "Reactive Microsystems: The Evolution of Microservices at Scale",
            "url": "https://www.youtube.com/watch?v=3hMtjPcU248"
          },
          {
            "venue": "Devoxx",
            "title": "How Events Are Reshaping Modern Systems",
            "url": "https://www.youtube.com/watch?v=3V3pHm2Cpks"
          },
          {
            "venue": "Reactive Summit · Keynote",
            "title": "How Events Are Reshaping Modern Systems",
            "url": "https://www.youtube.com/watch?v=ycxvmOKDHMQ"
          },
          {
            "venue": "Erlang User Conference · Keynote",
            "title": "Without Resilience, Nothing Else Matters",
            "url": "https://www.youtube.com/watch?v=ktBlGj5gGUY"
          },
          {
            "venue": "QCon London",
            "title": "From Microliths To Microsystems",
            "url": "https://www.infoq.com/presentations/microservices-principles-2017"
          },
          {
            "venue": "Jfokus · Keynote",
            "title": "From Microliths To Microsystems",
            "url": "https://www.youtube.com/watch?v=aX39Jsq_ysw"
          }
        ]
      },
      {
        "year": "2016",
        "items": [
          {
            "venue": "SkillsMatter Meetup",
            "url": "https://skillsmatter.com/skillscasts/8644-on-microservices",
            "title": "On Reactive Microservices"
          },
          {
            "venue": "Reactive Summit: Keynote",
            "url": "https://www.youtube.com/watch?v=DRK7WYNh6AA",
            "title": "bla bla microservices bla bla"
          },
          {
            "venue": "O’Reilly Software Architecture Conference: Keynote",
            "url": "https://www.oreilly.com/ideas/bla-bla-microservices-bla-bla",
            "title": "bla bla microservices bla bla"
          },
          {
            "venue": "Voxxed Days Zürich: Keynote",
            "url": "https://www.youtube.com/watch?v=Nhz5jMXS8gE",
            "title": "Life Beyond the Illusion of Present"
          },
          {
            "venue": "Lightbend Webinar",
            "url": "https://www.youtube.com/watch?v=0TUFb7YCxo4",
            "title": "The Enterprise Architects Intro To Microservices Part 3"
          },
          {
            "venue": "Lightbend Webinar",
            "url": "https://www.youtube.com/watch?v=eBVuF5Xbj2w",
            "title": "The Enterprise Architects Intro To Microservices Part 2"
          },
          {
            "venue": "Scala Matsuri",
            "url": "https://www.youtube.com/watch?v=nsdl5xkplM8",
            "title": "Without Resilience, Nothing Else Matters"
          }
        ]
      },
      {
        "year": "2015",
        "items": [
          {
            "venue": "O'Reilly Software Architecture Conference",
            "url": "https://www.youtube.com/watch?v=9gLrCPVrXo4",
            "title": "Bla Bla Microservices Bla Bla"
          },
          {
            "venue": "Scala Exchange · Keynote",
            "title": "Without Resilience, Nothing Else Matters",
            "url": "https://skillsmatter.com/skillscasts/6468-keynote-without-resilience-nothing-else-matters"
          },
          {
            "venue": "Devoxx BE",
            "title": "Without Resilience, Nothing Else Matters",
            "url": "https://www.youtube.com/watch?v=NjPVJ7ZKLnY"
          },
          {
            "venue": "Scala Days · Keynote",
            "title": "Life Beyond the Illusion of Present",
            "url": "https://www.parleys.com/tutorial/life-beyond-illusion-present"
          },
          {
            "venue": "Scala By the Bay · Keynote",
            "title": "The Sadness at the End of the Happy Path",
            "url": "https://www.youtube.com/watch?v=KOBjXHZOhv8"
          },
          {
            "venue": "GOTO Copenhagen",
            "title": "Without Resilience, Nothing Else Matters",
            "url": "https://www.youtube.com/watch?v=beC49rexj7I"
          },
          {
            "venue": "DevTernity: Keynote",
            "url": "https://www.youtube.com/watch?v=wiB4g3muKmE",
            "title": "Without Resilience, Nothing Else Matters"
          },
          {
            "venue": "reactive.community",
            "url": "https://www.youtube.com/watch?v=4OWwZa92qWw",
            "title": "Life Beyond the Illusion of the Present"
          },
          {
            "venue": "GeeCON: Keynote",
            "url": "https://vimeo.com/130759483",
            "title": "Life Beyond the Illusion of Present"
          },
          {
            "venue": "Code Mentor",
            "url": "https://www.youtube.com/watch?v=C_bHd5e5NNI",
            "title": "Approaching Scalability with Reactive Systems"
          },
          {
            "venue": "Lightbend Webinar",
            "url": "https://www.youtube.com/watch?v=JvbUF33sKf8",
            "title": "Resiliency: Failures vs Errors, Isolation, Delegation and Replication"
          },
          {
            "venue": "Virtual Java UG",
            "url": "https://www.youtube.com/watch?v=gDbEGsFaRUQ",
            "title": "Resilience is by Design"
          },
          {
            "venue": "Kraków Scala UG",
            "url": "https://www.youtube.com/watch?v=tSEdh4-iCUc",
            "title": "The Road to Akka Cluster, and Beyond…"
          }
        ]
      },
      {
        "year": "2014",
        "items": [
          {
            "venue": "SF Scala",
            "url": "https://www.youtube.com/watch?v=6Cb1wSVRI-Q",
            "title": "Building Reactive Applications with Akka"
          },
          {
            "venue": "SF Scala",
            "url": "https://www.youtube.com/watch?v=2wSYcyWCtx4",
            "title": "The Road to Akka Cluster, and Beyond…"
          },
          {
            "venue": "SICS",
            "url": "https://www.youtube.com/watch?v=zYWCOQwxtPY",
            "title": "Building Reactive Systems with Akka"
          },
          {
            "venue": "Craft",
            "url": "http://www.infoq.com/presentations/traits-reactive-applications",
            "title": "Going Reactive: Event-Driven, Scalable, Resilient & Responsive Systems"
          },
          {
            "venue": "React Conf",
            "url": "https://www.youtube.com/watch?v=mBFdj7w4aFA",
            "title": "Reactive Supply to Changing Demand"
          },
          {
            "venue": "Strange Loop",
            "url": "https://www.youtube.com/watch?v=U1C5m8b0qg0",
            "title": "The Road to Akka Cluster, and Beyond…"
          },
          {
            "venue": "Scala Downunder Remote: Keynote",
            "url": "https://www.youtube.com/watch?v=ODRtDSfkGJM",
            "title": "A 5 Year Retrospective on Akka"
          }
        ]
      },
      {
        "year": "2013",
        "items": [
          {
            "venue": "Strange Loop",
            "title": "Scaling Software with Akka",
            "url": "http://www.infoq.com/presentations/Scalability-Akka"
          },
          {
            "venue": "Scala Days",
            "title": "Going Reactive: Scalable, Highly Concurrent & Fault-Tolerant Systems",
            "url": "https://www.parleys.com/tutorial/51c0c876e4b0d38b54f461f6/chapter30/about"
          },
          {
            "venue": "Devoxx",
            "title": "Going Reactive: Event-Driven, Scalable & Resilient Systems",
            "url": "https://www.parleys.com/tutorial/529bbfc3e4b039ad2298ca09/about"
          },
          {
            "venue": "Jfokus",
            "title": "Building Scalable, Highly Concurrent and Fault-Tolerant Systems",
            "url": "https://www.youtube.com/watch?v=DihXpZ9xR8E"
          },
          {
            "venue": "Scala Exchange · Keynote",
            "title": "The Road to Akka Cluster, and Beyond…",
            "url": "https://skillsmatter.com/skillscasts/4543-the-road-to-akka-cluster-and-beyond"
          },
          {
            "venue": "BuildStuff",
            "url": "http://www.infoq.com/presentations/reactive-apps",
            "title": "Going Reactive: Event-Driven, Scalable, Resilient & Responsive Systems"
          },
          {
            "venue": "NY Scala UG",
            "url": "https://vimeo.com/50400591",
            "title": "Introducing Akka"
          },
          {
            "venue": "Scala Matsuri",
            "url": "https://vimeo.com/64952401",
            "title": "Up up and Out: Scaling Software with Akka"
          },
          {
            "venue": "JavaZone",
            "url": "https://vimeo.com/74553108",
            "title": "Going Reactive: Event-Driven, Scalable & Resilient Systems"
          },
          {
            "venue": "GOTO",
            "url": "https://www.youtube.com/watch?v=t4KxWDqGfcs",
            "title": "Up And Out Scaling Software With Akka"
          }
        ]
      },
      {
        "year": "2012",
        "items": [
          {
            "venue": "JavaZone",
            "url": "https://vimeo.com/49485654",
            "title": "Up up and Out: Scaling software with Akka 2"
          },
          {
            "venue": "Scala Days",
            "url": "https://skillsmatter.com/skillscasts/3016-scala-days-akka",
            "title": "Akka 2: Distributed by Design"
          },
          {
            "venue": "Tech Mesh",
            "url": "https://vimeo.com/74725563",
            "title": "Up up and Out: Scaling Software with Akka"
          }
        ]
      },
      {
        "year": "2011",
        "items": [
          {
            "venue": "What's Next",
            "title": "Above the Clouds: Introducing Akka",
            "url": "http://www.infoq.com/presentations/Introducing-Akka"
          },
          {
            "venue": "Devoxx",
            "title": "Above the Clouds: Introducing Akka",
            "url": "https://www.parleys.com/tutorial/514892290364bc17fc56c516/chapter0/about"
          },
          {
            "venue": "JavaZone",
            "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors",
            "url": "https://vimeo.com/28761559"
          },
          {
            "venue": "Erlang Factory",
            "title": "Above the Clouds: Introducing Cloudy Akka",
            "url": "https://vimeo.com/27540571"
          },
          {
            "venue": "JavaZone",
            "url": "https://vimeo.com/28760393",
            "title": "Above the Clouds: Introducing Akka"
          },
          {
            "venue": "Philly ETE",
            "url": "https://vimeo.com/40726380",
            "title": "Above the Clouds: Introducing Akka (with Garrick Evans from Autodesk)"
          },
          {
            "venue": "Reaktor Dev Day",
            "url": "https://vimeo.com/30427977",
            "title": "Scaling up and out with Scala and Akka"
          }
        ]
      },
      {
        "year": "2010",
        "items": [
          {
            "venue": "Scala Lift Off",
            "title": "Akka: Simpler Concurrency, Scalability & Fault-Tolerance through Actors",
            "url": "https://skillsmatter.com/skillscasts/1548-jonas-boner-akka-simpler-concurrency-scalability-fault-tolerance-through-actors"
          },
          {
            "venue": "Scala Days",
            "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors",
            "url": "http://days2010.scala-lang.org/node/138/162/16-2-M%20-%20Akka%20-%20Bon%C3%A9r.mp4"
          },
          {
            "venue": "LinkedIn Tech Talk",
            "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors",
            "url": "https://vimeo.com/15755405"
          },
          {
            "venue": "Kraków JUG",
            "title": "Akka, Let It Crash (first public Akka talk)",
            "url": "https://www.youtube.com/watch?v=R4zO15mPRTw"
          },
          {
            "venue": "Skills Matter",
            "url": "https://skillsmatter.com/skillscasts/1472-akka-simpler-scalability-fault-tolerance-concurrency-remoting-through-actors",
            "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
          },
          {
            "venue": "Northeast Scala Symposium",
            "url": "https://vimeo.com/20297968",
            "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
          },
          {
            "venue": "JAX",
            "url": "https://vimeo.com/20059154",
            "title": "Exploring alternative Concurrency Paradigms on the JVM"
          }
        ]
      },
      {
        "year": "2009",
        "items": [
          {
            "venue": "QCon",
            "url": "http://www.infoq.com/presentations/Scala-Jonas-Boner",
            "title": "Pragmatic Real-World Scala"
          },
          {
            "venue": "Øredev",
            "url": "https://vimeo.com/8554416",
            "title": "A comparative study of scalable and HA products"
          },
          {
            "venue": "Øredev",
            "url": "https://vimeo.com/10895960",
            "title": "Pragmatic Real-World Scala"
          },
          {
            "venue": "JavaZone",
            "url": "https://vimeo.com/46276948",
            "title": "State, You’re Doing It Wrong: Exploring Alternative Concurrency Paradigms on the JVM"
          },
          {
            "venue": "JavaZone",
            "url": "https://vimeo.com/46380660",
            "title": "Pragmatic Real-World Scala"
          }
        ]
      }
    ],
    "complete": [
      {
        "venue": "Jfokus, Stockholm",
        "date": "Feb 2026",
        "title": "Herding LLMs: Predictable Outcomes from Unpredictable Agents"
      },
      {
        "venue": "Jfokus, Stockholm",
        "date": "Feb 2025",
        "title": "Transcending the Barriers to Elasticity"
      },
      {
        "venue": "O'Reilly Superstream, Online",
        "date": "Nov 2024",
        "title": "Transcending the Barriers to Elasticity"
      },
      {
        "venue": "InfoQ Panel, Online",
        "date": "Nov 2024",
        "title": "Designing Cloud Applications for Elasticity and Resilience"
      },
      {
        "venue": "QCon, San Francisco",
        "date": "Nov 2024",
        "title": "Transcending the Barriers to Elasticity"
      },
      {
        "venue": "InfoQ Webinar, Online",
        "date": "Sept 2024",
        "title": "The Architects Guide To Elasticity"
      },
      {
        "venue": "O'Reilly Superstream, Online",
        "date": "Aug 2024",
        "title": "Transcending the Barriers to Elasticity"
      },
      {
        "venue": "GOTO, Copenhagen, Denmark",
        "date": "Oct 2023",
        "title": "Climbing the Ladder of Abstraction Towards the Cloud-to-Edge Continuum"
      },
      {
        "venue": "Reactive Summit, Detroit, US",
        "date": "Oct 2022",
        "title": "Keynote: We are drowning in complexity—can we do better?"
      },
      {
        "venue": "GeeCON, Krakow, Poland",
        "date": "May 2022",
        "title": "Extending Real-time Data and Compute to the Cloud, Edge, and beyond"
      },
      {
        "venue": "University of São Paulo, Virtual Event",
        "date": "June 2021",
        "title": "Keynote: Designing Events-first Microservices"
      },
      {
        "venue": "Reactive Summit, Virtual Event",
        "date": "Nov 2020",
        "title": "Keynote: Design Principles For Cloud Native Applications"
      },
      {
        "venue": "CodeMesh, Virtual Event",
        "date": "Nov 2020",
        "title": "Cloudstate—Towards Stateful Serverless"
      },
      {
        "venue": "Ray Summit, Virtual Event",
        "date": "Sept 2020",
        "title": "Cloudstate—Towards Stateful Serverless"
      },
      {
        "venue": "KubeCon—Amsterdam, Virtual Event",
        "date": "Aug 2020",
        "title": "Cloudstate—Towards Stateful Serverless"
      },
      {
        "venue": "Jfokus—Stockholm, Sweden",
        "date": "Feb 2020",
        "title": "Cloudstate—Towards Stateful Serverless"
      },
      {
        "venue": "HPTS—Monterey, US",
        "date": "Nov 2019",
        "title": "Beyond FaaS, Towards Stateful Serverless"
      },
      {
        "venue": "KubeCon—Barcelona, Spain",
        "date": "May 2019",
        "title": "Serverless is Interesting But FaaS is Not Enough"
      },
      {
        "venue": "QCon—London, UK",
        "date": "March 2019",
        "title": "Track Host: Operationalizing Microservices"
      },
      {
        "venue": "Øredev—Malmö, Sweden",
        "date": "Nov 2018",
        "title": "Designing Events-first Microservices"
      },
      {
        "venue": "QCon—NYC, US",
        "date": "June 2018",
        "title": "Designing Events-first Microservices"
      },
      {
        "venue": "J On The Beach—Malaga, Spain",
        "date": "May 2018",
        "title": "Designing Events-first Microservices"
      },
      {
        "venue": "MicroCPH—Copenhagen, Denmark",
        "date": "May 2018",
        "title": "Designing Events-first Microservices"
      },
      {
        "venue": "QCon—London, UK",
        "date": "Mar 2018",
        "title": "How Events Are Reshaping Modern Systems"
      },
      {
        "venue": "ACM Learning—Streamed Online",
        "date": "Dec 2017",
        "title": "Reactive Microsystems: The Evolution of Microservices at Scale"
      },
      {
        "venue": "Devoxx—Antwerp, Belgium",
        "date": "Nov 2017",
        "title": "How Events Are Reshaping Modern Systems"
      },
      {
        "venue": "Reactive Summit—Austin, US",
        "date": "Oct 2017",
        "title": "Keynote: How Events Are Reshaping Modern Systems"
      },
      {
        "venue": "GOTO—Copenhagen, Denmark",
        "date": "Oct 2017",
        "title": "Reactive Microsystems: The Evolution Of Microservices At Scale"
      },
      {
        "venue": "Erlang User Conference—Stockholm, Sweden",
        "date": "June 2017",
        "title": "Without Resilience, Nothing Else Matters"
      },
      {
        "venue": "QCon—London, UK",
        "date": "March 2017",
        "title": "From Microliths To Microsystems"
      },
      {
        "venue": "Jfokus—Stockholm, Sweden",
        "date": "Feb 2017",
        "title": "Keynote: From Microliths To Microsystems"
      },
      {
        "venue": "SkillsMatter—London, UK",
        "date": "Nov 2016",
        "title": "On Reactive Microservices"
      },
      {
        "venue": "O'Reilly Software Architecture Conference—London, UK",
        "date": "Oct 2016",
        "title": "bla bla microservices bla bla: director's cut"
      },
      {
        "venue": "Reactive Summit—Austin, US",
        "date": "Oct 2016",
        "title": "Keynote: bla bla microservices bla bla: director's cut"
      },
      {
        "venue": "O'Reilly Software Architecture Conference—New York, US",
        "date": "April 2016",
        "title": "Keynote: bla bla microservices bla bla"
      },
      {
        "venue": "Voxxed—Zurich, Switzerland",
        "date": "March 2016",
        "title": "Keynote: Life Beyond the Illusion of Present"
      },
      {
        "venue": "Scala Matsuri—Tokyo, Japan",
        "date": "Jan 2016",
        "title": "The Sadness at the End of the Happy Path"
      },
      {
        "venue": "Scala Exchange—London, UK",
        "date": "Dec 2015",
        "title": "Keynote: Without Resilience, Nothing Else Matters"
      },
      {
        "venue": "DevTernity—Riga, Latvia",
        "date": "Dec 2015",
        "title": "Keynote: Without Resilience, Nothing Else Matters"
      },
      {
        "venue": "Devoxx—Antwerp, Belgium",
        "date": "Nov 2015",
        "title": "Without Resilience, Nothing Else Matters"
      },
      {
        "venue": "GOTO—Copenhagen, Denmark",
        "date": "Oct 2015",
        "title": "Without Resilience, Nothing Else Matters"
      },
      {
        "venue": "Reactive User Group—San Francisco, US",
        "date": "Aug 2015",
        "title": "Life Beyond the Illusion of Present"
      },
      {
        "venue": "Scala by the Bay—Oakland, US",
        "date": "Aug 2015",
        "title": "Keynote: The Sadness at the End of the Happy Path"
      },
      {
        "venue": "Scala Days—Amsterdam, Netherlands",
        "date": "June 2015",
        "title": "Keynote: Life Beyond the Illusion of Present"
      },
      {
        "venue": "GeeCON—Krakow, Poland",
        "date": "May 2015",
        "title": "Keynote: Life Beyond the Illusion of Present"
      },
      {
        "venue": "Scala Days—San Francisco, US",
        "date": "March 2015",
        "title": "Life Beyond the Illusion of Present"
      },
      {
        "venue": "React Conf—San Francisco, US",
        "date": "November 2014",
        "title": "Life Beyond the Illusion of Present"
      },
      {
        "venue": "NY Scala—New York, US",
        "date": "November 2014",
        "title": "Reactive Supply to Changing Demand: Building Elastic Reactive Systems"
      },
      {
        "venue": "London Scala User Group at SkillsMatter—London, UK",
        "date": "October 2014",
        "title": "Go Reactive: Building Responsive, Resilient, Elastic and Message-Driven Systems"
      },
      {
        "venue": "SICS Cloud and Big Data Day—Stockholm, Sweden",
        "date": "September 2014",
        "title": "Building Reactive Systems with Akka"
      },
      {
        "venue": "Strange Loop—St. Louis, US",
        "date": "September 2014",
        "title": "The Road to Akka Cluster and Beyond"
      },
      {
        "venue": "SF Scala—San Francisco, US",
        "date": "September 2014",
        "title": "The Road to Akka Cluster and Beyond"
      },
      {
        "venue": "Scala Downunder—Auckland, New Zealand",
        "date": "September 2014",
        "title": "Keynote: A 5 year retrospective and the future of distributed computing"
      },
      {
        "venue": "Scala Workshop at ECOOP—Uppsala, Sweden",
        "date": "July 2014",
        "title": "Invited Talk — Resilient Applications with Akka Persistence"
      },
      {
        "venue": "Speakerconf—Barcelona, Spain",
        "date": "May 2014",
        "title": "Untitled"
      },
      {
        "venue": "Barcelona Scala User Group—Barcelona, Spain",
        "date": "May 2014",
        "title": "Go Reactive: Event-driven, Scalable, Resilient and Responsive Systems"
      },
      {
        "venue": "Craft Conference—Budapest, Hungary",
        "date": "April 2014",
        "title": "Go Reactive: Event-driven, Scalable, Resilient and Responsive Systems"
      },
      {
        "venue": "CodeMotion—Rome, Italy",
        "date": "April 2014",
        "title": "Building Reactive apps with Akka and Java 8"
      },
      {
        "venue": "React Conf—London, UK",
        "date": "April 2014",
        "title": "Reactive Supply to Changing Demand (Scalable Trait in the Reactive Manifesto)"
      },
      {
        "venue": "NY Scala—New York, US",
        "date": "March 2014",
        "title": "Building Reactive Systems with Akka"
      },
      {
        "venue": "EcliseCon—San Francisco, US",
        "date": "March 2014",
        "title": "Go Reactive: Event-driven, Scalable, Resilient and Responsive Systems"
      },
      {
        "venue": "SF Scala—San Francisco, US",
        "date": "March 2014",
        "title": "Building Reactive Systems with Akka"
      },
      {
        "venue": "Build Stuff—Vilnius, Lithuania",
        "date": "December 2013",
        "title": "Going Reactive: Event-driven, Scalable, Resilient and Responsive Systems"
      },
      {
        "venue": "Codemesh—London, Great Britain",
        "date": "December 2013",
        "title": "Keynote: Going Reactive, New and Old ideas for your 21st century architectures"
      },
      {
        "venue": "Scala Exchange—London, Great Britain",
        "date": "December 2013",
        "title": "Keynote: The Road to Akka Cluster and Beyond"
      },
      {
        "venue": "Devoxx—Antwerp, Belgium",
        "date": "November 2013",
        "title": "Going Reactive: Event-driven, Scalable, Resilient and Responsive Systems"
      },
      {
        "venue": "JavaZone—Oslo, Norway",
        "date": "September 2013",
        "title": "Going Reactive: Event-driven, Scalable and Resilient Systems"
      },
      {
        "venue": "Scala Days—New York, US",
        "date": "June 2013",
        "title": "Going Reactive: Event-driven, Scalable and Resilient Systems"
      },
      {
        "venue": "Scala JP (Matsuri)—Tokyo, Japan",
        "date": "March 2013",
        "title": "Keynote — Up up and Out: Scaling software with Akka"
      },
      {
        "venue": "Jfokus—Stockholm, Sweden",
        "date": "February 2013",
        "title": "Building Scalable, Highly Concurrent and Fault-Tolerant Systems: Lessons Learned"
      },
      {
        "venue": "Tech Mesh—London, UK",
        "date": "November 2012",
        "title": "Up up and Out: Scaling software with Akka"
      },
      {
        "venue": "Devoxx—Antwerp, Belgium",
        "date": "November 2012",
        "title": "Up up and Out: Scaling software with Akka"
      },
      {
        "venue": "GOTO—Aarhus, Denmark",
        "date": "October 2012",
        "title": "Up up and Out: Scaling software with Akka 2"
      },
      {
        "venue": "Strange Loop—St. Louis, US",
        "date": "September 2012",
        "title": "Up up and Out: Scaling software with Akka 2"
      },
      {
        "venue": "JavaZone—Oslo, Norway",
        "date": "September 2012",
        "title": "Up up and Out: Scaling software with Akka 2"
      },
      {
        "venue": "OSCON—Portland, US",
        "date": "July 2012",
        "title": "Up up and Out: Scaling software with Akka 2"
      },
      {
        "venue": "Jazoon—Zurich, Switzerland",
        "date": "June 2012",
        "title": "Keynote — Building Scalable, Highly Concurrent and Fault-Tolerant Systems: Lessons Learned"
      },
      {
        "venue": "Erlang User Conference—Stockholm, Sweden",
        "date": "May 2012",
        "title": "Up up and Out: Scaling software with Akka 2"
      },
      {
        "venue": "Scala Days—London, UK",
        "date": "April 2012",
        "title": "Akka 2: Distributed by Design"
      },
      {
        "venue": "Jfokus—Stockholm, Sweden",
        "date": "February 2012",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "Devoxx—Antwerp, Belgium",
        "date": "November 2011",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "ScanDev on tour—Stockholm, Sweden",
        "date": "October 2011",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "GOTO—Amsterdam, Netherlands",
        "date": "September 2011",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "JavaZone—Oslo, Norway",
        "date": "September 2011",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "Reaktor—Helsinki, Finland",
        "date": "September 2011",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "Erlang Factory—London, UK",
        "date": "June 2011",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "Scala Days 2011—Stanford, US",
        "date": "June 2011",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "What's Next?—Paris, France",
        "date": "May 2011",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "GOTO—Copenhagen, Denmark",
        "date": "May 2011",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "Emerging Technologies—Philadelphia, US",
        "date": "April 2011",
        "title": "Above the Clouds: Introducing Akka"
      },
      {
        "venue": "Functional Progamming eXchange—London, UK",
        "date": "March 2011",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "NE Scala—New York, US",
        "date": "February 2011",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "JFokus—Stockholm, Sweden",
        "date": "February 2011",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "Geneva JUG",
        "date": "January 2011",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "Oredev—Malmo, Sweden",
        "date": "November 2010",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "ScalaLiftOff—London, UK",
        "date": "October 2010",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "JAOO—Aarhus, Denmark",
        "date": "October 2010",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "Scala Lift Off—San Francisco, US",
        "date": "Sept 2010",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "JavaOne—San Francisco, US",
        "date": "September 2010",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "JAOO Geek Nights—Copenhagen, Denmark",
        "date": "August 2010",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "JAOO Geek Nights—Aarhus, Denmark",
        "date": "August 2010",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "OSCON—Portland, US",
        "date": "July 2010",
        "title": "Let it crash: using Actors for fault-tolerance, scalability and concurrency"
      },
      {
        "venue": "GeeCon—Poznan, Poland",
        "date": "May 2010",
        "title": "Let it crash: using Actors for fault-tolerance, scalability and concurrency"
      },
      {
        "venue": "JAX 2010—Mainz, Germany",
        "date": "May 2010",
        "title": "Let it crash: using Actors for fault-tolerance, scalability and concurrency"
      },
      {
        "venue": "JAX 2010—Mainz, Germany",
        "date": "May 2010",
        "title": "State, You're Doing It Wrong: Exploring Alternative Concurrency Paradigms on the JVM"
      },
      {
        "venue": "Scala Days—Lausanne, Switzerland",
        "date": "April 2010",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "venue": "Scandinavian Developer Conference 2010—Gothenburg, Sweden",
        "date": "March 2010",
        "title": "Let it crash: using Actors for fault-tolerance, scalability and concurrency"
      },
      {
        "venue": "Kraków JUG, Poland",
        "date": "March 2010",
        "title": "Akka, Let It Crash"
      },
      {
        "venue": "Oredev—Malmo, Sweden",
        "date": "November 2009",
        "title": "Pragmatic Real-World Scala"
      },
      {
        "venue": "Oredev—Malmo, Sweden",
        "date": "November 2009",
        "title": "A comparative study of scalable and HA products, based on real projects"
      },
      {
        "venue": "JavaZone—Oslo, Norway",
        "date": "Sept 2009",
        "title": "Pragmatic Real-World Scala"
      },
      {
        "venue": "JavaZone—Oslo, Norway",
        "date": "September 2009",
        "title": "State, You're Doing It Wrong: Exploring Alternative Concurrency Paradigms on the JVM"
      },
      {
        "venue": "JavaOne—San Franscisco, US",
        "date": "June 2009",
        "title": "State, You're Doing It Wrong: Exploring Alternative Concurrency Paradigms on the JVM"
      },
      {
        "venue": "Scandinavian Developer Conference—Gothenburg, Sweden",
        "date": "March 2009",
        "title": "State, You're Doing It Wrong: Exploring Alternative Concurrency Paradigms on the JVM"
      },
      {
        "venue": "QCon London—London, Great Britain",
        "date": "March 2009",
        "title": "Pragmatic Real-World Scala"
      },
      {
        "venue": "JFokus—Stockholm, Sweden",
        "date": "January 2009",
        "title": "Pragmatic Real-World Scala"
      },
      {
        "venue": "Cologne JUG—Cologne, Germany",
        "date": "May 2008",
        "title": "Exploring Terracotta: Open Source JVM-level Clustering through Network-Attached Memory"
      },
      {
        "venue": "Ukraine JUG—Kiev, Ukraine",
        "date": "January 2008",
        "title": "Exploring Terracotta: Open Source JVM-level Clustering through Network-Attached Memory"
      },
      {
        "venue": "Wicket Meetup—Amsterdam, Belgium",
        "date": "November 2007",
        "title": "Exploring Terracotta: Open Source JVM-level Clustering through Network-Attached Memory"
      },
      {
        "venue": "Oredev—Malmo, Sweden",
        "date": "November 2007",
        "title": "Exploring Terracotta: Open Source JVM-level Clustering through Network-Attached Memory"
      },
      {
        "venue": "Java Developer Day—Krakow, Poland",
        "date": "October 2007",
        "title": "Terracotta: Open Source JVM-level Clustering"
      },
      {
        "venue": "Krakow JUG—Krakow, Poland",
        "date": "October 2007",
        "title": "Terracotta: Open Source JVM-level Clustering"
      },
      {
        "venue": "Java Hellenic User Group Conference—Athens, Greece",
        "date": "October 2007",
        "title": "Terracotta: Open Source JVM-level Clustering"
      },
      {
        "venue": "JAOO—Aarhus, Denmark",
        "date": "September 2007",
        "title": "Terracotta: Open Source JVM-level Clustering"
      },
      {
        "venue": "Sweden Spring User Group—Malmo, Sweden",
        "date": "September 2007",
        "title": "Scale Out Your Spring Applications Using JVM-level Clustering"
      },
      {
        "venue": "JavaZone—Olso, Norway",
        "date": "September 2007",
        "title": "POJO Scalability and Large Workloads with Open Terracotta"
      },
      {
        "venue": "Dusseldorf JUG—Dusseldorf, Germany",
        "date": "September 2007",
        "title": "Terracotta: Open Source JVM-level Clustering"
      },
      {
        "venue": "TheServerSide Java Symposium—Barcelona, Spain",
        "date": "June 2007",
        "title": "POJO Scalability and Large Workloads with Terracotta"
      },
      {
        "venue": "J-Spring NLJUG—Amsterdam, Netherlands",
        "date": "June 2007",
        "title": "Stateful Applications In a Stateless World"
      },
      {
        "venue": "Dansk IT Java Kompetence Netværk—Copenhagen, Denmark",
        "date": "June 2007",
        "title": "Terracotta: Open Source JVM-level Clustering"
      },
      {
        "venue": "ExpertZone Developer Summit—Stockholm, Sweden",
        "date": "May 2007",
        "title": "How To Write Stateful Web Applications That Scale Like Stateless Ones"
      },
      {
        "venue": "TheServerSide Java Symposium—Las Vegas, US",
        "date": "March 2007",
        "title": "POJO Scalability and Large Workloads with Open Terracotta"
      },
      {
        "venue": "AOSD—Vancouver, Canada",
        "date": "March 2007",
        "title": "Clustering the Java Virtual Machine using Aspect-Oriented Programming"
      },
      {
        "venue": "Czech JUG—Prague, Czech Republic",
        "date": "February 2007",
        "title": "How To Write Stateful Web Applications That Scale Like Stateless Ones"
      },
      {
        "venue": "JFokus, Stockholm—Sweden",
        "date": "January 2007",
        "title": "Using AOP to Cluster the JVM"
      },
      {
        "venue": "JUG Milano, Milano—Italy",
        "date": "January 2007",
        "title": "Distributed Computing Made Easy: How To Build a POJO-based Data Grid"
      },
      {
        "venue": "JUG Torino, Torino—Italy",
        "date": "January 2007",
        "title": "How To Write Stateful Web Applications That Scale Like Stateless Ones"
      },
      {
        "venue": "The Spring Experience, Hollywood/Florida—US",
        "date": "December 2006",
        "title": "Rapid Fire Session—Terracotta for Spring"
      },
      {
        "venue": "Javagruppen, Copenhagen—Denmark",
        "date": "November 2006",
        "title": "Terracotta for Spring: How to build stateful, scalable, and highly-available web applications"
      },
      {
        "venue": "Oredev, Malmo—Sweden",
        "date": "November 2006",
        "title": "Distributed Computing Made Easy: How To Build a POJO-based Data Grid"
      },
      {
        "venue": "JUG Belgrade, Belgrade—Serbia",
        "date": "November 2006",
        "title": "Terracotta for Spring / Distributed Computing Made Easy: How To Build a POJO-based Data Grid"
      },
      {
        "venue": "JUG Novi Sad, Novi Sad—Serbia",
        "date": "November 2006",
        "title": "Terracotta for Spring: How to build stateful, scalable, and highly-available web applications"
      },
      {
        "venue": "Spring Forward, Philadelphia—US",
        "date": "September 2006",
        "title": "Transparently Clustered Spring"
      },
      {
        "venue": "SpringOne, Antwerp—Belgium",
        "date": "June 2006",
        "title": "Transparently Clustered Spring"
      },
      {
        "venue": "TheServerSide Java Symposium Europe 2006, Barcelona—Spain",
        "date": "June 2006",
        "title": "Transparently Clustered Spring"
      },
      {
        "venue": "JavaOne, San Francisco—US",
        "date": "May 2006",
        "title": "Transparently Clustered Spring — A Runtime Solution for Java Technology"
      },
      {
        "venue": "JavaPolis, Antwerp—Belgium",
        "date": "December 2005",
        "title": "Time To Throw Out Your Distributed HashMap?"
      },
      {
        "venue": "JavaPolis, Antwerp—Belgium",
        "date": "December 2005",
        "title": "Transparently Clustered Spring"
      },
      {
        "venue": "The Spring Experience, Miami—US",
        "date": "December 2005",
        "title": "Transparently Clustered Spring"
      },
      {
        "venue": "JavaOne Japan, Tokyo—Japan",
        "date": "November 2005",
        "title": "Using AOP Techniques to Inject Enterprise Quality of Services into Applications Transparently at Runtime (Technical Session)"
      },
      {
        "venue": "JavaOne Japan, Tokyo—Japan",
        "date": "November 2005",
        "title": "Importance of Preserving Object Identity in a Cluster (BOF)"
      },
      {
        "venue": "Oredev, Malmo—Sweden",
        "date": "October 2005",
        "title": "AOP-Driven Services: Achieve Modularity and Reusability on the J2EE Platform"
      },
      {
        "venue": "Java Pro Live!, San Diego—US",
        "date": "September 2005",
        "title": "AOP-Driven Services: Achieve Modularity and Reusability on the J2EE Platform"
      },
      {
        "venue": "BEA dev2dev Tech Days, Tokyo—Japan",
        "date": "August 2005",
        "title": "AOP-Driven Services: Achieve Modularity and Reusability on the J2EE Platform"
      },
      {
        "venue": "BEA dev2dev Tech Days, Osaka—Japan",
        "date": "August 2005",
        "title": "AOP-Driven Services: Achieve Modularity and Reusability on the J2EE Platform"
      },
      {
        "venue": "JavaOne, San Francisco—US",
        "date": "June 2005",
        "title": "Runtime Aspects With JVM Support (Technical Session)"
      },
      {
        "venue": "Nordev, Stockholm Sweden",
        "date": "May 2005",
        "title": "AOP-Driven Services: Achieve Modularity and Reusability on the J2EE Platform"
      },
      {
        "venue": "Architect Summit, New York—US",
        "date": "April 2005",
        "title": "AOP-Driven Services: Achieve Modularity and Reusability on the J2EE Platform"
      },
      {
        "venue": "AOSD, Chicago—US",
        "date": "March 2005",
        "title": "What's new in AspectJ 5"
      },
      {
        "venue": "AOSD, Chicago—US",
        "date": "March 2005",
        "title": "AspectWerkz 2 and the road to AspectJ 5"
      },
      {
        "venue": "AOSD, Chicago—US",
        "date": "March 2005",
        "title": "Industry adoption for AOP—Expert panel discussion"
      },
      {
        "venue": "JAOO, Aarhus—Denmark",
        "date": "September 2004",
        "title": "Annotation-driven AOP"
      },
      {
        "venue": "JavaOne, San Francisco—US",
        "date": "June 2004",
        "title": "Internals of AspectWerkz (BOF)"
      },
      {
        "venue": "JavaOne, San Francisco—US",
        "date": "June 2004",
        "title": "Dynamic Aspect Oriented Programming with AspectWerkz (Technical Session, +1200 attendees)"
      },
      {
        "venue": "eWorld, San Francisco—US",
        "date": "May 2004",
        "title": "Dynamic AOP: SOA for the application"
      },
      {
        "venue": "AOSD, Lancaster—UK",
        "date": "March 2004",
        "title": "Developing with AspectWerkz—half day tutorial"
      },
      {
        "venue": "AOSD, Lancaster—UK",
        "date": "March 2004",
        "title": "What are the key issues for commercial AOP use—and how does AspectWerkz address them? (Invited Industry Talk)"
      },
      {
        "venue": "AOSD, Lancaster—UK",
        "date": "March 2004",
        "title": "Expert panel discussion—Industry adoption for AOP"
      },
      {
        "venue": "JavaPolis, Antwerp—Belgium",
        "date": "December 2003",
        "title": "Introduction to AspectWerkz"
      }
    ]
  },
  "interviews": {
    "title": "Interviews",
    "lede": "Here is a list of links to various interviews done with me throughout the years.",
    "items": [
      {
        "year": "2025",
        "url": "https://www.youtube.com/watch?v=wXM3-jAKDfQ",
        "src": "Rock the JVM",
        "title": "Jonas Bonér on Akka, Distributed Systems, Open-Source Sustainability and the Backbone of Agentic AI"
      },
      {
        "year": "2025",
        "url": "https://scalac.io/blog/jonas-akka/",
        "src": "Scalac",
        "title": "CTO ask CTO: Jonas Bonér, creator of Akka – distributed systems, the Akka Platform and AI"
      },
      {
        "year": "2024",
        "url": "https://tfir.io/boundaries-between-cloud-and-edge-computing-will-continue-to-blur-predicts-jonas-boner-of-lightbend/",
        "src": "TFIR",
        "title": "Boundaries Between Cloud and Edge Computing Will Continue to Blur"
      },
      {
        "year": "2023",
        "url": "https://dzone.com/articles/platform-engineering-trends-in-cloud-native-qampa-1",
        "src": "DZone",
        "title": "Platform Engineering Trends in Cloud-Native: Q&A With Jonas Bonér"
      },
      {
        "year": "2023",
        "url": "https://www.edgeir.com/lightbend-bridging-the-cloud-and-edge-application-development-gap-20230706",
        "src": "Edge IR",
        "title": "Lightbend: bridging the cloud and edge application development gap"
      },
      {
        "year": "2023",
        "url": "https://www.tfir.io/platform-engineering-is-a-big-investment-you-need-to-make-sure-if-you-really-need-it-jonas-boner/",
        "src": "TRIF",
        "title": "Platform Engineering Is A Big Investment; You Need To Make Sure If You Really Need It"
      },
      {
        "year": "2023",
        "url": "https://dmradio.biz/archives/6188",
        "src": "DM Radio Show",
        "title": "The Great Migration? Now Showing!"
      },
      {
        "year": "2022",
        "url": "https://www.youtube.com/watch?v=ph9eCpUd4Do",
        "src": "VMBlog",
        "title": "VMblog 2022 Mega Series, Lightbend Explores Kalix"
      },
      {
        "year": "2022",
        "url": "https://www.youtube.com/watch?v=R-X5t4piUUY",
        "src": "TRIF",
        "title": "Distributed State In Serverless Is Going Mainstream"
      },
      {
        "year": "2021",
        "url": "https://tfir.io/distributed-state-in-serverless-is-going-mainstream-jonas-boner/",
        "src": "TFIR",
        "title": "Distributed State In Serverless Is Going Mainstream"
      },
      {
        "year": "2021",
        "url": "https://vmblog.com/archive/2021/12/13/lightbend-2022-predictions-3-predictions-for-serverless-computing-and-development-in-2022.aspx",
        "src": "VMBlog",
        "title": "3 Predictions for Serverless Computing and Development in 2022"
      },
      {
        "year": "2021",
        "url": "https://www.serverlesschats.com/112/",
        "src": "Serverless Chats",
        "title": "Abstracting Stateful Serverless with Jonas Bonér"
      },
      {
        "year": "2021",
        "url": "https://anchor.fm/happypathprogramming/episodes/38-Databases-are-Insufficient-with-Jonas-Bonr-e16i22j",
        "src": "Happy Path Programming",
        "title": "Databases are Insufficient, with Jonas Bonér"
      },
      {
        "year": "2021",
        "url": "https://jaxenter.com/akka-serverless-interview-174709.html",
        "src": "JAX Enter",
        "title": "Interview with Jonas Bonér: Akka Serverless is really the first of its kind"
      },
      {
        "year": "2021",
        "url": "https://www.infoq.com/news/2021/06/akka-serverless-open-beta/",
        "src": "InfoQ",
        "title": "Lightbend Announces Akka Serverless Open Beta"
      },
      {
        "year": "2021",
        "url": "https://searchapparchitecture.techtarget.com/news/252496868/Lightbend-launches-new-Akka-Cloud-Service-on-AWS",
        "src": "Tech Target",
        "title": "Lightbend launches new Akka Cloud Platform on AWS"
      },
      {
        "year": "2020",
        "url": "https://thenewstack.io/lightbends-jonas-boner-on-how-to-minimize-cloud-native-complexity",
        "src": "The New Stack",
        "title": "Lightbend's Jonas Bonér on How to Minimize Cloud Native Complexity"
      },
      {
        "year": "2020",
        "url": "https://adtmag.com/blogs/watersworks/2020/11/new-reactive-manifesto.aspx",
        "src": "ADT Mag",
        "title": "Jonas Bonér and the Reactive Manifesto II"
      },
      {
        "year": "2020",
        "url": "https://thenewstack.io/lightbends-cloudstate-builds-on-akka-to-offer-stateful-serverless/",
        "src": "The New Stack Podcast",
        "title": "Lightbend's Cloudstate Builds on Akka to Offer Stateful Serverless"
      },
      {
        "year": "2020",
        "url": "https://spring.io/blog/2020/09/17/a-bootiful-podcast-lightbend-cto-jonas-bon-r-on-his-epic-aspect-oriented-distributed-reactive-work",
        "src": "Spring Podcast",
        "title": "Lightbend CTO Jonas Bonér on his epic, aspect-oriented, distributed, reactive work"
      },
      {
        "year": "2020",
        "url": "https://thenewstack.io/cloudstate-is-lightbends-attempt-to-define-serverless-2-0/",
        "src": "The New Stack",
        "title": "Cloudstate Is Lightbend's Attempt to Define Serverless 2.0"
      },
      {
        "year": "2020",
        "url": "https://www.infoworld.com/article/3567648/what-comes-after-kubernetes.html",
        "src": "InfoWorld",
        "title": "What comes after Kubernetes?"
      },
      {
        "year": "2019",
        "url": "https://techcrunch.com/2019/08/27/new-open-source-project-wants-to-expand-serverless-vision-beyond-functions/",
        "src": "TechCrunch",
        "title": "New open-source project wants to expand serverless vision beyond functions"
      },
      {
        "year": "2019",
        "url": "https://thenewstack.io/context-the-stateful-services-of-serverless-2-0/",
        "src": "The New Stack",
        "title": "Context: The Stateful Services of Serverless 2.0"
      },
      {
        "year": "2018",
        "url": "https://www.infoq.com/articles/stateful-service-design-kubernetes",
        "src": "InfoQ",
        "title": "Interviewed on Stateful Service Design Considerations for the Kubernetes Stack"
      },
      {
        "year": "2018",
        "url": "https://thenewstack.io/akka-java-middleware-what-goes-inside-the-containers-counts/",
        "src": "The New Stack",
        "title": "Akka Java Middleware: What Goes Inside the Containers Counts"
      },
      {
        "year": "2018",
        "url": "https://www.youtube.com/watch?v=W47FWYYWCm4",
        "src": "J On The Beach",
        "title": "Interviewed after my talk on Designing Events-first Microservices"
      },
      {
        "year": "2018",
        "url": "https://dzone.com/articles/codetalk-expert-talks-cloud-native-and-streaming-d",
        "src": "DZone",
        "title": "CodeTalk: Cloud Native and Streaming Data Trends Ahead for Jakarta EE"
      },
      {
        "year": "2018",
        "url": "https://otia.io/2018/03/23/jonas-boner-cto-of-lightbend-on-skiing-and-jazz/",
        "src": "Otia",
        "title": "Jonas Bonér, CTO of Lightbend on Skiing and Jazz"
      },
      {
        "year": "2018",
        "url": "https://dzone.com/articles/how-java-ee-can-get-its-groove-back",
        "src": "DZone",
        "title": "How Java EE Can Get Its Groove Back"
      },
      {
        "year": "2017",
        "url": "https://www.patreon.com/posts/episode-075-with-15024142",
        "src": "Elixir Fountain Podcast",
        "title": "Episode 075: Visiting the Actor's Studio with Jonas Bonér"
      },
      {
        "year": "2017",
        "url": "https://dzone.com/articles/where-do-i-start-with-event-driven-architecture",
        "src": "DZone",
        "title": "Where Do I Start With Event-Driven Architecture?"
      },
      {
        "year": "2017",
        "url": "http://queue.acm.org/detail.cfm?id=3131240",
        "src": "ACM Queue",
        "title": "Hootsuite: In Pursuit of Reactive Systems"
      },
      {
        "year": "2017",
        "url": "https://www.infoq.com/podcasts/jonas-boner-akka",
        "src": "InfoQ Podcast",
        "title": "Jonas Bonér on the Actor Model, Akka, Reactive Programming, Microservices and Distributed Systems"
      },
      {
        "year": "2016",
        "url": "https://soundcloud.com/oreilly-radar/making-microservices-more-reactive",
        "src": "O'Reilly",
        "title": "O'Reilly Radar Podcast: Making Microservices More Reactive"
      },
      {
        "year": "2016",
        "url": "https://www.infoq.com/news/2016/03/lagom-microservices-framework",
        "src": "InfoQ",
        "title": "Lagom, a New Microservices Framework"
      },
      {
        "year": "2016",
        "url": "http://www.techrepublic.com/article/why-microservices-are-about-to-have-their-cloud-moment/",
        "src": "TechRepublic",
        "title": "Why microservices are about to have their \"cloud\" moment"
      },
      {
        "year": "2016",
        "url": "https://www.oreilly.com/ideas/defining-a-reactive-microservice",
        "src": "O'Reilly",
        "title": "Defining a Reactive Microservice"
      },
      {
        "year": "2016",
        "url": "https://adtmag.com/articles/2016/02/23/typesafe-java-microservices.aspx?m=1",
        "src": "ADT MAG",
        "title": "Typesafe (Now Lightbend) Unveils Java Platform for Microservices"
      },
      {
        "year": "2016",
        "url": "https://adtmag.com/blogs/watersworks/2016/02/2016-dev-predictions-3.aspx",
        "src": "ADT MAG",
        "title": "2016 Dev Predictions: Mainstream Microservices, Reactive Streams and Containers-as-a-Service"
      },
      {
        "year": "2015",
        "url": "https://dzone.com/storage/assets/467172-dzone-guide-to-the-java-ecosystem.pdf",
        "src": "DZone",
        "title": "The DZone Guide to 2015 Edition to the Java Ecosystem"
      },
      {
        "year": "2015",
        "url": "https://dzone.com/articles/first-look-akka-streams",
        "src": "DZone",
        "title": "First Look at Akka Streams: A Powerful Library for Composable Data Streams"
      },
      {
        "year": "2015",
        "url": "https://jaxenter.com/open-source-makes-all-of-this-possible-akka-creator-jonas-boner-116467.html",
        "src": "JAX Enter",
        "title": "\"Open source makes all of this possible\"–Akka creator Jonas Bonér"
      },
      {
        "year": "2015",
        "url": "http://blog.acolyer.org/2015/03/15/desert-island-papers-jonas-boner/",
        "src": "The Morning Paper",
        "title": "Desert Island Papers: Jonas Bonér"
      },
      {
        "year": "2015",
        "url": "http://thenewstack.io/typesafes-jonas-boner-how-reactive-programming-addresses-the-scale-out-problem/",
        "src": "The New Stack",
        "title": "Typesafe's Jonas Bonér: How Reactive Programming Addresses the Scale-out Problem"
      },
      {
        "year": "2014",
        "url": "https://www.infoq.com/news/2014/12/Typesafe-surveys-Java-Adoption",
        "src": "InfoQ",
        "title": "Typesafe survey: Java 8 Adoption Strong, Users Anxious for Java 9"
      },
      {
        "year": "2014",
        "url": "http://readwrite.com/2014/10/20/java-8-adoption-apache-spark-internet-of-things",
        "src": "ReadWriteWeb",
        "title": "Developers Are Adopting Java 8 In Droves. Thank lambdas!"
      },
      {
        "year": "2014",
        "url": "https://www.infoq.com/articles/reactive-programming-anti-patterns",
        "src": "InfoQ",
        "title": "Jonas Bonér on Reactive Systems Anti-Patterns"
      },
      {
        "year": "2014",
        "url": "http://readwrite.com/2014/09/19/reactive-programming-jonas-boner-typesafe",
        "src": "ReadWriteWeb",
        "title": "As Systems Get More Complex, Programming Is Getting \"Reactive\". A new way to develop for the cloud."
      },
      {
        "year": "2014",
        "url": "http://adtmag.com/blogs/watersworks/2014/07/akka-turns-5.aspx",
        "src": "ADT Mag",
        "title": "Open Source Akka JVM Toolkit for Concurrency and Scalability Turns 5"
      },
      {
        "year": "2014",
        "url": "http://readwrite.com/2014/07/10/akka-jonas-boner-concurrency-distributed-computing-internet-of-things",
        "src": "ReadWriteWeb",
        "title": "How One Developer Set Out To Make The Internet Of Things Manageable"
      },
      {
        "year": "2014",
        "url": "http://sdtimes.com/a-functional-programming-crash-course-for-java-developers",
        "src": "SD Times",
        "title": "A functional programming crash course for Java developers"
      },
      {
        "year": "2014",
        "url": "https://www.youtube.com/watch?v=3Qfaz2nQ4U8",
        "src": "CodeMotion Roma",
        "title": "Interview on Open Source community, Akka, Reactive Systems etc."
      },
      {
        "year": "2014",
        "url": "http://jaxenter.com/typesafe-cto-the-reactive-future-on-the-jvm-is-very-bright-107591.html",
        "src": "JAX Enter",
        "title": "Typesafe CTO: The Reactive future on the JVM is very bright"
      },
      {
        "year": "2014",
        "url": "https://www.eclipsecon.org/na2014/content/speaker-interview-jonas-boner",
        "src": "EclipseCon",
        "title": "Speaker Interview with Jonas Bonér"
      },
      {
        "year": "2013",
        "url": "http://www.business-software.com/blog/typesafe-enables-scalable-enterprise-development/",
        "src": "Business Software",
        "title": "Behind the Software Q&A with Typesafe CTO Jonas Bonér"
      },
      {
        "year": "2012",
        "url": "https://web.archive.org/web/20121110205652/http://computersweden.idg.se/2.2683/1.475388",
        "src": "Computer Sweden",
        "title": "Jonas är Sveriges bästa utvecklare"
      },
      {
        "year": "2012",
        "url": "http://esj.com/articles/2012/07/16/akka-101.aspx",
        "src": "Enterprise Systems",
        "title": "Q&A: Akka 101. What makes Akka so valuable for building today's distributed applications?"
      },
      {
        "year": "2011",
        "url": "https://www.infoq.com/interviews/jonasboner-krestenkrabthorup-erlang-jvm",
        "src": "InfoQ",
        "title": "Jonas Bonér and Kresten Krab Thorup on Bringing Erlang's Fault Tolerance and Distribution to Java with Akka and Erjang"
      },
      {
        "year": "2011",
        "url": "http://electronicdesign.com/embedded/akka-open-source-event-driven-middleware-project",
        "src": "Electronic Design",
        "title": "Akka: an open source, event-driven middleware project"
      },
      {
        "year": "2011",
        "url": "https://www.infoq.com/interviews/boner-akka",
        "src": "InfoQ",
        "title": "Jonas Bonér on Akka, Actors and Shared State, STM, Typesafe"
      },
      {
        "year": "2011",
        "url": "https://www.se-radio.net/2011/08/episode-178-akka-with-jonas-boner/",
        "src": "Sofware Engineering Radio Podcast",
        "title": "Episode 178: Akka With Jonas Bonér"
      },
      {
        "year": "2011",
        "url": "https://www.infoq.com/news/2011/05/akka11",
        "src": "InfoQ",
        "title": "Akka 1.1 Released, Brings Many Improvements to Futures and Performance, Reduces Dependencies"
      },
      {
        "year": "2011",
        "url": "http://jetbrains.dzone.com/articles/talking-about-akka-scala-and",
        "src": "DZone",
        "title": "Talking about Akka, Scala and life with Jonas Bonér"
      },
      {
        "year": "2011",
        "url": "https://www.infoq.com/news/2011/02/akka10",
        "src": "InfoQ",
        "title": "Akka Reaches 1.0 Status: Brings the Actor Model to Java and Scala"
      },
      {
        "year": "2010",
        "url": "https://www.infoq.com/news/2010/03/akka-10",
        "src": "InfoQ",
        "title": "Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors"
      },
      {
        "year": "2010",
        "url": "https://www.artima.com/scalazine/articles/akka_jonas_boner.html",
        "src": "Artima",
        "title": "Writing Concurrent, Scalable, Fault-Tolerant Systems with Akka 1.0. A Conversation with Jonas Bonér"
      },
      {
        "year": "2009",
        "url": "http://chariotsolutions.com/podcast/episode-47-jonas-boner-on-the-akka-framework-scala-and-highly-scalable-applications/",
        "src": "Chariot Solutions Podcast",
        "title": "TechCast #47: Jonas Bonér on the Akka framework, Scala, and highly scalable applications"
      },
      {
        "year": "2014",
        "src": "EclipseCon",
        "title": "Speaker Interview with Jonas Bonér",
        "url": "https://www.eclipsecon.org/na2014/content/speaker-interview-jonas-bon%C3%A9r"
      }
    ]
  },
  "posts": {
    "title": "All Posts",
    "byYear": [
      {
        "year": "2018",
        "items": [
          {
            "title": "Foreword—Reactive Application Development",
            "slug": "foreword-reactive-application-development",
            "url": "posts/foreword-reactive-application-development.html",
            "blurb": "This is the foreword I wrote for Duncan DeVore’s and Sean Walsh’s great book on Reactive Application Development."
          }
        ]
      },
      {
        "year": "2017",
        "items": [
          {
            "title": "Foreword—Reactive Design Patterns",
            "slug": "foreword-reactive-design-patterns",
            "url": "posts/foreword-reactive-design-patterns.html",
            "blurb": "This is the foreword I wrote for Roland Kuhn’s excellent book on Reactive Design Patterns."
          }
        ]
      },
      {
        "year": "2016",
        "items": [
          {
            "title": "Foreword—Functional and Reactive Domain Modeling",
            "slug": "foreword-functional-and-reactive-domain-modeling",
            "url": "posts/foreword-functional-and-reactive-domain-modeling.html",
            "blurb": "This is the foreword I wrote for Debasish Ghosh’s great book on Functional and Reactive Domain Modeling."
          },
          {
            "title": "Foreword—Reactive Messaging Patterns with the Actor Model",
            "slug": "foreword-reactive-messaging-patterns",
            "url": "posts/foreword-reactive-messaging-patterns.html",
            "blurb": "This is the foreword I wrote for Vaughn Vernon’s great book on Reactive Messaging Patterns with the Actor Model."
          },
          {
            "title": "Foreword—Developing Reactive Microservices",
            "slug": "foreword-developing-reactive-microservices",
            "url": "posts/foreword-developing-reactive-microservices.html",
            "blurb": "This is the foreword I wrote for Markus Eisele’s great book on Developing Reactive Microservices."
          },
          {
            "title": "Foreword—Programming Scala",
            "slug": "foreword-programming-scala",
            "url": "posts/foreword-programming-scala.html",
            "blurb": "This is the foreword I wrote for Dean Wampler’s—now classic—book on Programming Scala from 2009."
          },
          {
            "title": "bla bla microservices bla bla",
            "slug": "bla-bla-microservices-bla-bla",
            "url": "posts/bla-bla-microservices-bla-bla.html",
            "blurb": "This is a the transcript of my keynote at O’Reilly Software Architecture Conference in New York in April 2016."
          }
        ]
      },
      {
        "year": "2013",
        "items": [
          {
            "title": "Reactive Manifesto 1.0",
            "slug": "reactive-manifesto-1-0",
            "url": "posts/reactive-manifesto-1-0.html",
            "blurb": "Defining the blueprint for future applications that are event-driven, scalable, resilient and interactive."
          }
        ]
      },
      {
        "year": "2010",
        "items": [
          {
            "title": "Introducing Akka - Simpler Scalability, Fault-Tolerance, Concurrency & Remoting through Actors",
            "slug": "introducing-akka",
            "url": "posts/introducing-akka.html",
            "blurb": "p(meta). 4 Jan 2010"
          }
        ]
      },
      {
        "year": "2009",
        "items": [
          {
            "title": "Asynchronous Event Sourcing using Actors",
            "slug": "event-sourcing-using-actors",
            "url": "posts/event-sourcing-using-actors.html",
            "blurb": "p(meta). 12 Feb 2009 h1. Introduction There has been some discussions lately about Event Sourcing. For example, Greg Young \"recently discussed\":http://..."
          },
          {
            "title": "Blogging Like a Hacker using Git and Jekyll",
            "slug": "blogging-like-a-hacker-using-git-and-jekyll",
            "url": "posts/blogging-like-a-hacker-using-git-and-jekyll.html",
            "blurb": "p(meta). 7 Jan 2009"
          }
        ]
      },
      {
        "year": "2008",
        "items": [
          {
            "title": "Real-World Scala: Fault-tolerant Concurrent Asynchronous Components",
            "slug": "real-world-scala-fault-tolerant-concurrent-asynchronous-components",
            "url": "posts/real-world-scala-fault-tolerant-concurrent-asynchronous-components.html",
            "blurb": "Introduction"
          },
          {
            "title": "Real-World Scala: Managing Cross-Cutting Concerns using Mixin Composition and AOP",
            "slug": "real-world-scala-managing-cross-cutting-concerns-using-mixin-composition-and-aop",
            "url": "posts/real-world-scala-managing-cross-cutting-concerns-using-mixin-composition-and-aop.html",
            "blurb": "In a previous post I showed you how you could use mixin composition and self type annotations to enable Dependency Injection (DI). Mixin composition is an ex..."
          },
          {
            "title": "Reward Failure",
            "slug": "reward-failure",
            "url": "posts/reward-failure.html",
            "blurb": "Alex Miller has written a very important post on the importance of failure, putting, what has been one of my guiding principles in leadership and working env..."
          },
          {
            "title": "Real-World Scala: Dependency Injection (DI) ",
            "slug": "real-world-scala-dependency-injection-di",
            "url": "posts/real-world-scala-dependency-injection-di.html",
            "blurb": "Posted: 2008-10-06 In this second post in the Real-World Scala series I am going to discuss how to implement/achieve Depenency Injection (DI) in Scala. Sc..."
          },
          {
            "title": "Real-World Scala: Introduction",
            "slug": "real-world-scala-introduction",
            "url": "posts/real-world-scala-introduction.html",
            "blurb": "The last nine months I have been running my own business together with some friends (Triental AB). We are building a product suite for private banking and we..."
          },
          {
            "title": "Erlang-style Supervisor Module for Scala Actors",
            "slug": "erlang-style-supervisor-module-for-scala-actors",
            "url": "posts/erlang-style-supervisor-module-for-scala-actors.html",
            "blurb": "In this post I will explain how you can build fault-tolerant systems using Scala Actors by arranging them in Supervisor hierarchies using a library for Scala..."
          },
          {
            "title": "AOP-style Mixin Composition Stacks in Scala",
            "slug": "aop-style-mixin-composition-stacks-in-scala",
            "url": "posts/aop-style-mixin-composition-stacks-in-scala.html",
            "blurb": "Scala is one those great languages that is scalable. With scalable I mean that it is the language that grows with the user, that it makes simple things easy ..."
          },
          {
            "title": "Clustering Scala Actors with Terracotta",
            "slug": "clustering-scala-actors-with-terracotta",
            "url": "posts/clustering-scala-actors-with-terracotta.html",
            "blurb": "Introduction A month ago I wrote an introductory post about Scala Actors: HotSwap Code using Scala and Actors. For you who don't know what it is I don't w..."
          }
        ]
      },
      {
        "year": "2007",
        "items": [
          {
            "title": "HotSwap Code using Scala and Actors",
            "slug": "hotswap-code-using-scala-and-actors",
            "url": "posts/hotswap-code-using-scala-and-actors.html",
            "blurb": "Update: In this article I am showing an even more powerful way of doing hotswap in Scala. ---- In this post I will show you how you can do code hotswap i..."
          },
          {
            "title": "The Terracotta Book",
            "slug": "the-terracotta-book",
            "url": "posts/the-terracotta-book.html",
            "blurb": "The last month I have been very busy writing on The Definitive Guide to Terracotta. It is a collaborative effort from the Terracotta team each one writing..."
          },
          {
            "title": "Interview with Joe Armstrong on Erlang and more...",
            "slug": "interview-with-joe-armstrong-on-erlang-and-more",
            "url": "posts/interview-with-joe-armstrong-on-erlang-and-more.html",
            "blurb": "I had the pleasure of attending Joe Armstrong's fantastic presentation at JAOO some weeks ago. It was by far the best talk at the whole conference, both in t..."
          },
          {
            "title": "Clojure: a Lisp-dialect for the JVM - with focus on Functional and Concurrent Programming",
            "slug": "clojure-a-lisp-dialect-for-the-jvm-with-focus-on-functional-and-concurrent-programming",
            "url": "posts/clojure-a-lisp-dialect-for-the-jvm-with-focus-on-functional-and-concurrent-programming.html",
            "blurb": "Yesterday, Rich Hickey announced the birth of Clojure - a lisp dialect for the JVM. After just a brief look, Clojure is perhaps the most interesting langu..."
          },
          {
            "title": "Article: Distributed Web Continuations with RIFE and Terracotta",
            "slug": "article-distributed-web-continuations-with-rife-and-terracotta",
            "url": "posts/article-distributed-web-continuations-with-rife-and-terracotta.html",
            "blurb": "My and Geert Bevin's article about how to cluster RIFE's Web Continuations with Terracotta has just been published on Artima. Here is the abstract: In ..."
          },
          {
            "title": "The Power of Sockets and Dynamic Proxies",
            "slug": "the-power-of-sockets-and-dynamic-proxies",
            "url": "posts/the-power-of-sockets-and-dynamic-proxies.html",
            "blurb": "I was going through some of the older parts of my darcs repository the other day when I stumbled upon a pretty neat and powerful little remoting library that..."
          },
          {
            "title": "Love What You Do",
            "slug": "love-what-you-do",
            "url": "posts/love-what-you-do.html",
            "blurb": "I was in Rome, Italy some weeks ago. After strolling around in the old town for a couple hours I felt the need to grab a bite. So I stopped at a cafÃ©, sat d..."
          },
          {
            "title": "Love What You Do",
            "slug": "love-what-you-do",
            "url": "posts/love-what-you-do.html",
            "blurb": "July 04, 2007 I was in Rome, Italy some weeks ago. After strolling around in the old town for a couple hours I felt the need to grab a bite. So I stopped at..."
          },
          {
            "title": "How To Keep Your Creative Flow",
            "slug": "how-to-keep-your-creative-flow",
            "url": "posts/how-to-keep-your-creative-flow.html",
            "blurb": "I recently saw an interview with Jan Guillou, one of the most successful and creative authors in Sweden. He had some interesting thoughts about creativity th..."
          },
          {
            "title": "How To Keep Your Creative Flow",
            "slug": "how-to-keep-your-creative-flow",
            "url": "posts/how-to-keep-your-creative-flow.html",
            "blurb": "June 28, 2007 I recently saw an interview with the Swedish author Jan Guillou. He had some interesting thoughts about creativity that I think applies to all..."
          },
          {
            "title": "Invert Your Database Caching Dependency for Extreme Scalability",
            "slug": "invert-your-database-caching-dependency-for-extreme-scalability",
            "url": "posts/invert-your-database-caching-dependency-for-extreme-scalability.html",
            "blurb": "Today most applications rely on a relational database (RDBMS) as its primary Service of Record (SoR) -- the master copy of the data. But in order to minimize..."
          },
          {
            "title": "Terracotta War Story:How We Clustered RIFE  ",
            "slug": "terracotta-war-storyhow-we-clustered-rife",
            "url": "posts/terracotta-war-storyhow-we-clustered-rife.html",
            "blurb": "This is the story how Geert Bevin and I clustered RIFE with Terracotta. The purpose of this blog post is to give an example of how JVM-level clustering of..."
          },
          {
            "title": "Building Stateful, Scalable and Highly-Available Web Applications with Spring Web Flow and Open Terracotta",
            "slug": "building-stateful-scalable-and-highly-available-web-applications-with-spring-web-flow-and-open-terracotta",
            "url": "posts/building-stateful-scalable-and-highly-available-web-applications-with-spring-web-flow-and-open-terracotta.html",
            "blurb": "My and Eugene's article on how to use Spring Web Flow together with Open Terracotta to build conversational, scalable and highly-available web applications h..."
          },
          {
            "title": "Clustering the JVM using AOP: the Inner Workings of Terracotta DSO",
            "slug": "clustering-the-jvm-using-aop-the-inner-workings-of-terracotta-dso",
            "url": "posts/clustering-the-jvm-using-aop-the-inner-workings-of-terracotta-dso.html",
            "blurb": "Our paper for AOSD 2007 has been published. It is titled 'Clustering the Java Virtual Machine using Aspect-Oriented Programming' and is a thorough and pragma..."
          },
          {
            "title": "Clustering JRuby with Terracotta",
            "slug": "clustering-jruby-with-open-terracotta",
            "url": "posts/clustering-jruby-with-open-terracotta.html",
            "blurb": "Yesterday I was spending some time thinking about the possibilities to cluster applications written in \"JRuby\":http://jruby.codehaus.org/ with \"Terracotta\":h..."
          },
          {
            "title": "How to Build a POJO-based Data Grid using Terracotta",
            "slug": "how-to-build-a-pojo-based-data-grid-using-open-terracotta",
            "url": "posts/how-to-build-a-pojo-based-data-grid-using-open-terracotta.html",
            "blurb": "In this article, I will show you step by step how you can build a reusable POJO-based Data Grid with nothing but standard JDK *5 and then make it distributed..."
          },
          {
            "title": "...and the Award for Best Programming Font Goes To...",
            "slug": "and-the-award-for-best-programming-font-goes-to",
            "url": "posts/and-the-award-for-best-programming-font-goes-to.html",
            "blurb": "ProFont. It is the best programming font I have seen and I use it all the time (for most stuff - not just programming), both on Windows and Mac - even thou..."
          },
          {
            "title": "In Search For the Ultimate Cross-Platform Backup Solution",
            "slug": "in-search-for-the-ultimate-cross-platform-backup-solution",
            "url": "posts/in-search-for-the-ultimate-cross-platform-backup-solution.html",
            "blurb": "The last year I have been spending time finding the “ultimate” backup solution for Mac. I also have the requirement that it had to work equally good on Windo..."
          },
          {
            "title": "You're Smarter Than They Think",
            "slug": "youre-smarter-than-they-think",
            "url": "posts/youre-smarter-than-they-think.html",
            "blurb": "Seth Godin has written yet an amazing and inspirational piece on how to be remarkable. It is a short write-up of some of the ideas he has been talking and wr..."
          }
        ]
      },
      {
        "year": "2006",
        "items": [
          {
            "title": "Back From Serbia",
            "slug": "back-from-serbia",
            "url": "posts/back-from-serbia.html",
            "blurb": "I just got back from a small JUG roadshow in Serbia. I did two 2 1/2 hours talk in two days, the first one in Novi Sad and the second one in Belgrade. Both t..."
          },
          {
            "title": "How To Implement a Distributed CommonJ WorkManager",
            "slug": "how-to-implement-a-distributed-commonj-workmanager",
            "url": "posts/how-to-implement-a-distributed-commonj-workmanager.html",
            "blurb": "In this article I will show you how to implement a distributed version of the CommonJ WorkManager specification using Terracotta for Spring. This article is ..."
          },
          {
            "title": "The Art of Minimalistic Design",
            "slug": "the-art-of-minimalistic-design",
            "url": "posts/the-art-of-minimalistic-design.html",
            "blurb": "Minimalism: \"...where the work is stripped down to its most fundamental features and core self expression\". The world needs more minimalism. Sty..."
          },
          {
            "title": "Domain-Driven Pointcut Design",
            "slug": "domain-driven-pointcut-design",
            "url": "posts/domain-driven-pointcut-design.html",
            "blurb": "What is a pointcut language? Let's start with some terminology and definitions. A pointcut language can be seen as a Domain Specific Language (DSL) for ..."
          },
          {
            "title": "The Optimized Null Check Pattern",
            "slug": "the-optimized-null-check-pattern",
            "url": "posts/the-optimized-null-check-pattern.html",
            "blurb": "A friend of mine showed me The Optimized Null Check Pattern (TM) yesterday (found in a piece of production code): public static boolean isNull(Object obj)..."
          },
          {
            "title": "Books That Makes You Think",
            "slug": "books-that-makes-you-think",
            "url": "posts/books-that-makes-you-think.html",
            "blurb": "After my rant about the lack of computer literature that: ...makes you think and challenge the way you work. I thought that I should provide a list of book..."
          },
          {
            "title": "Welcome Noah",
            "slug": "welcome-noah",
            "url": "posts/welcome-noah.html",
            "blurb": "Saturday 17:45 PST, little Noah decided that it was time to come out and meet the family, seven weeks early, but very welcomed. He will have to stay in the i..."
          },
          {
            "title": "What Happened To Computer Literature That Makes You Think And Challenge The Way You Work?",
            "slug": "what-happened-to-computer-literature-that-makes-you-think-and-challenge-the-way-you-work",
            "url": "posts/what-happened-to-computer-literature-that-makes-you-think-and-challenge-the-way-you-work.html",
            "blurb": "I like books. I enjoy spending time in libraries and bookstores, I can spend hours just browsing around and when my wife is getting bored (usually after 10..."
          }
        ]
      },
      {
        "year": "2005",
        "items": [
          {
            "title": "Highlights 2005",
            "slug": "highlights-2005",
            "url": "posts/highlights-2005.html",
            "blurb": "2005 has been a good year, both personally and professionally. Here is a summary of some of the highlights (in chronological order): Family trip to Vie..."
          },
          {
            "title": "Think AOP Is Dead? - Time To Reconsider...",
            "slug": "think-aop-is-dead-time-to-reconsider",
            "url": "posts/think-aop-is-dead-time-to-reconsider.html",
            "blurb": "If you thought AOP was dead or at least dying, then it is time to reconsider. AOP is not dead. Not even close. After a perhaps healthy backlash, that took..."
          },
          {
            "title": "AspectJ 5 Final Is Shipped",
            "slug": "aspectj-5-final-is-shipped",
            "url": "posts/aspectj-5-final-is-shipped.html",
            "blurb": "AspectJ 5 final is finally shipped. This means that the merger with AspectWerkz is complete and that the most important chapter in the history of AOP has b..."
          },
          {
            "title": "Java Killed The Innovation Of Computer Languages",
            "slug": "java-killed-the-innovation-of-computer-languages",
            "url": "posts/java-killed-the-innovation-of-computer-languages.html",
            "blurb": "I had a very interesting discussion with Chris Richardson at the Spring Experience conference last week. Chris is an old Lisp hacker and used to write Lisp c..."
          },
          {
            "title": "Stay Out of Jar Hell with Jar Jar Links",
            "slug": "stay-out-of-jar-hell-with-jar-jar-links",
            "url": "posts/stay-out-of-jar-hell-with-jar-jar-links.html",
            "blurb": "Jar Jar Links have been part of my Java toolkit ever since we started using it in AspectWerkz a couple of years ago. It is one of these little gems that de..."
          },
          {
            "title": "Commons Logging Has To Die",
            "slug": "commons-logging-has-to-die",
            "url": "posts/commons-logging-has-to-die.html",
            "blurb": "Unfortunately, I guess it is to late to kill the beast... But I am writing this post anyway, since it keeps on causing harm and since more enlightment arou..."
          },
          {
            "title": "Learning From The Web",
            "slug": "about-time-for-database-vendors-to-learn-from-the-web",
            "url": "posts/about-time-for-database-vendors-to-learn-from-the-web.html",
            "blurb": "Adam Bosworth has written an interesting article about what we can (or have to) learn from The Web. He is talking about how it has teached us how to manag..."
          },
          {
            "title": "HotSwap Is A Dead End Road",
            "slug": "improving-hotswap-is-a-dead-end-road",
            "url": "posts/improving-hotswap-is-a-dead-end-road.html",
            "blurb": "There has been a lot of discussions about the need for more dynamicity in Java, including the need to support scripting languages. Most are around the sugg..."
          },
          {
            "title": "Introducing HyperBeans—multi-dimensional POJOs",
            "slug": "introducing-hyperbeans-e2-80-93-multi-dimensional-pojos",
            "url": "posts/introducing-hyperbeans-e2-80-93-multi-dimensional-pojos.html",
            "blurb": "Introduction This article is introducing HyperBeans, a proposal for a framework for Symmetric Aspect-Oriented Software Development in plain Java (i.e...."
          },
          {
            "title": "AOP Roadshow In Japan",
            "slug": "aop-roadshow-in-japan",
            "url": "posts/aop-roadshow-in-japan.html",
            "blurb": "Japan Tour"
          },
          {
            "title": "util.concurrent on steroids",
            "slug": "utilconcurrent-on-steroids",
            "url": "posts/utilconcurrent-on-steroids.html",
            "blurb": "Steve has written a nice article on how you can coordinate threads in a distributed application, transparently, and with very little effort."
          },
          {
            "title": "JVM support for AOP - part 2",
            "slug": "jvm-support-for-aop-part-2",
            "url": "posts/jvm-support-for-aop-part-2.html",
            "blurb": "The second part of our article series about JRockit JVM support for AOP is now published."
          },
          {
            "title": "Use Total Ordering of Objects to Avoid Deadlocks",
            "slug": "use-total-ordering-of-objects-to-avoid-deadlocks",
            "url": "posts/use-total-ordering-of-objects-to-avoid-deadlocks.html",
            "blurb": "Writing multi-threaded applications in Java can as you know be quite tricky, and if not done correctly, one can easily end up with deadlock situations. Fo..."
          },
          {
            "title": "Semantics for a Synchronized Block Join Point",
            "slug": "semantics-for-a-synchronized-block-join-point",
            "url": "posts/semantics-for-a-synchronized-block-join-point.html",
            "blurb": "As I mentioned in my previous blog entry, the synchronized block is currently not a supported join point in AspectJ 5 (or in any other AOP framework): C..."
          },
          {
            "title": "DSO: transparent clustering enabled through AOP",
            "slug": "dso-transparent-clustering-enabled-through-aop",
            "url": "posts/dso-transparent-clustering-enabled-through-aop.html",
            "blurb": "Terracotta just recently launched a product (DSO) for clustering POJOs in a completely transparent way. What I find interesting in this product is not mainl..."
          },
          {
            "title": "JVM support for AOP (technical session at JavaOne 2005)",
            "slug": "jvm-support-for-aop-technical-session-at-javaone-2005",
            "url": "posts/jvm-support-for-aop-technical-session-at-javaone-2005.html",
            "blurb": "If you're interested in knowing more about what the future holds for AOP, then you should come to the technical session TS-7659 (titled \"Runtime Aspects With..."
          },
          {
            "title": "Nordev 2005: Rickard on real world use-cases for AOP etc.",
            "slug": "nordev-2005-rickard-on-real-world-use-cases-for-aop-etc",
            "url": "posts/nordev-2005-rickard-on-real-world-use-cases-for-aop-etc.html",
            "blurb": "I just got back from the Nordic Software Developer Summit (Nordev) 2005. Strange enough, this is the first good developer conference that we have had in Swe..."
          },
          {
            "title": "Interception Done Right",
            "slug": "interception-done-right",
            "url": "posts/interception-done-right.html",
            "blurb": "One of the new features in the AspectWerkz 2 architecture is that it comes with a full-blown interception framework that allows per instance programmatic d..."
          }
        ]
      },
      {
        "year": "2004",
        "items": [
          {
            "title": "Aspect hot deployment in practice: Implementing a JMX monitoring aspect",
            "slug": "aspect-hot-deployment-in-practice-implementing-a-jmx-monitoring-aspect",
            "url": "posts/aspect-hot-deployment-in-practice-implementing-a-jmx-monitoring-aspect.html",
            "blurb": "One of the new features in the AspectWerkz 2 architecture is the ability to deploy and undeploy aspects at runtime, e.g. to do \"hot\" deployment and undeplo..."
          },
          {
            "title": "CGLIB with Native Support for AspectWerkz",
            "slug": "cglib-proxies-are-doing-aspectwerkz",
            "url": "posts/cglib-proxies-are-doing-aspectwerkz.html",
            "blurb": "The idea After implementing the AW Proxy extension to AspectWerkz I figured, why not hook into the most widely used proxy implementation out there: cglib a..."
          },
          {
            "title": "AWProxy: Proxy on steroids",
            "slug": "awproxy-proxy-on-steroids",
            "url": "posts/awproxy-proxy-on-steroids.html",
            "blurb": "Summary Proxies are an important piece in the J2EE puzzle. Since it offers a non-intrusive an more transparent way of weaving in advice/interceptors. Howe..."
          },
          {
            "title": "Spring and AspectWerkz: A Happy Marriage v2",
            "slug": "spring-and-aspectwerkz-a-happy-marriage-v2",
            "url": "posts/spring-and-aspectwerkz-a-happy-marriage-v2.html",
            "blurb": "The AspectWerkz 2 architecture has been designed to be an Extensible Aspect Container, which can deploy and run arbitrary aspects. You can read more about ..."
          },
          {
            "title": "Spring and AspectWerkz - A Happy Marriage",
            "slug": "spring-and-aspectwerkz-a-happy-marriage",
            "url": "posts/spring-and-aspectwerkz-a-happy-marriage.html",
            "blurb": "The Spring Framework is a very powerful library for J2EE development. It comes with an AOP implementation (based on proxies) that is in many cases sufficient..."
          },
          {
            "title": "Tutorial series on how to get started with AspectWerkz",
            "slug": "tutorial-series-on-how-to-get-started-with-aspectwerkz",
            "url": "posts/tutorial-series-on-how-to-get-started-with-aspectwerkz.html",
            "blurb": "Yesterday evening I put together a series of two introductory tutorials on AspectWerkz (a third is on its way). Tutorial one: Hello World. Tutorial two: H..."
          },
          {
            "title": "BEA sponsors AspectWerkz",
            "slug": "bea-sponsors-aspectwerkz",
            "url": "posts/bea-sponsors-aspectwerkz.html",
            "blurb": "The AspectWerkz project is since a a month ago sponsored by BEA Systems. Both Alexandre and I, the founders and primary contributors to AspectWerkz, are fu..."
          },
          {
            "title": "AspectWerkz NextGen",
            "slug": "aspectwerkz-nextgen",
            "url": "posts/aspectwerkz-nextgen.html",
            "blurb": "Today we released the 0.10 Release Candidate 1 of AspectWerkz. Which forms the foundation for the next generation of AspectWerkz. AspectWerkz has gone..."
          },
          {
            "title": "Presenting on dynamic AOP @ JavaOne",
            "slug": "presenting-on-dynamic-aop-javaone",
            "url": "posts/presenting-on-dynamic-aop-javaone.html",
            "blurb": "I was lucky and our submission to JavaOne was accepted. This means that Alex and I will do a presentation on \"Dynamic Aspect-Oriented Programming in J2EE e..."
          },
          {
            "title": "Doing a tutorial on AOP in enterprise applications at AOSD 2004",
            "slug": "doing-a-tutorial-on-aop-in-enterprise-applications-at-aosd-2004",
            "url": "posts/doing-a-tutorial-on-aop-in-enterprise-applications-at-aosd-2004.html",
            "blurb": "Alex and I will do a half-day tutorial on AspectWerkz at AOSD 2004. The tutorial will be an introduction to AOP/AOSD and AspectWerkz and to how it can be us..."
          }
        ]
      },
      {
        "year": "2003",
        "items": [
          {
            "title": "Role-Based Security the AOP way",
            "slug": "role-based-security-the-aop-way",
            "url": "posts/role-based-security-the-aop-way.html",
            "blurb": "Since the last example of the new 'annotation-defined aspects' model in AspectWerkz seemed to have caused a lot of confusion and made people miss the point..."
          },
          {
            "title": "Presentation on dynamic AOP in J2EE environments",
            "slug": "presentation-on-dynamic-aop-in-j2ee-environments",
            "url": "posts/presentation-on-dynamic-aop-in-j2ee-environments.html",
            "blurb": "On Wednesday (December 3d) I will give a presentation on dynamic Aspect-Oriented Programming in J2EE environments using AspectWerkz at JavaPolis/BeJUG 2003 ..."
          },
          {
            "title": "Annotation-defined Aspects",
            "slug": "self-defined-aspects-in-aspectwerkz-new-definition-model",
            "url": "posts/self-defined-aspects-in-aspectwerkz-new-definition-model.html",
            "blurb": "The upcoming release of AspectWerkz (0.9) will have support for a new definition model in which the aspects are self-defined. This means that implementatio..."
          },
          {
            "title": "AOP for EJB made easy",
            "slug": "aop-for-ejb-made-easy",
            "url": "posts/aop-for-ejb-made-easy.html",
            "blurb": "Using the new 0.8 version of AspectWerkz it is now a breeze to instrument your Servlets, EJBs or WebServices at runtime. In this example I will show how..."
          },
          {
            "title": "AspectWerkz makes AOP seamless",
            "slug": "aspectwerkz-makes-aop-seamless",
            "url": "posts/aspectwerkz-makes-aop-seamless.html",
            "blurb": "Today me and Alex released the 0.8 version of AspectWerkz."
          },
          {
            "title": "JMangler changes its license back to LGPL",
            "slug": "jmangler-changes-its-license-back-to-lgpl",
            "url": "posts/jmangler-changes-its-license-back-to-lgpl.html",
            "blurb": "JMangler will change its license back to LGPL (for some reason they changed to GPL for the 3.x release). The change to GPL did of course cause a lot of prob..."
          },
          {
            "title": "AspectWerkz ruthlessly refactored",
            "slug": "aspectwerkz-ruthlessly-refactored",
            "url": "posts/aspectwerkz-ruthlessly-refactored.html",
            "blurb": "After two weeks of Ruthless Refactoring (TM) I can now announce that AspectWerkz version 0.6.3 has been released."
          },
          {
            "title": "JBoss AOP is lacking a decent join point model",
            "slug": "jboss-aop-is-lacking-a-decent-join-point-model",
            "url": "posts/jboss-aop-is-lacking-a-decent-join-point-model.html",
            "blurb": "There has been a lot of talk about the JBoss AOP implementation (and its lack of performance) lately. When looking at it you can see (as Rickard and ma..."
          },
          {
            "title": "AspectWerkz has moved to codehaus.org",
            "slug": "aspectwerkz-has-moved-to-codehausorg",
            "url": "posts/aspectwerkz-has-moved-to-codehausorg.html",
            "blurb": "The move to codehaus.org is now completed. The new URL is aspectwerkz.codehaus.org."
          },
          {
            "title": "AspectWerkz 0.5 has been released",
            "slug": "aspectwerkz-05-has-been-released",
            "url": "posts/aspectwerkz-05-has-been-released.html",
            "blurb": "The AspectWerkz 0.5 release is a huge improvement compared to previous versions. Apart from many bug fixes it is also packed with new features. You can dow..."
          },
          {
            "title": "Cedric's AOP challenge: a solution using caller pointcuts and decoupled advices.",
            "slug": "cedrics-aop-challange-a-solution-using-caller-pointcuts-and-decoupled-advices",
            "url": "posts/cedrics-aop-challange-a-solution-using-caller-pointcuts-and-decoupled-advices.html",
            "blurb": "Last night I implemented caller pointcuts for AspectWerkz. I just had to, since they have been haunting me since I read Cedric's little AOP challenge. So..."
          },
          {
            "title": "AOP standardization process started",
            "slug": "aop-standardization-process-started",
            "url": "posts/aop-standardization-process-started.html",
            "blurb": "Renaud Pawlak, the creator of JAC has started up a project called AOPI, which has the goal of specifying a common set of components for aspect-oriented syst..."
          },
          {
            "title": "AOP in practice: Transparent persistence for POJOs",
            "slug": "aop-in-practice-transparent-persistence-for-pojos",
            "url": "posts/aop-in-practice-transparent-persistence-for-pojos.html",
            "blurb": "Using the new techniques of AOP and the AspectWerkz framework there is actually pretty easy to implement transparent persistence for Plain Old Java Objects (..."
          }
        ]
      }
    ]
  },
  "resume": {
    "title": "Resumé",
    "name": "Jonas Bonér",
    "site": "https://jonasboner.com",
    "iAm": [
      "A pragmatic who is passionate about technology, learning new things, and helping others to work better and more effectively.",
      "An entrepreneur, tech visionary, programmer, mentor, speaker, and writer.",
      "Founder, CTO, and Chairman of <a href=\"https://akka.io\">Akka</a>.",
      "Previously worked at <a href=\"https://terracotta.org\">Terracotta</a> and the <a href=\"http://www.oracle.com/technetwork/middleware/jrockit/overview/index-101826.html\">JRockit JVM</a> at BEA Systems.",
      "An active contributor to the Open Source community; most notably I created the <a href=\"https://akka.io\">Akka</a> distributed systems platform, the <a href=\"https://github.com/jboner/aspectwerkz\">AspectWerkz</a> compiler and runtime for Aspect-Oriented Programming, and have been part of the <a href=\"https://eclipse.org/aspectj\">Eclipse AspectJ</a> team.",
      "Initiator and co-author of the <a href=\"https://www.reactivemanifesto.org\">Reactive Manifesto</a>–which helped start the Reactive movement in the software industry.",
      "Author of the <a href=\"https://www.reactiveprinciples.org/\">Reactive Principles</a>–defining the foundational architectural principles for cloud native application development."
    ],
    "specialities": [
      "Technical Leadership & Strategy,",
      "Team Building & Coaching,",
      "Open Source Strategy, Business Models & Community Building",
      "Agentic AI Systems, Distributed Systems, Serverless, Microservices,",
      "Reactive Systems & Programming,",
      "Message-Driven & Event-Driven Architecture",
      "Resilience, Scalability, High-Availability,",
      "Concurrent & Functional Programming",
      "Domain-Driven Design, Object-Oriented & Aspect-Oriented Programming"
    ],
    "work": [
      {
        "head": "2024—now: Founder, CTO, and Chairman of Akka Inc. (US)"
      },
      {
        "head": "2021—2024: Founder and CEO of Akka Inc. (US)"
      },
      {
        "head": "2011—2021: Founder and CTO of Akka Inc. (US)",
        "body": "<a href=\"https://akka.io/\">Akka</a> is building an agentic AI platform—multi-region, multi-cloud, and edge—to be deployed and run serverless, BYOC, or stand-alone. The platform comprises three components."
      },
      {
        "head": "2021-2021: Chair of the Technical Oversight Committee (TOC) at the Reactive Foundation"
      },
      {
        "head": "2020—2021: Chair of the Board at the Reactive Foundation"
      },
      {
        "head": "2008—2011: Founder and CEO of Scalable Solutions AB (Sweden)",
        "body": "Acquired by Lightbend Inc. in 2011.",
        "list": [
          "The company that created Akka",
          "Provided products, support, training, and consulting for Akka"
        ]
      },
      {
        "head": "2008—2009: Co-Founder and CTO of Triental AB (Sweden)",
        "list": [
          "Developed a finance product suite targeted for private banking and wealth management using Scala and Java EE."
        ]
      },
      {
        "head": "2005—2008: Senior Software Engineer at Terracotta Inc. (US)",
        "list": [
          "Worked on <a href=\"http://www.terracotta.org/\">Terracotta</a> JVM-level clustering technology, including runtime bytecode manipulation, AOP technologies, high performant multi-threaded code, integration with various Open Source frameworks etc.",
          "Team Lead, Programmer and Technical Evangelist",
          "Open Source strategy. Community building and marketing. Strategic due diligence."
        ]
      },
      {
        "head": "2003—2005: Senior Software Engineer at BEA Systems (Sweden)",
        "list": [
          "Worked in the JRockit JVM team on research, design, architecture and development in the fields of AOP, runtime tools and JVM support for AOP, as well as performed technology evangelism (public speaking, writing articles and papers etc.)."
        ]
      },
      {
        "head": "2002—2003: System Architect at Sony NetServices (Austria)",
        "list": [
          "Worked as a system architect at Sony designing and developing system ranging from large-scale enterprise application systems to digital TV and mobile technologies."
        ]
      },
      {
        "head": "2000—2002: Consultant at Consafe Infotech (Sweden)",
        "list": [
          "Worked as a JEE consultant, implemented various enterprise application systems using state-of-the-art techniques and technologies."
        ]
      }
    ],
    "oss": [
      {
        "name": "Akka",
        "items": [
          "Creator of the <a href=\"https://akka.io\">Akka</a> project.",
          "Akka is a platform for building Agentic AI, Event-driven and Reactive systems on the JVM, with APIs in Java and Scala. It is based on the Actor Model and allows users to build multi-agent AI, high-performance, distributed, and concurrent systems that are loosely coupled, responsive, elastic, and highly resilient."
        ]
      },
      {
        "name": "AspectWerkz",
        "items": [
          "Creator of the <a href=\"https://web.archive.org/web/20150522163946/http://aspectwerkz.codehaus.org/\">AspectWerkz</a> project.",
          "AspectWerkz is a high-performant, dynamic, lightweight, and powerful Aspect-Oriented Programming (AOP) compiler and runtime for Java, which utilizes bytecode manipulation to instrument classes at build-time, class load time, or runtime (JIT)."
        ]
      },
      {
        "name": "AspectJ",
        "items": [
          "Member of the <a href=\"http://www.eclipse.org/aspectj/\">AspectJ</a> team at Eclipse.",
          "AspectJ is an AOP compiler and runtime for Java (can be used either through a language extension to Java or through plain Java).",
          "It became the defacto standard for AOP in Java after merging with AspectWerkz in 2005."
        ]
      },
      {
        "name": "Other Projects",
        "body": "Some more projects can be found on my <a href=\"https://github.com/jboner\">GitHub page</a>."
      }
    ],
    "awards": [
      {
        "head": "Among the 4 top influencers in the Java industry",
        "body": "In 2015 I was recognized as the 4th top social influencer in the Java industry."
      },
      {
        "head": "Sweden's Best Developer 2012",
        "body": "In 2012 I was voted as the Number One Developer in Sweden.<br/><a href=\"https://web.archive.org/web/20121110205652/http://computersweden.idg.se/2.2683/1.475388\">Link to article</a> (in Swedish)."
      },
      {
        "head": "Java Champion 2011",
        "body": "In 2011 I became a Java Champion.<br/><a href=\"https://javachampions.org/members.html\">Link to article</a>."
      },
      {
        "head": "Sweden's Second Best Developer 2010",
        "body": "In 2010 I was voted as the second best developer in Sweden. <a href=\"https://web.archive.org/web/20100605040513/http://www.idg.se/2.1085/1.324470/sveriges-basta-utvecklare---hela-listan\">Link to article</a> (in Swedish)."
      },
      {
        "head": "Who Is Who In Enterprise Java 2004?",
        "body": "In 2004 I was voted in as part of The Middleware Company's list of the 52 most influential leading experts in the Java enterprise community."
      }
    ],
    "speaking": "A complete list of all my public conference talks, including links to some recordings, can be found on my <a data-route=\"talks\">talks page</a>. Some slides can be found on my <a href=\"https://slideshare.net/jboner\">Slideshare page</a>.",
    "education": [
      "B.Sc. in Computer Science, Mid Sweden University, 2000.",
      "Various courses in Mathematics at the University of Stockholm, 1996."
    ],
    "references": "Available upon request. Some endorsements can be found on my <a href=\"http://www.linkedin.com/in/jonasboner\">LinkedIn page</a>."
  },
  "article": {
    "slug": "foreword-reactive-design-patterns",
    "title": "Foreword — Reactive Design Patterns",
    "date": "February 23, 2017",
    "dek": "The foreword I wrote for Roland Kuhn's excellent book on Reactive Design Patterns.",
    "body": [
      "I'm grateful that Roland has taken the time to write this foundational book, and I can't think of anyone more capable of pulling it off. Roland is an unusually clear and deep thinker; he coauthored the Reactive Manifesto, has been the technical lead for the Akka project for several years, has coauthored and taught the very popular Coursera course on Reactive programming and design, and is the best technical writer I have met.",
      "Clearly, I'm very excited about this book. It outlines what Reactive architecture/design is all about, and does an excellent job explaining it from first principles in a practical context. Additionally, it is a catalog of patterns that explains the bigger picture, how to think about system design, and how it is all connected—much like what Martin Fowler's <em>Patterns of Enterprise Application Architecture</em> did 15 years ago.",
      "During my professional life, I have seen the immense benefits of resilient, loosely coupled, message-driven systems firsthand, especially when compared with more traditional approaches that propose to hide the nature of distributed systems. In 2013, I had the idea of formalizing the experiences and lessons learned: the Reactive Manifesto was born. It started out as a set of rough notes that I remember presenting to the company at one of Typesafe's (now Lightbend) internal technical meetups. Coincidentally, this meetup was collocated with the Scala Days New York conference, where Roland, Martin Odersky, and Erik Meijer shot their bad, and unintentionally quite funny, promotion video of their Coursera course on Reactive programming. The story around the Reactive principles resonated with the other engineers and was published in July of 2013.",
      "The Reactive Manifesto defines Reactive Systems as a set of architectural design principles that are geared toward meeting the demands that systems face—today and tomorrow. These principles are most definitely not new; they can be traced back to the '70s and '80s and the seminal work by Jim Gray and Pat Helland on the Tandem System, as well as Joe Armstrong and Robert Virding on Erlang. However, these pioneers were ahead of their time, and it was not until the past five years that the technology industry was forced to rethink current best practices for enterprise system development and learned to apply the hard-won knowledge of the Reactive principles to today's world of multicore architectures, Cloud Computing, and the Internet of Things.",
      "By now, the Reactive principles have had a big impact on the industry, and as with many successful ideas, they get overloaded and reinterpreted. This is not a bad thing; ideas need to evolve to stay relevant. However, this can also cause confusion and lead to dilution of the original intent. One example is the unfortunate emerging misconception that Reactive is nothing but programming in an asynchronous and nonblocking style using callbacks or stream-oriented combinators—techniques that are aptly classified as Reactive Programming.",
      "This future classic belongs on the shelf of every professional programmer, right next to GoF and Domain-Driven Design. Enjoy the ride—I certainly did!",
      "<em>—Jonas Bonér, Founder and CTO of Lightbend, Creator of Akka</em>"
    ],
    "related": [
      {
        "title": "Foreword — Reactive Application Development",
        "slug": "foreword-reactive-application-development"
      },
      {
        "title": "Foreword — Functional and Reactive Domain Modeling",
        "slug": "foreword-functional-and-reactive-domain-modeling"
      },
      {
        "title": "Foreword — Reactive Messaging Patterns with the Actor Model",
        "slug": "foreword-reactive-messaging-patterns"
      }
    ]
  }
};
window.__INLINE_THEME__        = {
  "fonts": {
    "body": "equity",
    "display": "equity",
    "italic": "equity-italic",
    "ui": "concourse",
    "mono": "triplicate"
  },
  "colors": {
    "paper": "#f4f1ea",
    "ink": "#1a1a1a",
    "inkMute": "#5a5a5a",
    "rule": "#d4cfc4",
    "accent": "#8b3a2f"
  },
  "scale": 1,
  "sections": {
    "home": true,
    "talks": true,
    "writings": true,
    "posts": true,
    "interviews": true,
    "resume": true,
    "about": true
  }
};
window.__INLINE_FONT_CATALOG__ = {
  "equity": {
    "label": "Equity (Butterick)",
    "stack": "\"equity_text_aregular\", Georgia, serif",
    "kind": "serif",
    "google": null
  },
  "equity-italic": {
    "label": "Equity Italic",
    "stack": "\"equity_text_aitalic\", Georgia, serif",
    "kind": "italic",
    "google": null
  },
  "equity-caps": {
    "label": "Equity Caps",
    "stack": "\"equity_caps_aregular\", Georgia, serif",
    "kind": "serif",
    "google": null
  },
  "concourse": {
    "label": "Concourse (Butterick)",
    "stack": "\"concourse_c4regular\", \"Helvetica Neue\", Arial, sans-serif",
    "kind": "sans",
    "google": null
  },
  "concourse-t4": {
    "label": "Concourse T4",
    "stack": "\"concourse_t4regular\", \"Helvetica Neue\", Arial, sans-serif",
    "kind": "sans",
    "google": null
  },
  "triplicate": {
    "label": "Triplicate (Butterick mono)",
    "stack": "\"triplicate_t4cregular\", \"Menlo\", \"Courier\", monospace",
    "kind": "mono",
    "google": null
  },
  "eb-garamond": {
    "label": "EB Garamond",
    "stack": "\"EB Garamond\", Georgia, serif",
    "kind": "serif",
    "google": "EB+Garamond:ital,wght@0,400;0,500;1,400;1,500"
  },
  "source-serif": {
    "label": "Source Serif 4",
    "stack": "\"Source Serif 4\", Georgia, serif",
    "kind": "serif",
    "google": "Source+Serif+4:ital,wght@0,400;0,500;0,700;1,400;1,500"
  },
  "crimson": {
    "label": "Crimson Pro",
    "stack": "\"Crimson Pro\", Georgia, serif",
    "kind": "serif",
    "google": "Crimson+Pro:ital,wght@0,400;0,500;0,700;1,400"
  },
  "cormorant": {
    "label": "Cormorant Garamond",
    "stack": "\"Cormorant Garamond\", Georgia, serif",
    "kind": "serif",
    "google": "Cormorant+Garamond:ital,wght@0,400;0,500;0,700;1,400"
  },
  "lora": {
    "label": "Lora",
    "stack": "\"Lora\", Georgia, serif",
    "kind": "serif",
    "google": "Lora:ital,wght@0,400;0,500;0,700;1,400;1,500"
  },
  "literata": {
    "label": "Literata",
    "stack": "\"Literata\", Georgia, serif",
    "kind": "serif",
    "google": "Literata:ital,opsz,wght@0,7..72,400;0,7..72,500;1,7..72,400"
  },
  "spectral": {
    "label": "Spectral",
    "stack": "\"Spectral\", Georgia, serif",
    "kind": "serif",
    "google": "Spectral:ital,wght@0,400;0,500;0,700;1,400"
  },
  "old-standard": {
    "label": "Old Standard TT",
    "stack": "\"Old Standard TT\", Georgia, serif",
    "kind": "serif",
    "google": "Old+Standard+TT:ital,wght@0,400;0,700;1,400"
  },
  "playfair": {
    "label": "Playfair Display",
    "stack": "\"Playfair Display\", Georgia, serif",
    "kind": "serif",
    "google": "Playfair+Display:ital,wght@0,400;0,500;0,700;1,400"
  },
  "instrument": {
    "label": "Instrument Serif",
    "stack": "\"Instrument Serif\", Georgia, serif",
    "kind": "italic",
    "google": "Instrument+Serif:ital@0;1"
  },
  "inter": {
    "label": "Inter",
    "stack": "\"Inter\", system-ui, sans-serif",
    "kind": "sans",
    "google": "Inter:wght@300;400;500;600;700"
  },
  "ibm-sans": {
    "label": "IBM Plex Sans",
    "stack": "\"IBM Plex Sans\", Helvetica, Arial, sans-serif",
    "kind": "sans",
    "google": "IBM+Plex+Sans:wght@300;400;500;600;700"
  },
  "work-sans": {
    "label": "Work Sans",
    "stack": "\"Work Sans\", system-ui, sans-serif",
    "kind": "sans",
    "google": "Work+Sans:wght@300;400;500;600;700"
  },
  "spacegrotesk": {
    "label": "Space Grotesk",
    "stack": "\"Space Grotesk\", system-ui, sans-serif",
    "kind": "sans",
    "google": "Space+Grotesk:wght@300;400;500;600;700"
  },
  "ibm-mono": {
    "label": "IBM Plex Mono",
    "stack": "\"IBM Plex Mono\", \"Menlo\", monospace",
    "kind": "mono",
    "google": "IBM+Plex+Mono:wght@400;500;700"
  },
  "jetbrains": {
    "label": "JetBrains Mono",
    "stack": "\"JetBrains Mono\", \"Menlo\", monospace",
    "kind": "mono",
    "google": "JetBrains+Mono:wght@400;500;700"
  }
};
  </script>

  <script src="https://unpkg.com/react@18.3.1/umd/react.development.js" integrity="sha384-hD6/rw4ppMLGNu3tX5cjIb+uRZ7UkRJ6BPkLpg4hAu/6onKUg4lLsHAs9EBPT82L" crossorigin="anonymous"></script>
  <script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.development.js" integrity="sha384-u6aeetuaXnQ38mYT8rp6sbXaQe3NL9t+IBXmnYxwkUI2Hw4bsp2Wvmx4yRQF1uAm" crossorigin="anonymous"></script>
  <script src="https://unpkg.com/@babel/standalone@7.29.0/babel.min.js" integrity="sha384-m08KidiNqLdpJqLq95G/LEi8Qvjl/xUYll3QILypMoQ65QorJ9Lvtp2RXYGBFj1y" crossorigin="anonymous"></script>

  <script type="text/babel" data-presets="env,react">
/* global React */
/* Theme + content loader. Exposes window.useContent + window.useTheme. */

const STORAGE_KEY = "jonasboner-tweaks-v1";

window.DEFAULT_THEME = {
  fonts: { body: "equity", display: "equity", italic: "equity-italic", ui: "concourse", mono: "triplicate" },
  colors: { paper: "#f6f1e7", ink: "#221c16", inkMute: "#8b7f72", rule: "#d7cdbb", accent: "#9b3a2f" },
  scale: 1.0,
  sections: { home: true, talks: true, writings: true, posts: true, interviews: true, resume: true, about: true },
  portrait: null,             // base64 data URL when user uploads one; null = use content.json default
  inlineEdits: {}             // { headline: "...", tagline: "..." }
};

/* ---- async loaders ---- */
async function loadJSON(path, fallback) {
  try {
    const r = await fetch(path, { cache: "no-store" });
    if (!r.ok) throw new Error(r.status);
    return await r.json();
  } catch (e) {
    console.warn("Could not load " + path + ":", e.message);
    return fallback;
  }
}

window.loadContent = async () => {
  if (window.__INLINE_CONTENT__) return window.__INLINE_CONTENT__;
  return loadJSON("content.json", null);
};
window.loadFontCatalog = async () => {
  if (window.__INLINE_FONT_CATALOG__) return window.__INLINE_FONT_CATALOG__;
  return loadJSON("fonts-catalog.json", {});
};
window.loadStoredTheme = async () => {
  // 1. Try localStorage tweaks
  try {
    const stored = localStorage.getItem(STORAGE_KEY);
    if (stored) return { ...window.DEFAULT_THEME, ...JSON.parse(stored) };
  } catch {}
  // 2. Try inline-embedded theme (single-file export)
  if (window.__INLINE_THEME__) return { ...window.DEFAULT_THEME, ...window.__INLINE_THEME__ };
  // 3. Try theme.json shipped with the site
  const fileTheme = await loadJSON("theme.json", null);
  if (fileTheme) return { ...window.DEFAULT_THEME, ...fileTheme };
  return window.DEFAULT_THEME;
};

window.persistTheme = (theme) => {
  try { localStorage.setItem(STORAGE_KEY, JSON.stringify(theme)); } catch {}
};

/* ---- apply theme to CSS variables ---- */
window.applyTheme = (theme, fontCatalog) => {
  const root = document.documentElement.style;

  // Colors
  root.setProperty("--paper", theme.colors.paper);
  root.setProperty("--paper-2", theme.colors.paper);
  root.setProperty("--ink", theme.colors.ink);
  root.setProperty("--ink-2", theme.colors.ink);
  root.setProperty("--ink-mute", theme.colors.inkMute);
  root.setProperty("--rule", theme.colors.rule);
  root.setProperty("--accent", theme.colors.accent);

  // Fonts: look up stack from catalog
  const stack = (id, fallback) => (fontCatalog && fontCatalog[id] && fontCatalog[id].stack) || fallback;
  root.setProperty("--font-body",   stack(theme.fonts.body,   '"equity_text_aregular", Georgia, serif'));
  root.setProperty("--font-italic", stack(theme.fonts.italic, '"equity_text_aitalic", Georgia, serif'));
  root.setProperty("--font-ui",     stack(theme.fonts.ui,     '"concourse_c4regular", "Helvetica Neue", sans-serif'));
  root.setProperty("--font-mono",   stack(theme.fonts.mono,   '"triplicate_t4cregular", monospace'));

  // Scale
  root.setProperty("--scale", String(theme.scale));

  // Google Fonts: load any selected fonts that need it
  if (fontCatalog) {
    const needed = new Set();
    ["body", "italic", "ui", "mono", "display"].forEach(slot => {
      const id = theme.fonts[slot];
      const entry = fontCatalog[id];
      if (entry && entry.google) needed.add(entry.google);
    });
    if (needed.size > 0) {
      const url = "https://fonts.googleapis.com/css2?" + [...needed].map(s => "family=" + s).join("&") + "&display=swap";
      const link = document.getElementById("google-fonts");
      if (link && link.href !== url) link.href = url;
    }
  }
};

/* ---- React hook: theme state ---- */
window.useTheme = function useTheme() {
  const [theme, setTheme] = React.useState(window.DEFAULT_THEME);
  const [catalog, setCatalog] = React.useState(null);
  const [ready, setReady] = React.useState(false);

  React.useEffect(() => {
    (async () => {
      const [t, c] = await Promise.all([window.loadStoredTheme(), window.loadFontCatalog()]);
      setCatalog(c);
      setTheme(t);
      window.applyTheme(t, c);
      setReady(true);
    })();
  }, []);

  const update = React.useCallback((patch) => {
    setTheme(prev => {
      const next = typeof patch === "function" ? patch(prev) : { ...prev, ...patch };
      window.applyTheme(next, catalog);
      window.persistTheme(next);
      return next;
    });
  }, [catalog]);

  const reset = React.useCallback(() => {
    try { localStorage.removeItem(STORAGE_KEY); } catch {}
    const def = window.DEFAULT_THEME;
    window.applyTheme(def, catalog);
    setTheme(def);
  }, [catalog]);

  return { theme, setTheme: update, reset, catalog, ready };
};

/* ---- React hook: content state ---- */
window.useContent = function useContent() {
  const [content, setContent] = React.useState(null);
  const [error, setError] = React.useState(null);

  React.useEffect(() => {
    (async () => {
      const c = await window.loadContent();
      if (!c) {
        setError("Could not load content.json. If you opened this from a local file, you'll need a local server (e.g. `python3 -m http.server`).");
        return;
      }
      setContent(c);
    })();
  }, []);

  return { content, error };
};
  </script>
  <script type="text/babel" data-presets="env,react">
/* global React */
/* All page components. They take { D, go } where D is the loaded content. */

const { useState, useEffect, useMemo, useRef } = React;

function Rich({ html, go }) {
  const ref = useRef(null);
  useEffect(() => {
    if (!ref.current) return;
    ref.current.querySelectorAll("a[data-route]").forEach(a => {
      a.onclick = (e) => { e.preventDefault(); go(a.getAttribute("data-route")); };
    });
  }, [html]);
  return <span ref={ref} dangerouslySetInnerHTML={{ __html: html }} />;
}

window.Rich = Rich;

/* ---- HOME (V2 Index) ---- */
window.Home = function Home({ D, go, theme, photoSrc }) {
  const inline = (theme && theme.inlineEdits) || {};
  const headline = inline.headline ?? (D.bio.name + ".");
  const tagline  = inline.tagline  ?? "Entrepreneur, hacker, perpetual learner.";

  const rows = [
    { n: "01", lbl: "Role",        txt: `Founder, CTO &amp; Chairman of <a href="https://akka.io" target="_blank" rel="noreferrer">Akka</a>.`, yr: "Present" },
    { n: "02", lbl: "Building",    txt: `An <a href="https://akka.io" target="_blank" rel="noreferrer">agentic AI platform</a> for multi-agent apps and microservices — multi-region, multi-cloud, edge.`, yr: "2024 —" },
    { n: "03", lbl: "Open source", txt: `Created <a href="https://akka.io" target="_blank" rel="noreferrer">Akka</a>, the actor-based distributed systems platform; and <a href="https://github.com/jboner/aspectwerkz" target="_blank" rel="noreferrer">AspectWerkz</a> before it.`, yr: "2002 —" },
    { n: "04", lbl: "Authored",    txt: `The <a href="https://www.reactivemanifesto.org" target="_blank" rel="noreferrer">Reactive Manifesto</a> and the <a href="https://reactiveprinciples.org" target="_blank" rel="noreferrer">Reactive Principles</a>.`, yr: "2013 / 2020" },
    { n: "05", lbl: "Honored",     txt: `<a href="https://javachampions.org/members.html" target="_blank" rel="noreferrer">Java Champion</a>; voted Sweden's top developer.`, yr: "2011 / 2012" },
    { n: "06", lbl: "Speaking",    txt: `<a data-route="talks">Speaker</a> at O'Reilly, JavaOne, Kubecon, QCon, GOTO, Strange Loop, Devoxx, JavaZone, Jfokus, and beyond.`, yr: "Ongoing" },
    { n: "07", lbl: "Writing",     txt: `<a data-route="writings">Books, articles, white papers</a> on distributed systems, agentic systems, and reactive architecture.`, yr: "2003 —" },
    { n: "08", lbl: "Off-hours",   txt: `Family, meditation, neigong, coding, travel, powder skiing, improvising and listening to music, reading.`, yr: "Always" },
  ];
  return (
    <>
      <div className="title-row">
        <div>
          <h1 className="display">{headline}</h1>
          <div className="sub">{tagline}</div>
        </div>
        <img className="portrait" src={photoSrc} alt={D.bio.name}/>
      </div>
      <ol className="index-list">
        {rows.map(r => (
          <li key={r.n}>
            <span className="num">{r.n}</span>
            <span className="lbl">{r.lbl}</span>
            <span className="txt"><Rich html={r.txt} go={go}/></span>
            <span className="yr">{r.yr}</span>
          </li>
        ))}
      </ol>
      {Array.isArray(D.bio.social) && D.bio.social.length > 0 && (
        <div className="contact-row">
          <span className="contact-label">Elsewhere</span>
          <ul className="contact-list">
            {D.bio.social.map((s, i) => (
              <li key={i}>
                <a href={s.href} target="_blank" rel="noopener">
                  <span className="contact-name">{s.name}</span>
                  <span className="contact-handle">{s.handle}</span>
                </a>
              </li>
            ))}
          </ul>
        </div>
      )}
    </>
  );
};

/* ---- About ---- */
window.About = function About({ D, go }) {
  return (
    <section>
      <header className="page-head">
        <p className="eyebrow">About</p>
        <h1 className="page-title">{D.about.title}</h1>
      </header>
      <div className="about-body"><Rich html={D.about.body} go={go}/></div>
    </section>
  );
};

/* ---- Writings ---- */
window.Writings = function Writings({ D, go }) {
  const w = D.writings;
  const Section = ({ title, items, count }) => (
    <>
      <div className="section-head"><span>{title}</span><span>{count || items.length}</span></div>
      <ul className="writing-list">
        {items.map((b, i) => (
          <li key={i}>
            <span className="source">{b.src || "Book"}</span>
            <span className="title"><a href={b.url || "#"} target="_blank" rel="noopener">{b.title}</a></span>
          </li>
        ))}
      </ul>
    </>
  );
  return (
    <section>
      <header className="page-head">
        <p className="eyebrow">Library</p>
        <h1 className="page-title">{w.title}</h1>
        <p className="lede">{w.lede}</p>
      </header>
      <Section title="Books" items={w.books}/>
      <Section title="White Papers" items={w.whitePapers}/>
      <Section title="Articles" items={w.articles} count={w.articles.length + " pieces"}/>
      <Section title="Forewords" items={w.forewords}/>
    </section>
  );
};

/* ---- Talks ---- */
window.Talks = function Talks({ D, go }) {
  return (
    <section>
      <header className="page-head">
        <p className="eyebrow">Stage</p>
        <h1 className="page-title">{D.talks.title}</h1>
        <p className="lede" dangerouslySetInnerHTML={{__html: D.talks.lede}}/>
      </header>

      {D.talks.byYear.map(({ year, items }) => (
        <div className="year-block" key={year}>
          <div className="year-num">{year}</div>
          <ul className="year-items">
            {items.map((t, i) => (
              <li key={i}>
                <div className="row-item">
                  <span className="src">{t.venue}</span>
                  <span className="ttl"><a href={t.url || ("https://www.youtube.com/results?search_query=" + encodeURIComponent("Jonas Boner " + t.title))} target="_blank" rel="noopener">{t.title}</a></span>
                </div>
              </li>
            ))}
          </ul>
        </div>
      ))}

      {D.talks.complete && (
        <>
          <div className="section-head" style={{marginTop:"56px"}}>
            <span>Complete list of conference talks</span>
            <span>{D.talks.complete.length} talks</span>
          </div>
          <ol className="complete-list">
            {D.talks.complete.map((t, i) => (
              <li key={i}>
                <div>
                  <div className="cl-venue">{t.venue} <span className="cl-date">({t.date})</span></div>
                  <div className="cl-title">{t.title}</div>
                </div>
              </li>
            ))}
          </ol>
        </>
      )}
    </section>
  );
};

/* ---- Interviews ---- */
window.Interviews = function Interviews({ D, go }) {
  const byYear = useMemo(() => {
    const groups = {};
    D.interviews.items.forEach(it => { (groups[it.year] = groups[it.year] || []).push(it); });
    return Object.keys(groups).sort((a,b)=>b.localeCompare(a)).map(y => ({ year: y, items: groups[y] }));
  }, [D]);

  return (
    <section>
      <header className="page-head">
        <p className="eyebrow">Conversations</p>
        <h1 className="page-title">{D.interviews.title}</h1>
        <p className="lede">{D.interviews.lede}</p>
      </header>
      {byYear.map(({ year, items }) => (
        <div className="year-block" key={year}>
          <div className="year-num">{year}</div>
          <ul className="year-items">
            {items.map((t, i) => (
              <li key={i}>
                <div className="row-item">
                  <span className="src">{t.src}</span>
                  <span className="ttl"><a href={t.url || "#"} target="_blank" rel="noopener">{t.title}</a></span>
                </div>
              </li>
            ))}
          </ul>
        </div>
      ))}
    </section>
  );
};

/* ---- Posts ---- */
window.Posts = function Posts({ D, go }) {
  const [query, setQuery] = useState("");
  const filtered = useMemo(() => {
    if (!query.trim()) return D.posts.byYear;
    const q = query.toLowerCase();
    return D.posts.byYear.map(y => ({
      year: y.year,
      items: y.items.filter(it => (it.title + " " + (it.blurb||"")).toLowerCase().includes(q))
    })).filter(y => y.items.length);
  }, [query, D]);

  const total = D.posts.byYear.reduce((a, y) => a + y.items.length, 0);

  return (
    <section>
      <header className="page-head">
        <p className="eyebrow">Archive</p>
        <h1 className="page-title">{D.posts.title}</h1>
        <p className="lede">{total} posts — indexed by year.</p>
      </header>

      <input
        className="search" type="search" placeholder="Search posts…"
        value={query} onChange={(e)=>setQuery(e.target.value)}
      />

      {filtered.length === 0 && <p className="lede">Nothing filed under that heading.</p>}

      {filtered.map(({ year, items }) => (
        <div className="year-block" key={year}>
          <div className="year-num">{year}</div>
          <ul className="year-items">
            {items.map((p, i) => (
              <li key={i}>
                <div className="post-item">
                  <div className="title">
                    <a href={`posts/${p.slug}.html`}>{p.title}</a>
                  </div>
                  {p.blurb && <p className="blurb">{p.blurb}</p>}
                </div>
              </li>
            ))}
          </ul>
        </div>
      ))}
    </section>
  );
};

/* ---- Resume ---- */
window.Resume = function Resume({ D, go }) {
  const r = D.resume;
  return (
    <section className="resume">
      <header className="page-head">
        <p className="eyebrow">Curriculum Vitæ</p>
        <h1 className="page-title">{r.title}</h1>
      </header>

      <h2 className="r-name">{r.name}</h2>
      <p className="r-site"><a href={r.site}>{r.site}</a></p>

      <h3 className="r-h">I am</h3>
      <ul className="r-list">
        {r.iAm.map((it, i) => <li key={i} dangerouslySetInnerHTML={{__html: it}}/>)}
      </ul>

      <h3 className="r-h">Specialities</h3>
      <ul className="r-list">
        {r.specialities.map((it, i) => <li key={i}>{it}</li>)}
      </ul>

      <h3 className="r-h">Work Experience</h3>
      {r.work.map((w, i) => (
        <div className="r-job" key={i}>
          <h4 className="r-job-head">{w.head}</h4>
          {w.body && <p dangerouslySetInnerHTML={{__html: w.body}}/>}
          {w.list && (
            <ul className="r-list">
              {w.list.map((l, j) => <li key={j} dangerouslySetInnerHTML={{__html: l}}/>)}
            </ul>
          )}
        </div>
      ))}

      <h3 className="r-h">Selected Open Source Projects</h3>
      {r.oss.map((p, i) => (
        <div className="r-job" key={i}>
          <h4 className="r-job-head">{p.name}</h4>
          {p.body && <p dangerouslySetInnerHTML={{__html: p.body}}/>}
          {p.items && (
            <ul className="r-list">
              {p.items.map((l, j) => <li key={j} dangerouslySetInnerHTML={{__html: l}}/>)}
            </ul>
          )}
        </div>
      ))}

      <h3 className="r-h">Awards</h3>
      {r.awards.map((a, i) => (
        <div className="r-job" key={i}>
          <h4 className="r-job-head">{a.head}</h4>
          <p dangerouslySetInnerHTML={{__html: a.body}}/>
        </div>
      ))}

      <h3 className="r-h">Public Speaking</h3>
      <p style={{fontSize:"17px", lineHeight:1.6, color:"var(--ink-2)"}}><Rich html={r.speaking} go={go}/></p>

      <h3 className="r-h">Formal Education</h3>
      <ul className="r-list">
        {r.education.map((e, i) => <li key={i}>{e}</li>)}
      </ul>

      <h3 className="r-h">References</h3>
      <p style={{fontSize:"17px", lineHeight:1.6, color:"var(--ink-2)"}} dangerouslySetInnerHTML={{__html: r.references}}/>
    </section>
  );
};
  </script>
  <script type="text/babel" data-presets="env,react">
/* global React, ReactDOM */
const { useState, useEffect } = React;

function useRoute() {
  const [route, setRoute] = useState(() => {
    const h = window.location.hash.replace(/^#\/?/, "");
    return h || "home";
  });
  useEffect(() => {
    const on = () => {
      const h = window.location.hash.replace(/^#\/?/, "");
      setRoute(h || "home");
      window.scrollTo({ top: 0, behavior: "instant" });
    };
    window.addEventListener("hashchange", on);
    return () => window.removeEventListener("hashchange", on);
  }, []);
  const go = (r) => { window.location.hash = "#/" + r; };
  return [route, go];
}

const ALL_NAV = [
  ["talks",      "Talks"],
  ["interviews", "Interviews"],
  ["writings",   "Writings"],
  ["posts",      "Posts"],
  ["resume",     "Resumé"],
  ["about",      "About"],
];

function TopNav({ route, go, sections, name }) {
  const items = ALL_NAV.filter(([id]) => sections[id] !== false);
  return (
    <div className="topnav">
      <div className="brand">
        <a href="#/home" onClick={(e)=>{e.preventDefault(); go("home");}}>{name}</a>
      </div>
      <nav>
        {items.map(([id, label]) => (
          <a key={id} href={"#/"+id}
             className={route === id ? "active" : ""}
             onClick={(e)=>{e.preventDefault(); go(id);}}>{label}</a>
        ))}
      </nav>
    </div>
  );
}

function Footer({ name }) {
  const year = new Date().getFullYear();
  return <footer className="foot">© 2003–{year} {name}</footer>;
}

function LoadingSplash() {
  return (
    <div className="frame">
      <div style={{ padding: "120px 0", textAlign: "center", color: "var(--ink-mute)", fontFamily: "var(--font-ui)", letterSpacing: "0.18em", textTransform: "uppercase", fontSize: 11 }}>
        Loading…
      </div>
    </div>
  );
}

function ErrorScreen({ message }) {
  return (
    <div className="frame">
      <div style={{ padding: "60px 0", maxWidth: 600, margin: "0 auto", fontFamily: "var(--font-body)" }}>
        <h1 style={{ fontSize: 32, marginBottom: 16, fontWeight: 400 }}>Couldn't load content</h1>
        <p style={{ color: "var(--ink-mute)", lineHeight: 1.6, fontSize: 17 }}>{message}</p>
        <p style={{ color: "var(--ink-mute)", lineHeight: 1.6, fontSize: 14, marginTop: 24, fontFamily: "var(--font-mono)" }}>
          Try: <code>cd jonas-site && python3 -m http.server 8000</code>
        </p>
      </div>
    </div>
  );
}

function App() {
  const [route, go] = useRoute();
  const { theme, setTheme, reset, catalog, ready } = window.useTheme();
  const { content, error } = window.useContent();

  if (error) return <ErrorScreen message={error}/>;
  if (!ready || !content) return <LoadingSplash/>;

  // Redirect away from disabled sections
  if (route !== "home" && theme.sections[route] === false) {
    setTimeout(() => go("home"), 0);
  }

  const photoSrc = theme.portrait || content.bio.photo;

  const Page = {
    home: window.Home, about: window.About, writings: window.Writings,
    talks: window.Talks, posts: window.Posts,
    interviews: window.Interviews, resume: window.Resume,
  }[route] || window.Home;

  return (
    <>
      <div className="frame">
        <TopNav route={route} go={go} sections={theme.sections} name={content.bio.name}/>
        <Page D={content} go={go} theme={theme} photoSrc={photoSrc}/>
        <Footer name={content.bio.name}/>
      </div>
      {!window.__TWEAKS_DISABLED__ && (
        <window.TweaksPanel
          theme={theme} setTheme={setTheme} reset={reset}
          catalog={catalog} content={content}
        />
      )}
    </>
  );
}

ReactDOM.createRoot(document.getElementById("root")).render(<App/>);
  </script>
</body>
</html>
