[{"data":1,"prerenderedAt":339},["ShallowReactive",2],{"nav-categories":3,"post-\u002Fblog\u002Fkotlinconf-2026-day-1":8,"all-posts-nav":270,"all-tags":295},{"pinned":4,"overflow":7},[5,6],"Technology","Security",[],{"id":9,"title":10,"body":11,"category":5,"date":251,"description":252,"extension":253,"highlighted":254,"image":255,"imageCredit":256,"imageCreditUrl":256,"meta":257,"navigation":258,"path":259,"public":258,"publish":256,"seo":260,"stem":261,"tags":262,"__hash__":269},"posts\u002Fblog\u002Fkotlinconf-2026-day-1.md","KotlinConf 2026 — Day 1 Impressions",{"type":12,"value":13,"toc":240},"minimark",[14,18,21,26,32,35,38,41,45,50,53,56,59,62,66,71,74,77,84,92,95,99,104,115,118,122,127,130,133,143,150,153,156,159,166,169,173,178,181,184,187,191,196,199,202,223,226,229,232],[15,16,17],"p",{},"KotlinConf 2026 opened today at the ICM, Internationales Congress Center Messe\nMünchen. Day one ran the full range, from low-level coroutine internals to the\nshape of where the language is going. From Compose rendering optimisations you\ncan apply next week to a look inside how Google rebuilt the search backend on\nKotlin coroutines.",[15,19,20],{},"Here are the highlights of the talks I managed to catch.",[22,23,25],"h2",{"id":24},"run-kotlin-run","Run, Kotlin, Run",[15,27,28],{},[29,30,31],"em",{},"Marc Reichelt",[15,33,34],{},"A lightning talk... that did exactly what it says on the tin. Move fast, cover\nground, and leave you slightly energised.",[15,36,37],{},"Marc ran through the full spectrum of places Kotlin can execute today. JVM,\nnative, JavaScript, WebAssembly.",[15,39,40],{},"The WASM story in particular is a worthy mention from this session. Kotlin\u002FWasm\nhas matured considerably and the pitch of \"one language, every runtime\" is\ngetting harder to dismiss as fluffy aspiration. I recall WASM based talks during\nKotlinConf 2025, and this particular talk made it feel less like a roadmap item\nand more like the present tense.",[22,42,44],{"id":43},"opinionated-ktor-services","Opinionated Ktor Services",[15,46,47],{},[29,48,49],{},"Simon Vergauwen",[15,51,52],{},"In my naive opinion, Ktor's unopinionated nature is both its appeal and its\ntrap. The framework gives you the pieces but does not tell you how to assemble\nthem. Simon's talk was a useful corrective, a practitioner's view of where the\ndecisions actually land when you build real services with it.",[15,54,55],{},"A lot covered here, and early morning caffeine was started to wear off, so I was\ngrateful that the talk was engaging ☕",[15,57,58],{},"Dependency injection approaches, code organisation, third-party SDK integration,\ntesting strategy, and automatic API documentation generation. None of it is\nrocket science, but having someone work through the trade-offs out loud is its\nown bucket of usefulness.",[15,60,61],{},"Ktor projects tend to develop opinions anyway. Better to develop them\ndeliberately.",[22,63,65],{"id":64},"breaking-frozen-frames-phased-rendering-for-compose","Breaking Frozen Frames: Phased Rendering for Compose",[15,67,68],{},[29,69,70],{},"Sinan Kozak",[15,72,73],{},"This was one of the more immediately applicable talks of the day. The problem is\nfamiliar to anyone who has built feature-rich Compose screens. The entire\ncomposition renders in a single pass, which means users stare at a blank screen\nuntil everything is ready. On complex screens, that can mean 1,000 to 2,000ms of\nnothingness before anything meaningful appears.",[15,75,76],{},"Sinan's solution, Phased Compose, splits the composition into deterministic\nsteps, each rendering its own phase progressively. Skeleton loaders appear\nimmediately, then sections fill in as they complete.",[15,78,79,80,83],{},"The result is not just faster in the raw numbers (25% reduction in frozen\nframes, 2.5% reduction in time-to-interactive from home screen) but ",[29,81,82],{},"feels","\nfaster. A skeleton loader communicates that something is happening, which\nchanges the user's experience and perception of the wait even when the absolute\ntime is similar.",[15,85,86,87,91],{},"Worth noting is that ",[88,89,90],"code",{},"PausableComposition"," and lazy layouts do not solve\nfirst-frame jank for non-scrolling UI. Phased Compose fills that gap in a\ngeneral, predictable way without timers or workarounds.",[15,93,94],{},"I'm the opposite of a subject-matter expert for mobile development, but user\nexperience (good or bad) is a constant parallel in any rendering medium.",[22,96,98],{"id":97},"bringing-native-ios-feel-with-compose-multiplatform","Bringing Native iOS Feel With Compose Multiplatform",[15,100,101],{},[29,102,103],{},"Mohamed Ben Rejeb",[15,105,106,107,114],{},"A quick demonstration of ",[108,109,113],"a",{"href":110,"rel":111},"https:\u002F\u002Fgithub.com\u002FMohamedRejeb\u002FCalf",[112],"nofollow","Calf",", Compose\nAdaptive Look & Feel, an open-source library that maps Compose components to\ntheir native platform equivalents. Material on Android, Cupertino on iOS, from a\nsingle codebase.",[15,116,117],{},"The demo was a Reminders-style app built on Kotlin Multiplatform Compose that\ngenuinely looked at home on iOS, which is harder to pull off than it sounds. If\nyou are an Android developer curious about KMP but worried about the UI gap,\nthis is worth a look.",[22,119,121],{"id":120},"how-google-search-runs-on-kotlin-coroutines","How Google Search Runs on Kotlin Coroutines",[15,123,124],{},[29,125,126],{},"Sam Berlin & Alessio Della Motta, Google Search Infrastructure",[15,128,129],{},"This was the talk of the day for me, and it earned that.",[15,131,132],{},"Google Search routes every query through server-side Kotlin. That sentence\ndeserves a moment. The move was driven by the demands of AI-native generative\nresults, where the answer is not fully known upfront and streaming becomes a\nfirst-class concern rather than an afterthought. The old model of \"compute\neverything, then return\" does not survive contact with generative AI at search\nscale.",[15,134,135,136,139,140,142],{},"The team built on top of the JVM rather than replacing it, introducing an\ninternal interface description language called ",[29,137,138],{},"QFlow"," that connects\nasynchronous data definitions. Developers implement business logic in Kotlin and\n",[29,141,138],{}," handles the graph of dependencies and the streaming of results. The\nchoice of Kotlin was deliberate. Suspend functions and coroutines with pluggable\ndispatching, the Flow API for streams, and code that people actually find\nenjoyable to write. That last one matters more than it gets credit for.",[15,144,145],{},[146,147],"img",{"alt":148,"src":149},"KotlinConf 2026 Google Search talk","\u002Fimages\u002Fblog\u002F2026\u002Fgoogle-kotlinconf-2026-talk.png",[15,151,152],{},"Interesting war stories from the presenters. Debuggability with coroutines is\ngenuinely hard, that I know from direct experience. Stack traces are unhelpful,\ncancellation handling has sharp edges, and orphaned coroutines are easy to\ncreate and hard to find.",[15,154,155],{},"The team built enhanced tooling around QFlow stacks to surface these. The honest\nacknowledgement that coroutines at scale require real investment to debug well\nwas refreshing to hear from people operating at this size.",[15,157,158],{},"My conceptual understanding here was that the team effectively built a\nmeta-language on top of Kotlin, which is hyper-optimised for coroutines\nspecifically and had some syntactical sugar that is closer to C++ language\nfeatures.",[15,160,161,162,165],{},"The warm and cold flow distinction in QFlow was also worth noting. Cold flows\nre-execute their sources, which has meaningful implications at\n",[88,163,164],{},"google.com\u002Fsearch"," scale, and the team has had to think carefully about where\neach pattern belongs.",[15,167,168],{},"Always refreshing to see an industry giant demonstrate novel problem-solving to\nlong-standing problems.",[22,170,172],{"id":171},"why-ai-agents-never-scale","Why AI Agents Never Scale",[15,174,175],{},[29,176,177],{},"JetBrains (Koog team)",[15,179,180],{},"A birthday and a warning in the same talk. Koog, JetBrains' Kotlin-native AI\nagent framework, turned one year old, and the team used the occasion to announce\nintegrations with Spring Boot, Spring AI, and AWS AgentCore, as well as\non-device Google model support for Android.",[15,182,183],{},"The \"why agents never scale\" framing was the more interesting thread. The\nargument is that naive prompting produces agents that are impressive in demos\nand fragile in production. The proposed corrective is LLM domain modelling,\ngiving agents structured awareness of what tools they have, when to use them,\nand where their authority ends. The example walked through a customer support\nflow. In the diagnostic phase, the agent had access to conversation and read\ntools only. In the resolution phase it gained write access. The guardrails are\nstructural rather than prompt-level, which is the right instinct.",[15,185,186],{},"The broader point is one of the industry is still working out. Scaling agents is\nnot primarily a model capability problem, it is an architecture problem. Koog is\nbetting that Kotlin's type system and the discipline of explicit tool\ndefinitions is part of the answer.",[22,188,190],{"id":189},"the-lord-of-collection-functions","The Lord of Collection Functions",[15,192,193],{},[29,194,195],{},"Ben Kadel",[15,197,198],{},"Ben framed a walkthrough of Kotlin collection functions as a Lord of the Rings\nepic, complete with Center-earth under threat from the imperative evil of the\nDark Lord For-ron, and a fellowship of developers tasked with restoring\nfunctional purity to the realm.",[15,200,201],{},"Indeed.",[15,203,204,205,208,209,212,213,212,216,212,219,222],{},"As absurd as it may sound (deliberately so, I assume), underneath the theatre\nwas a genuinely useful survey of what Kotlin's collection API can do. ",[88,206,207],{},"Map",",\n",[88,210,211],{},"filter",", ",[88,214,215],{},"fold",[88,217,218],{},"groupBy",[88,220,221],{},"partition",", the full cast of characters, each\nintroduced at the moment the fellowship needed them to defeat whatever\nalgorithmic oppression stood in their path. Walking to Mordor via a series of\nwell-chosen collection transforms is, it turns out, a surprisingly effective\nteaching device.",[15,224,225],{},"Props to Ben for commitment to the bit. All without letting it get in the way of\nthe substance.",[15,227,228],{},"Suffice to say, Kotlin based performance theatre is harder to pull off than it\nlooks.",[230,231],"hr",{},[15,233,234,235,239],{},"That was day 1. As for night 1? When in ",[236,237,238],"del",{},"Rome"," Munich! 🍻",{"title":241,"searchDepth":242,"depth":242,"links":243},"",2,[244,245,246,247,248,249,250],{"id":24,"depth":242,"text":25},{"id":43,"depth":242,"text":44},{"id":64,"depth":242,"text":65},{"id":97,"depth":242,"text":98},{"id":120,"depth":242,"text":121},{"id":171,"depth":242,"text":172},{"id":189,"depth":242,"text":190},"2026-05-21","Notes and reflections from the first day of KotlinConf 2026 in Munich. Coroutines at Google scale, Compose rendering tricks, and a birthday for Koog.","md",false,"\u002Fimages\u002Fblog\u002F2026\u002Fgoogle-kotlinconf-2026-koog.png",null,{},true,"\u002Fblog\u002Fkotlinconf-2026-day-1",{"title":10,"description":252},"blog\u002Fkotlinconf-2026-day-1",[263,264,265,266,267,268],"kotlin","conference","android","compose","coroutines","ai","ZLRTxDinoid4JWbCFFjkFJkUIeAqOksx7no7dbXqoOo",[271,272,276,280,284,288,291],{"path":259,"title":10,"date":251},{"path":273,"title":274,"date":275},"\u002Fblog\u002Fsecurity\u002Fself-hosted-container-registry-mtls","Self-hosting a private container registry with NGINX and mTLS","2026-05-19",{"path":277,"title":278,"date":279},"\u002Fblog\u002Fan-antidote-to-speed","An Antidote To Speed","2026-05-14",{"path":281,"title":282,"date":283},"\u002Fblog\u002Frsa-jwt-nodejs","Sign and verify JWT with RSA encryption with NodeJS","2023\u002F06\u002F05",{"path":285,"title":286,"date":287},"\u002Fblog\u002Fgenerating-tls-certificates-openssl","Generating TLS certificates for server HTTPS","2023\u002F05\u002F05",{"path":289,"title":290,"date":287},"\u002Fblog\u002Ftwo-years-with-nuxt","Framework Paralysis to NuxtJS",{"path":292,"title":293,"date":294},"\u002Fblog\u002Fan-ode-to-strange-javascript","An Ode To Strange JavaScript","2023-02-01",[296,297,299,301,304,306,308,310,312,313,314,315,316,317,319,321,323,325,327,329,331,333,335,337],{"name":268,"count":242},{"name":298,"count":242},"pki",{"name":300,"count":242},"security",{"name":302,"count":303},"productivity",1,{"name":305,"count":303},"learning",{"name":307,"count":303},"reflection",{"name":309,"count":303},"javascript",{"name":311,"count":303},"tls",{"name":263,"count":303},{"name":264,"count":303},{"name":265,"count":303},{"name":266,"count":303},{"name":267,"count":303},{"name":318,"count":303},"rsa",{"name":320,"count":303},"technology",{"name":322,"count":303},"jwt",{"name":324,"count":303},"encryption",{"name":326,"count":303},"docker",{"name":328,"count":303},"nginx",{"name":330,"count":303},"mtls",{"name":332,"count":303},"nuxtjs",{"name":334,"count":303},"frontend",{"name":336,"count":303},"ui",{"name":338,"count":303},"client",1779462179640]