<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>An Engineer&apos;s musings</title><description>Notes on building software, and the occasional tangent.</description><link>https://engineers-musings.dev/</link><item><title>Guice: Dependency Injection You Can Actually Read</title><link>https://engineers-musings.dev/blog/guice/part-1/01-why-guice/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-1/01-why-guice/</guid><description>An introduction to Guice, Google&apos;s dependency injection framework for the JVM — why hand-wiring hurts, what DI really is, and how Guice keeps the wiring explicit. With Kotlin and Java side by side.</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Your First Guice Injector: Wiring That Builds Itself</title><link>https://engineers-musings.dev/blog/guice/part-1/02-your-first-injector/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-1/02-your-first-injector/</guid><description>A hands-on guice injector tutorial — the Gradle dependency, @Inject constructor injection, AbstractModule, and Guice.createInjector — with Kotlin and Java side by side.</description><pubDate>Sat, 06 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Guice Bindings: Five Ways to Answer One Question</title><link>https://engineers-musings.dev/blog/guice/part-1/03-ways-to-bind/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-1/03-ways-to-bind/</guid><description>A tour of guice bindings — linked, instance, untargeted, constructor, just-in-time, and provider — and when to reach for each, in Kotlin and Java.</description><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Guice Providers and @Provides: Construction Logic Without the new Keyword</title><link>https://engineers-musings.dev/blog/guice/part-1/04-providers-and-provides/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-1/04-providers-and-provides/</guid><description>How a guice provider and an @Provides method give you somewhere to put real construction logic, with lazy creation, scope-crossing, and qualifiers — in Kotlin and Java.</description><pubDate>Sun, 14 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Two of the Same Thing: Telling Identical Types Apart in Guice</title><link>https://engineers-musings.dev/blog/guice/part-1/05-qualifiers-and-binding-annotations/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-1/05-qualifiers-and-binding-annotations/</guid><description>How guice qualifiers and @Named let you bind two implementations of the same type and inject the right one — custom annotations versus stringly-typed names, in Kotlin and Java.</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Scopes: How Long Should an Object Hang Around?</title><link>https://engineers-musings.dev/blog/guice/part-1/06-scopes/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-1/06-scopes/</guid><description>How Guice scopes control object lifetimes, why @Singleton means one instance per injector, and how to apply it from the class or the binding — with Kotlin and Java side by side.</description><pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Composing Modules: One Big Module Is a Smell</title><link>https://engineers-musings.dev/blog/guice/part-1/07-composing-modules/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-1/07-composing-modules/</guid><description>How to organize guice modules as the graph grows — install, multiple modules, Modules.combine, and Modules.override for tests and environments — with Kotlin and Java side by side.</description><pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate></item><item><title>When It Breaks: Reading Guice Stack Traces Without Crying</title><link>https://engineers-musings.dev/blog/guice/part-1/08-when-it-breaks/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-1/08-when-it-breaks/</guid><description>How to read and fix a guice CreationException, the &apos;no implementation was bound&apos; miss, and a circular dependency — with the fixes in Kotlin and Java.</description><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate></item><item><title>Multibindings: How to Build a Plugin System Without a Registry</title><link>https://engineers-musings.dev/blog/guice/part-2/01-multibindings/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-2/01-multibindings/</guid><description>Using the guice multibinder, MapBinder, and OptionalBinder so many modules can contribute to one Set, Map, or Optional — multibindings explained with Kotlin and Java side by side.</description><pubDate>Sat, 03 Jan 2026 00:00:00 GMT</pubDate></item><item><title>TypeLiteral: Smuggling Generics Past the Erasure Checkpoint</title><link>https://engineers-musings.dev/blog/guice/part-2/02-typeliteral-and-generics/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-2/02-typeliteral-and-generics/</guid><description>How Guice TypeLiteral captures full generic types so you can bind and inject things like Repository&lt;User&gt;, with Kotlin and Java side by side — beating type erasure at its own game.</description><pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Assisted Injection: When Half the Object Comes From Guice and Half From You</title><link>https://engineers-musings.dev/blog/guice/part-2/03-assisted-injection/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-2/03-assisted-injection/</guid><description>How guice assisted injection and @Assisted let Guice supply the dependencies while the caller supplies the runtime values — building objects that need both, in Kotlin and Java.</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Guice AOP: Wrapping Methods Without Touching Them</title><link>https://engineers-musings.dev/blog/guice/part-2/04-aop-method-interception/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-2/04-aop-method-interception/</guid><description>A practical guide to guice aop — using a method interceptor to add timing, logging, and transactions cross-cuttingly, with the limitations laid bare, in Kotlin and Java.</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Private Modules: What Happens in the Module Stays in the Module</title><link>https://engineers-musings.dev/blog/guice/part-2/05-private-modules/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-2/05-private-modules/</guid><description>How guice private modules encapsulate bindings so internal wiring never leaks into the global graph — and how to run two isolated copies of a subsystem, in Kotlin and Java.</description><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Custom Scopes: Teaching Guice a New Lifetime</title><link>https://engineers-musings.dev/blog/guice/part-2/06-custom-scopes/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-2/06-custom-scopes/</guid><description>How to write a guice custom scope by implementing the Scope interface — a ThreadLocal-backed scope with enter/exit, a scope annotation, and bindScope — with Kotlin and Java side by side.</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Guice on the Web: The Servlet Extension Nobody Mentions Anymore</title><link>https://engineers-musings.dev/blog/guice/part-2/07-servlet-extension/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-2/07-servlet-extension/</guid><description>How the guice servlet extension wires servlets, filters, and the @RequestScoped / @SessionScoped scopes onto a classic web stack — and when it&apos;s still the right tool — with Kotlin and Java side by side.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Testing Guice, Writing It in Kotlin, and Not Shooting Yourself in the Foot</title><link>https://engineers-musings.dev/blog/guice/part-2/08-testing-kotlin-and-best-practices/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/guice/part-2/08-testing-kotlin-and-best-practices/</guid><description>Guice testing without the container, swapping fakes with Modules.override and BoundFieldModule, Kotlin idioms, the Jakarta migration, and guice best practices — in Kotlin and Java.</description><pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Classes Workbook (Part 1)</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-classes-basics/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-classes-basics/</guid><description>Eleven short exercises on Kotlin classes — declarations, primary constructors, properties, init blocks, custom accessors, encapsulation, and inheritance.</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Class Types Workbook (Part 2)</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-classes-types/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-classes-types/</guid><description>Ten short exercises on Kotlin&apos;s specialized classes — data classes, enums, sealed hierarchies, objects and companions, inner classes, and value classes.</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Collections Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-collections/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-collections/</guid><description>Eleven short exercises on Kotlin collections — read-only versus mutable, the factory functions, map access, getOrDefault, the plus and minus operators, and read-only signatures.</description><pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Control Flow Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-control-flow/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-control-flow/</guid><description>Eleven short exercises on Kotlin control flow — if as an expression, ranges, for loops, membership with in, indices, and labelled break.</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Coroutines Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-coroutines/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-coroutines/</guid><description>Nine short exercises on Kotlin coroutines — suspend functions, suspension points, launch, async and await, coroutineScope, structured concurrency, and dispatchers.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate></item><item><title>Data Types Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-data-types/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-data-types/</guid><description>Eleven short exercises on Kotlin&apos;s basic types — val and var, the number types, explicit conversions, strings and templates, nullability, and Unit and Nothing.</description><pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Delegation Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-delegation/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-delegation/</guid><description>Nine short exercises on Kotlin delegation — class delegation with by, lazy and observable properties, map-backed properties, writing a custom delegate, and lateinit versus lazy.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Destructuring Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-destructuring/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-destructuring/</guid><description>Ten short exercises on Kotlin destructuring — declarations, the componentN convention, data classes, map entries, withIndex, lambda parameters, skipping with underscore, and custom components.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Enums Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-enums/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-enums/</guid><description>Ten short exercises on Kotlin enums — constants, exhaustive when, constructor properties, methods, per-constant overrides, the built-in members, and implementing interfaces.</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Equality Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-equality/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-equality/</guid><description>Ten short exercises on Kotlin equality — structural == versus referential ===, null-safe comparison, data-class equals and hashCode, and Comparable with the comparison operators.</description><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Exceptions Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-exceptions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-exceptions/</guid><description>Ten short exercises on Kotlin exception handling — try/catch as an expression, require and check, use for resources, runCatching and Result, Nothing, and sealed result types.</description><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Extension Functions Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-extensions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-extensions/</guid><description>Ten short exercises on Kotlin extensions — declaring extension functions and properties, the receiver, static resolution, nullable receivers, and members winning over extensions.</description><pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Functions Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-functions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-functions/</guid><description>Fifteen short exercises on Kotlin functions — single-expression bodies, default and named arguments, vararg, and top-level and local functions. Solutions reveal on click.</description><pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Generics Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-generics/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-generics/</guid><description>Nine short exercises on Kotlin generics — generic functions and classes, declaration-site variance with out and in, star projections, and reified type parameters.</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Interfaces Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-interfaces/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-interfaces/</guid><description>Ten short exercises on Kotlin interfaces — implementing them, default methods, property contracts, resolving clashes between defaults, functional interfaces, and interface inheritance.</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Java Interop Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-java-interop/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-java-interop/</guid><description>Ten short exercises on Kotlin/Java interop — getters as properties, platform types, SAM conversion, and the @Jvm annotations that make Kotlin pleasant to call from Java.</description><pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate></item><item><title>Lambdas Workbook (Part 3): Closures</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-lambdas-closures/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-lambdas-closures/</guid><description>Eleven short exercises on closures — capturing parameters, capturing and mutating a var, returning a stateful lambda, shared state, and capturing a loop variable.</description><pubDate>Sat, 14 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Lambdas Workbook (Part 2): The Collection API</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-lambdas-collections/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-lambdas-collections/</guid><description>Thirteen short exercises on lambdas at work — forEach, the trailing-lambda convention, map and filter, chaining, the any/all/count/find/sumOf toolkit, and writing your own higher-order function.</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Lambdas Workbook (Part 5): inline and Receivers</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-lambdas-inline/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-lambdas-inline/</guid><description>Eleven short exercises on inline functions and lambdas with a receiver — marking a function inline, reified, receiver lambda types, apply and buildString, and writing a receiver-based builder.</description><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Lambdas Workbook (Part 4): References, Returns, and Anonymous Functions</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-lambdas-references/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-lambdas-references/</guid><description>Twelve short exercises on the four kinds of function reference, non-local returns and labels, and anonymous functions.</description><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Lambdas Workbook (Part 1): The Basics</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-lambdas-values/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-lambdas-values/</guid><description>Twelve short exercises on the lambda basics — defining and calling, parameters and results, function types, the implicit it, and multi-line bodies.</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Null Safety Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-null-safety/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-null-safety/</guid><description>Ten short exercises on Kotlin null safety — safe calls, the Elvis operator, !!, safe casts, ?.let, lateinit, nullable collections, and platform types.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Operator Overloading Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-operators/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-operators/</guid><description>Ten short exercises on Kotlin operator overloading — plus, get and set, invoke, contains, compareTo, compound assignment, unaryMinus, and making a type iterable.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate></item><item><title>Scope Functions Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-scope-functions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-scope-functions/</guid><description>Ten short exercises on Kotlin&apos;s scope functions — let, run, with, apply, and also, decided by receiver-versus-parameter and result-versus-object, plus takeIf and takeUnless.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate></item><item><title>Smart Casts Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-smartcasts/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-smartcasts/</guid><description>Ten short exercises on Kotlin smart casts — is and !is, null-check narrowing, smart casts in when, combined conditions, early returns, and where they don&apos;t apply.</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Visibility Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-visibility/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-visibility/</guid><description>Ten short exercises on Kotlin visibility — the default, private and protected, the module-scoped internal, private setters, private constructors, and file organization.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate></item><item><title>when Workbook</title><link>https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-when/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin-workbooks/kotlin-when/</guid><description>Ten short exercises on Kotlin&apos;s when — as a statement and an expression, with and without a subject, range and type matching, multiple values per branch, and exhaustiveness.</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate></item><item><title>A Kotlin Class Is Mostly Its Header</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-classes-basics/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-classes-basics/</guid><description>Declaring classes, primary and secondary constructors, properties, init blocks, encapsulation, and why Kotlin classes are final by default. Part 1 of a two-part tour.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate></item><item><title>One Keyword Does the Work: Kotlin&apos;s data, enum, sealed, and object</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-classes-types/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-classes-types/</guid><description>Beyond the plain class — data classes, enums, sealed hierarchies, objects and companions, nested vs inner, and value classes, each with a small example. Part 2 of two.</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Kotlin Collections Are Read-Only Until You Say Otherwise</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-collections/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-collections/</guid><description>Lists, sets, and maps in Kotlin: the read-only versus mutable split, the factory functions, why read-only isn&apos;t immutable, and how it shapes your function signatures.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Kotlin&apos;s if Returns a Value, So There&apos;s No Ternary</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-control-flow/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-control-flow/</guid><description>Control flow in Kotlin: if and when as expressions, for loops over ranges and collections, the range operators, while loops, and labelled break and continue.</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Coroutines: Asynchronous Code That Reads Like It Isn&apos;t</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-coroutines/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-coroutines/</guid><description>An introduction to Kotlin coroutines — suspend functions, why they read sequentially, structured concurrency with async and await, and what suspension actually does.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate></item><item><title>In Kotlin, There Are No Primitives</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-data-types/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-data-types/</guid><description>A tour of Kotlin&apos;s basic types: val and var, the number types, no implicit conversions, strings and templates, null as part of the type, and Any/Unit/Nothing.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate></item><item><title>The by Keyword: Delegation Without the Boilerplate</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-delegation/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-delegation/</guid><description>Class delegation that makes composition as cheap as inheritance, and delegated properties like lazy and observable that move a property&apos;s logic into a reusable object.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Destructuring: Unpacking an Object in One Line</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-destructuring/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-destructuring/</guid><description>Pulling several values out of an object at once with destructuring declarations, the componentN convention behind it, and using it in loops and lambdas.</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Enums in Kotlin: Small, Useful, and More Powerful Than They Look</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-enums/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-enums/</guid><description>Kotlin enums feel familiar coming from Java, but they can carry data, behavior, and exhaustive when-handling. A build-up from the basics.</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate></item><item><title>In Kotlin, == Is the One You Actually Want</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-equality/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-equality/</guid><description>Structural equality with == versus referential equality with ===, why the Java string bug can&apos;t happen here, and how Comparable wires up the comparison operators.</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Unchecked and Unbothered: How Kotlin Rethinks Java&apos;s Exception Handling</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-exceptions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-exceptions/</guid><description>Kotlin drops checked exceptions entirely. Here&apos;s what that changes day to day, and the compiler trickery that makes it work.</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Extension Functions: Add Methods to Classes You Don&apos;t Own</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-extensions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-extensions/</guid><description>Declaring extension functions and properties, what the receiver and this mean, why extensions resolve statically rather than virtually, and nullable receivers.</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate></item><item><title>In Kotlin, Functions Don&apos;t Need a Class</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-functions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-functions/</guid><description>Declaring functions with fun, single-expression bodies, default and named arguments that retire overloads, vararg, and top-level and local functions.</description><pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Kotlin Generics: Variance Without the Wildcards</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-generics/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-generics/</guid><description>Generic functions and classes, declaration-site variance with out and in instead of Java&apos;s wildcards, star projections, and reified type parameters on inline functions.</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Kotlin Interfaces Carry More Than Java&apos;s Ever Could</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-interfaces/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-interfaces/</guid><description>Interfaces with default method bodies, abstract properties, implementing several at once and resolving the clashes, and how to choose between an interface and an abstract class.</description><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Calling Java From Kotlin (and Back) Without Friction</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-java-interop/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-java-interop/</guid><description>How Kotlin sees Java getters as properties, SAM conversion for functional interfaces, and the @Jvm annotations that make Kotlin code pleasant to call from Java.</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate></item><item><title>Closures: What a Lambda Remembers</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-lambdas-closures/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-lambdas-closures/</guid><description>A lambda can capture variables from the scope where it was written — and in Kotlin it can even change them. The mental model, the Java contrast, and the gotchas. Part 3 of five.</description><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Lambdas at Work: Transforming Collections</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-lambdas-collections/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-lambdas-collections/</guid><description>Where lambdas earn their keep: higher-order functions, the trailing-lambda convention, map and filter and the rest of the collection toolkit, chaining, and writing your own. Part 2 of five.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Why Lambdas Are Free, and Lambdas That Read Like Syntax</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-lambdas-inline/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-lambdas-inline/</guid><description>The performance model behind lambdas — inline functions and why they cost nothing — and lambdas with a receiver, the trick behind apply, buildString, and Kotlin&apos;s DSLs. Part 5 of five.</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Lambdas, Sharpened: References, Returns, and Anonymous Functions</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-lambdas-references/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-lambdas-references/</guid><description>Replacing a lambda with a function reference, the four kinds of reference, the surprising rules for return inside a lambda and the labels that tame them, and anonymous functions. Part 4 of five.</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate></item><item><title>A Kotlin Lambda Is a Value You Can Pass Around</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-lambdas-values/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-lambdas-values/</guid><description>The gentle start to lambdas: code as a value, defining versus calling, parameters and results, function types, the implicit it, and multi-line bodies. Part 1 of five.</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Kotlin&apos;s Billion-Dollar Fix: Null Lives in the Type System</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-null-safety/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-null-safety/</guid><description>The full null-safety toolkit: safe calls, the Elvis operator, !!, safe casts, ?.let, lateinit, nullable collections, and the platform types that leak in from Java.</description><pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Operator Overloading, Kept on a Leash</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-operators/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-operators/</guid><description>Kotlin allows operator overloading but only through a fixed set of conventionally-named functions: plus, get, invoke, contains, and friends — power with guardrails.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate></item><item><title>let, run, apply, also, with: Picking the Right Scope Function</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-scope-functions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-scope-functions/</guid><description>The five scope functions decided by two questions — how the object is referenced (this or it) and what the block returns (the result or the object itself).</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate></item><item><title>Kotlin Smart Casts: Stop Telling the Compiler What It Already Knows</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-smartcasts/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-smartcasts/</guid><description>How Kotlin&apos;s smart casts remove the check-then-cast tax from everyday code, and the rules that decide when they kick in.</description><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Kotlin Has a Visibility Level Java Doesn&apos;t: internal</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-visibility/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-visibility/</guid><description>The four visibility modifiers, why public is the default, what internal means at the module level, and how Kotlin&apos;s file structure frees you from one-class-per-file.</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Kotlin&apos;s when Is the New switch — And if, And instanceof</title><link>https://engineers-musings.dev/blog/kotlin/kotlin-when/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/kotlin/kotlin-when/</guid><description>Kotlin&apos;s when quietly replaces switch, long if/else ladders, and instanceof-with-cast. A tour of the parts that matter.</description><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate></item><item><title>Ktor Is Just Kotlin, All the Way Down</title><link>https://engineers-musings.dev/blog/ktor/01-why-ktor/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/01-why-ktor/</guid><description>Meet Ktor — JetBrains&apos; lightweight, coroutine-first framework for Kotlin backends. Why it feels different from Spring, and your first server in a handful of lines.</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate></item><item><title>From Zero to a Running Server: Setting Up Ktor</title><link>https://engineers-musings.dev/blog/ktor/02-project-setup/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/02-project-setup/</guid><description>Bootstrap a real Ktor project with Gradle and IntelliJ — the project generator, the build file, the two ways to start a server, and live reload while you code.</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Routing: Turning URLs Into Code</title><link>https://engineers-musings.dev/blog/ktor/03-routing/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/03-routing/</guid><description>The Ktor routing DSL from the ground up — HTTP verbs, path and query parameters, nested routes, and how to split your routes into clean, composable functions.</description><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate></item><item><title>The Anatomy of a Call: Requests and Responses</title><link>https://engineers-musings.dev/blog/ktor/04-requests-and-responses/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/04-requests-and-responses/</guid><description>Everything flows through `call`. Read headers and bodies from the request, and reply with the right status codes, content types, and headers from the response.</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Speaking JSON: Content Negotiation in Ktor</title><link>https://engineers-musings.dev/blog/ktor/05-json-content-negotiation/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/05-json-content-negotiation/</guid><description>Install one plugin, annotate your data classes, and Ktor serializes Kotlin objects to JSON and parses JSON back into objects — no manual string wrangling.</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Your First Real API: CRUD, End to End</title><link>https://engineers-musings.dev/blog/ktor/06-building-a-rest-api/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/06-building-a-rest-api/</guid><description>Routing, JSON, and status codes come together into a complete task API — list, fetch, create, update, and delete — backed by a clean repository.</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Before module() Becomes a Monster</title><link>https://engineers-musings.dev/blog/ktor/07-application-structure/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/07-application-structure/</guid><description>Ktor gives you no structure — that&apos;s your job. Split configuration into focused extension functions, organize by concern, and read typed values from application.yaml.</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate></item><item><title>One Place for Things Going Wrong: StatusPages</title><link>https://engineers-musings.dev/blog/ktor/08-error-handling/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/08-error-handling/</guid><description>Stop scattering error responses through every handler. Throw meaningful exceptions, map them to status codes and clean JSON in one plugin, and keep your routes about the happy path.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Giving Your Data a Home: Persistence with Exposed</title><link>https://engineers-musings.dev/blog/ktor/09-persistence-with-exposed/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/09-persistence-with-exposed/</guid><description>Swap the in-memory map for a real SQL database using Exposed, JetBrains&apos; Kotlin SQL framework — tables as objects, type-safe queries, and transactions that play nicely with coroutines.</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Who Builds the Objects? Dependency Injection in Ktor</title><link>https://engineers-musings.dev/blog/ktor/10-dependency-injection/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/10-dependency-injection/</guid><description>Ktor has no DI container — and that&apos;s fine until it isn&apos;t. Start with honest manual wiring, add a service layer, then graduate to Koin when hand-threading dependencies stops scaling.</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Locking the Doors: JWT Authentication</title><link>https://engineers-musings.dev/blog/ktor/11-authentication-with-jwt/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/11-authentication-with-jwt/</guid><description>Issue signed tokens at login, verify them on protected routes with Ktor&apos;s Authentication plugin, and read the logged-in user out of the request — the standard auth flow for APIs.</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate></item><item><title>Don&apos;t Trust the Client: Validation and Security</title><link>https://engineers-musings.dev/blog/ktor/12-validation-and-security/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/12-validation-and-security/</guid><description>Reject bad input before it reaches your logic with RequestValidation, open your API to browsers safely with CORS, and survive the public internet with rate limiting and sane headers.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate></item><item><title>Flying With Instruments: Logging and Metrics</title><link>https://engineers-musings.dev/blog/ktor/13-observability/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/13-observability/</guid><description>When production misbehaves, you need to see inside. Add request logging, trace a single request across log lines with a call ID, and expose Prometheus metrics — all as plugins.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate></item><item><title>Calling Out: The Ktor HTTP Client</title><link>https://engineers-musings.dev/blog/ktor/14-the-ktor-client/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/14-the-ktor-client/</guid><description>Ktor isn&apos;t just a server. The same library gives you a coroutine-based HTTP client for calling other APIs — with JSON, timeouts, and defaults configured the way you&apos;d expect.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate></item><item><title>Keeping the Line Open: WebSockets</title><link>https://engineers-musings.dev/blog/ktor/15-websockets/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/15-websockets/</guid><description>Request/response can&apos;t push. WebSockets give you a persistent, two-way channel — perfect for live updates and chat. Echo a message, then broadcast to every connected client.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate></item><item><title>Proving It Works: Testing Ktor Apps</title><link>https://engineers-musings.dev/blog/ktor/16-testing/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/16-testing/</guid><description>Ktor runs your whole app in-memory for tests — no ports, no network, no waiting. Test routes with a real HTTP client, assert on JSON, exercise auth, and swap in fakes.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate></item><item><title>Shipping It: From Fat JAR to Production</title><link>https://engineers-musings.dev/blog/ktor/17-deployment/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/ktor/17-deployment/</guid><description>Package your Ktor app into a single runnable JAR, wrap it in a Docker image, drive its config from environment variables, and walk the checklist before it faces real traffic.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate></item><item><title>I Stopped My 2019 Intel MacBook Pro From Bleeding Battery Overnight — Here&apos;s What Actually Worked</title><link>https://engineers-musings.dev/blog/macos/intel-mac-battery-drain/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/macos/intel-mac-battery-drain/</guid><description>An Intel Mac draining ~28% overnight wasn&apos;t the failing battery — it was one Continuity feature holding the CPU awake. The one-toggle fix, with measured results.</description><pubDate>Tue, 19 Aug 2025 00:00:00 GMT</pubDate></item><item><title>Diagnosing a Sluggish Intel Mac: A Field Manual</title><link>https://engineers-musings.dev/blog/macos/intel-mac-diagnostics/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/macos/intel-mac-diagnostics/</guid><description>Eight terminal commands that tell you why an Intel Mac feels slow — swap, memory pressure, runaway CPU, rogue VMs, and sleep blockers — and how to read each one.</description><pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate></item><item><title>What Is Misk? Cash App&apos;s Kotlin Microservice Container, Explained</title><link>https://engineers-musings.dev/blog/misk/01-what-is-misk/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/01-what-is-misk/</guid><description>Misk is the open-source Kotlin microservice container that runs hundreds of services at Cash App. Here&apos;s what a container is, how it differs from Spring Boot and Ktor, and when to reach for it.</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Misk Getting Started: Your First Service, End to End</title><link>https://engineers-musings.dev/blog/misk/02-misk-getting-started/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/02-misk-getting-started/</guid><description>A hands-on misk getting started walkthrough: the Gradle and BOM setup, the MiskApplication entry point, the module list, config YAML, and running the exemplar service locally.</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Misk Guice Dependency Injection: KAbstractModule and the Module Way</title><link>https://engineers-musings.dev/blog/misk/03-misk-guice-dependency-injection/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/03-misk-guice-dependency-injection/</guid><description>How misk dependency injection works: KAbstractModule, bindings, qualifiers, and multibindings in Kotlin — and why Misk chose Guice over Spring-style component scanning.</description><pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Misk Service Lifecycle: Readiness and Graceful Shutdown Done Right</title><link>https://engineers-musings.dev/blog/misk/04-misk-service-lifecycle/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/04-misk-service-lifecycle/</guid><description>How the misk service lifecycle works: Guava ServiceManager, dependency ordering with dependsOn and enhancedBy, the ReadyService pattern, warmup, and misk graceful shutdown that drains in-flight work.</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Misk Web Actions: Building HTTP Endpoints (and How They Beat @RestController)</title><link>https://engineers-musings.dev/blog/misk/05-misk-web-actions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/05-misk-web-actions/</guid><description>Write a misk web action: WebAction, @Get/@Post, path and query params, typed request and response bodies, and status control with Response&lt;T&gt; — plus why Misk favors one action class per endpoint.</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Misk JSON, Forms, Multipart &amp; Downloads: Marshalling the Wire</title><link>https://engineers-musings.dev/blog/misk/06-misk-marshalling-json-multipart/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/06-misk-marshalling-json-multipart/</guid><description>How Misk moves bytes: JSON marshalling with Moshi, form-encoded bodies, misk multipart upload handling via MultipartReader, and file downloads with Content-Disposition.</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Misk Interceptors: Cross-Cutting Concerns Without the Magic</title><link>https://engineers-musings.dev/blog/misk/07-misk-interceptors/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/07-misk-interceptors/</guid><description>A guide to the misk interceptor model: NetworkInterceptor vs ApplicationInterceptor, where each sits in the request pipeline, the Factory that opts them in per action, and how to write your own.</description><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Misk gRPC and Protobuf: Wire-Generated Services, JSON for Free</title><link>https://engineers-musings.dev/blog/misk/08-misk-grpc-protobuf/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/08-misk-grpc-protobuf/</guid><description>Build a misk grpc endpoint with protobuf and Wire: define the proto, generate server interfaces, implement a gRPC action, and get an automatic JSON variant of every protobuf action.</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Misk Authentication &amp; Access Control: Callers, Capabilities, and Audit</title><link>https://engineers-musings.dev/blog/misk/09-misk-authentication-access/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/09-misk-authentication-access/</guid><description>How misk authentication and access control work: @Authenticated, the MiskCaller model of services and capabilities, custom access annotations, the AccessInterceptor that enforces them, and audit logging.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Misk OPA Authorization: Type-Safe Policy with misk-policy</title><link>https://engineers-musings.dev/blog/misk/10-misk-opa-authorization/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/10-misk-opa-authorization/</guid><description>Externalize complex authorization with misk opa integration: wire Misk to Open Policy Agent via misk-policy, write type-safe OpaPolicyEngine queries, and test policy locally.</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Misk Crypto &amp; Secrets: Keys, Encryption, and Config Secrets Done Safely</title><link>https://engineers-musings.dev/blog/misk/11-misk-crypto-secrets/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/11-misk-crypto-secrets/</guid><description>How misk crypto wires Tink primitives from KMS-encrypted keys, and how misk secrets keep credentials out of code, logs, and dashboards via Secret&lt;T&gt; and @Redact.</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Misk JDBC &amp; Data Sources: Connection Pooling and Read/Write Splitting</title><link>https://engineers-musings.dev/blog/misk/12-misk-jdbc-datasources/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/12-misk-jdbc-datasources/</guid><description>How misk jdbc wires a real database: misk datasource config, Hikari connection pooling, read/write splitting via reader/writer clusters, and the JDBC-layer Transacter.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Misk Hibernate and the Transacter: Persistence Without the Footguns</title><link>https://engineers-musings.dev/blog/misk/13-misk-hibernate-transacter/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/13-misk-hibernate-transacter/</guid><description>How misk hibernate models entities and queries, and how the misk transacter gives you block-based transactions, retries, and replica reads without ever handing you a raw Hibernate session.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Misk Schema Migrations: Versioned SQL Without Flyway</title><link>https://engineers-musings.dev/blog/misk/14-misk-schema-migrations/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/14-misk-schema-migrations/</guid><description>How misk schema migration works — versioned .sql files, the schema_version table, the standalone Gradle plugin, and why it&apos;s a credible misk flyway alternative.</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Misk SqlDelight, jOOQ &amp; Vitess: Beyond Hibernate, and Sharding at Scale</title><link>https://engineers-musings.dev/blog/misk/15-misk-sqldelight-jooq-vitess/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/15-misk-sqldelight-jooq-vitess/</guid><description>Why misk sqldelight and jOOQ are the type-safe alternatives to Hibernate, plus misk vitess sharding for horizontal MySQL scale and the Vitess Gradle plugin.</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Misk Redis &amp; Caching: The Lettuce-Backed Client and Cache Patterns</title><link>https://engineers-musings.dev/blog/misk/16-misk-redis-caching/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/16-misk-redis-caching/</guid><description>How misk redis and misk caching work: the Jedis-backed Redis client, the newer Lettuce module, RedisModule wiring, RedisConfig YAML, and a FakeRedis for tests.</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Misk Rate Limiting &amp; Tokens: Bucket4j Backends and Safe ID Generation</title><link>https://engineers-musings.dev/blog/misk/17-misk-rate-limiting-tokens/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/17-misk-rate-limiting-tokens/</guid><description>How misk rate limiting and misk tokens work: the wisp RateLimiter backed by Bucket4j (Redis, MySQL, DynamoDB), and TokenGenerator for unguessable IDs.</description><pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate></item><item><title>Misk Job Queues: Transactional, SQS-Backed Background Work</title><link>https://engineers-musings.dev/blog/misk/18-misk-job-queues/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/18-misk-job-queues/</guid><description>How the misk job queue works: defining handlers, enqueuing, and the misk sqs (misk-aws2-sqs) backend — plus the transactional spooling table and its exactly-once-ish guarantee.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate></item><item><title>Misk Cron: Cluster-Safe Scheduled Jobs</title><link>https://engineers-musings.dev/blog/misk/19-misk-cron-scheduled-jobs/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/19-misk-cron-scheduled-jobs/</guid><description>How misk cron schedules recurring work: the @CronPattern annotation, the Runnable contract, CronModule wiring, and the lease-based coordination that stops every replica from firing the same job.</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate></item><item><title>Misk Distributed Leases &amp; Leader Election: Coordinating a Cluster</title><link>https://engineers-musings.dev/blog/misk/20-misk-distributed-leases/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/20-misk-distributed-leases/</guid><description>How a misk distributed lease works and how to use it for misk leader election: the Lease/LeaseManager API, the SQL and cluster-aware backends, and the time-bound correctness caveats.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate></item><item><title>Misk Configuration &amp; Environments: YAML, Secrets, and Wisp</title><link>https://engineers-musings.dev/blog/misk/21-misk-configuration/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/21-misk-configuration/</guid><description>A deeper look at misk config and misk environments: the Deployment model, the full YAML resolution and merge order, Secret&lt;T&gt; loading, redaction, and Wisp&apos;s standalone config and deployment helpers.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate></item><item><title>Misk Observability: Prometheus Metrics, Structured Logging, and Tracing</title><link>https://engineers-musings.dev/blog/misk/22-misk-observability/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/22-misk-observability/</guid><description>How misk observability fits together: misk metrics prometheus counters, gauges and histograms, structured logging with MDC tags, sampling, and OpenTracing-backed tracing on Datadog.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate></item><item><title>Misk Testing: @MiskTest, Fakes, and Fast Integration Tests</title><link>https://engineers-musings.dev/blog/misk/23-misk-testing/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/23-misk-testing/</guid><description>How misk testing works: @MiskTest stands up a real injector, fakes ship as modules, and WebTestClient gives you fast integration tests against a running server — plus action registration checks.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate></item><item><title>The Misk Admin Dashboard: Server-Rendered with Hotwire and Tailwind</title><link>https://engineers-musings.dev/blog/misk/24-misk-admin-dashboard/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/24-misk-admin-dashboard/</guid><description>How the misk admin dashboard works and how to build tabs on its misk hotwire tailwind stack — kotlinx.html server-side rendering, the deprecated React misk-web, and AdminDashboardAccess gating.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Exposing Your Misk Service to AI: An MCP Server with misk-mcp</title><link>https://engineers-musings.dev/blog/misk/25-misk-mcp/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/misk/25-misk-mcp/</guid><description>Turn a Misk service into a Model Context Protocol server with misk mcp: define tools, resources, and prompts, then expose them to LLMs over StreamableHTTP or WebSocket.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Hello, Turtle! Move and Turn</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/01-hello-turtle/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/01-hello-turtle/</guid><description>Day one of Python for Kids: meet the turtle, write real Python, and steer it around the screen — forward, back, and turning corners — all in your browser.</description><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Shapes and the Angle Rule</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/02-turns-and-shapes/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/02-turns-and-shapes/</guid><description>What do those turning numbers really mean? Learn the one simple rule that lets you draw a triangle, a pentagon, a hexagon — any shape you want.</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Pick Up the Pen and Add Color</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/03-pen-and-color/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/03-pen-and-color/</guid><description>Move without drawing, change colors and line thickness, and fill your shapes with bright color. Your drawings are about to come alive.</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Build-It Project: Draw a House</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/04-project-house/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/04-project-house/</guid><description>Your first real project! Put moves, turns, and colors together to build a house with a roof — then make it your own with a door, a window, and a sun.</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Loops: The Lazy Way to Draw</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/05-loops/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/05-loops/</guid><description>Why type the same lines over and over? Meet the loop — Python&apos;s way to repeat — and draw any shape in just two lines instead of a dozen.</description><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Spinning Loops into Patterns</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/06-loop-patterns/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/06-loop-patterns/</guid><description>Repeat a shape while turning a little each time and watch stars, bursts, and flower-like patterns appear. This is where code starts to feel like magic.</description><pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Variables: Give Your Numbers Names</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/07-variables/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/07-variables/</guid><description>Store a number under a name and reuse it everywhere — change it once and your whole drawing updates. Then make a number grow inside a loop to draw a spiral.</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Build-It Project: A Spiral Masterpiece</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/08-project-spiral/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/08-project-spiral/</guid><description>Project day! Combine loops and a growing variable into a smooth, colorful spiral — then turn the knobs to make a one-of-a-kind piece of art.</description><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Functions: Teach the Turtle a New Trick</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/09-functions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/09-functions/</guid><description>Give a drawing a name once, then use it again and again. Functions let you build your own commands — like teaching the turtle a brand-new trick.</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Functions That Take Inputs</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/10-functions-parameters/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/10-functions-parameters/</guid><description>Give your functions a knob to turn. With parameters, one function can draw big shapes, small shapes, and any color — and a loop can call it with a different value each time.</description><pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate></item><item><title>A Splash of Randomness</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/11-randomness/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/11-randomness/</guid><description>Make the computer surprise you. With random colors, sizes, and positions, your art comes out different every time you press Run — the secret behind generative art.</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Making Choices with if</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/12-making-choices/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/12-making-choices/</guid><description>Teach the turtle to decide. With if and else, your program can choose between options — and combined with randomness, it can surprise you in bigger ways.</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Capstone: Your Own Generative Art</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/13-capstone-generative-art/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-1/13-capstone-generative-art/</guid><description>The big finish for Phase I. Combine functions, parameters, loops, randomness, and decisions into a one-of-a-kind generative artwork — then make it completely your own.</description><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Talking to the Computer</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/01-talking-to-the-computer/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/01-talking-to-the-computer/</guid><description>Phase II begins! Put down the turtle and pick up words. Make the computer print messages, ask you questions, and remember your answers.</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Working with Words</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/02-working-with-words/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/02-working-with-words/</guid><description>Strings are the computer&apos;s words. Glue them together, measure them, make them LOUD or quiet, and repeat them — the start of real text programs.</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Numbers and Math</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/03-numbers-and-math/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/03-numbers-and-math/</guid><description>Make the computer your calculator: add, multiply, divide, and find remainders. Plus the big gotcha — turning the text from input() into a real number.</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate></item><item><title>True or False: Asking Yes/No Questions</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/04-true-or-false/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/04-true-or-false/</guid><description>Before a computer can make decisions, it has to answer yes/no questions. Meet True and False, the comparison signs, and the words and, or, and not.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Making Decisions with if</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/05-making-decisions/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/05-making-decisions/</guid><description>Now your program can choose. Use if, elif, and else to do different things depending on the answer to a yes/no question.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Build-It Project: A Quiz Game</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/06-project-quiz/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/06-project-quiz/</guid><description>Put input, if, and a score together to build a real quiz game that asks questions, checks answers, keeps score, and tells the player how they did.</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Repeating with while</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/07-repeating-with-while/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/07-repeating-with-while/</guid><description>A while loop repeats as long as something stays true. Build a countdown and a real number-guessing game that keeps asking until the player gets it right.</description><pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Lists: Holding Many Things</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/08-lists/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/08-lists/</guid><description>One variable can hold a whole collection. Meet the list — store many values, grab them by position, add new ones — the start of working with real data.</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Looping Through Data</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/09-looping-through-data/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/09-looping-through-data/</guid><description>March a loop through a whole list — print every item, add them all up, count the ones you care about, find the biggest. This is what data analysis is made of.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Dictionaries: Labels for Your Data</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/10-dictionaries/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/10-dictionaries/</guid><description>Lists keep data in order; dictionaries label it. Store &apos;Ada → 90&apos;, look things up by name, and loop through labeled data — a key skill for real datasets.</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Functions That Return Answers</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/11-functions-that-return/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/11-functions-that-return/</guid><description>In Phase I your functions drew shapes. Now they compute and hand back an answer with return — so you can use the result, combine it, and build real tools.</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Build-It Project: A Chatbot</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/12-project-chatbot/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/12-project-chatbot/</guid><description>Build a chatbot that reads what you type and replies. Combine a while loop, keyword checks, and friendly responses into a program that holds a conversation.</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Capstone: A Text Adventure</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/13-capstone-text-adventure/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-2/13-capstone-text-adventure/</guid><description>The big finish for Phase II — build a branching choose-your-own-adventure game with choices, an inventory, and multiple endings. Then get ready for Phase III.</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Getting Started with Google Colab</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/01-getting-started-with-colab/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/01-getting-started-with-colab/</guid><description>Phase III moves to a real tool that professionals use: Google Colab. Here&apos;s how to get set up with an adult&apos;s help — plus free alternatives if you&apos;d rather not use Google.</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate></item><item><title>Getting Comfortable in a Notebook</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/02-your-first-notebook/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/02-your-first-notebook/</guid><description>Notebooks work a little differently from the editors you&apos;ve used. Learn how cells run, how they share memory, and confirm all your Python skills work in Colab.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate></item><item><title>Meet a Real Dataset</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/03-meet-a-dataset/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/03-meet-a-dataset/</guid><description>Load a real table of data about Antarctic penguins with pandas, and take your first look — how many rows, what columns, and what the data actually says.</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate></item><item><title>Looking Around the Data</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/04-looking-around/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/04-looking-around/</guid><description>Pull out exactly the columns you care about, see which values appear, and treat a column like the lists you already know. The first move of a data detective.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate></item><item><title>Filtering: Keep Only the Rows You Want</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/05-filtering-rows/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/05-filtering-rows/</guid><description>Ask the data questions like &apos;show me only the heavy penguins&apos; or &apos;just the Gentoos.&apos; Filter rows by a condition, combine conditions, and sort the results.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate></item><item><title>Counting and Grouping</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/06-counting-and-grouping/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/06-counting-and-grouping/</guid><description>Answer the big data questions: how many of each kind? what&apos;s the average per group? Meet value_counts and groupby — the heart of data analysis.</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate></item><item><title>New Columns and Record-Holders</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/07-new-columns-and-stats/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/07-new-columns-and-stats/</guid><description>Add your own columns calculated from the data, and find the record-holders — the single heaviest penguin, the longest flipper — not just the averages.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate></item><item><title>Your First Chart</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/08-your-first-chart/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/08-your-first-chart/</guid><description>Turn numbers into pictures. Make bar charts from your data with one line — counts of each species, average weight per group — and actually see the story.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate></item><item><title>More Kinds of Charts</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/09-more-chart-types/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/09-more-chart-types/</guid><description>Bars aren&apos;t the only chart. Meet histograms, scatter plots, and line charts — and learn which one answers which kind of question.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Charts Anyone Can Read</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/10-clear-charts/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/10-clear-charts/</guid><description>A chart without labels is a mystery. Add titles, axis labels, and color, then save your chart as an image you can share.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Bring Your Own Data</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/11-bring-your-own-data/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/11-bring-your-own-data/</guid><description>The penguin skills work on any dataset. Load other built-in datasets, or any CSV from the web, and explore something you actually care about.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Capstone: A Data Detective Report</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/12-capstone-data-report/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-3/12-capstone-data-report/</guid><description>The big finish for Phase III. Pick a dataset, ask three questions, answer them with stats and charts, and write up what you discovered — a real data report.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate></item><item><title>What Is AI? Let the Computer Look at a Picture</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/01-what-is-ai/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/01-what-is-ai/</guid><description>Phase IV begins! Meet Artificial Intelligence by using one — upload a photo and watch a ready-made AI guess what&apos;s in it, in just a few lines of Python.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate></item><item><title>AI That Reads Feelings</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/02-ai-reads-feelings/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/02-ai-reads-feelings/</guid><description>Type a sentence and watch an AI decide whether it sounds happy or sad. Meet sentiment analysis — and start spotting where AI gets things wrong.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>AI That Writes</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/03-ai-that-writes/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/03-ai-that-writes/</guid><description>Give an AI the start of a sentence and watch it keep going. Meet text generation — the same idea behind chatbots — and learn why it &apos;predicts&apos; rather than &apos;thinks.&apos;</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Project: AI Explorer (and Where AI Goes Wrong)</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/04-project-ai-explorer/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/04-project-ai-explorer/</guid><description>Put all three AIs to the test with your own inputs, keep a log of the clever and the clueless, and start thinking about why AI makes the mistakes it does.</description><pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Learning From Examples</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/05-learning-from-examples/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/05-learning-from-examples/</guid><description>How does a computer &apos;learn&apos;? The big idea behind all machine learning: instead of writing rules, you show it labeled examples and let it find the pattern.</description><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Train Your First Model</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/06-your-first-trained-model/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/06-your-first-trained-model/</guid><description>Three lines of code, and the computer learns to tell penguin species apart from their measurements. Meet scikit-learn, fit, and predict.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Did It Actually Learn?</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/07-did-it-learn/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/07-did-it-learn/</guid><description>Testing a model on the same examples it studied is cheating. Split your data into a study set and a test set, and measure how often the model is really right.</description><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Project: Build a Guesser</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/08-project-build-a-guesser/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/08-project-build-a-guesser/</guid><description>Put the whole machine-learning recipe together — load data, split it, train a model, check its accuracy, and make predictions on your own examples.</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Pictures Are Just Numbers</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/09-pictures-are-numbers/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/09-pictures-are-numbers/</guid><description>How can a computer &apos;see&apos; an image? It can&apos;t — but it can read numbers. Discover that every picture is really a grid of brightness values, setting up image AI.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Train an Image Recognizer</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/10-train-an-image-recognizer/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/10-train-an-image-recognizer/</guid><description>Teach a model to read handwritten digits. Same recipe as the penguins — but now the features are pixels, and your AI learns to recognize images.</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Test It, See the Mistakes, Make It Better</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/11-test-and-improve/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/11-test-and-improve/</guid><description>A great score isn&apos;t the end. Look at the actual digits your AI got wrong, understand why, and try simple changes to push the accuracy higher.</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Capstone: Teach the Computer (and Use AI Wisely)</title><link>https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/12-capstone-teach-the-computer/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/python/kids/summer/2026/phase-4/12-capstone-teach-the-computer/</guid><description>The grand finale. Train your own model end to end, present how well it works, and have the most important conversation in AI: how to use it responsibly.</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate></item><item><title>PyTorch Without the Calculus: What It Is and What You Can Ignore</title><link>https://engineers-musings.dev/blog/pytorch/phase-1/01-what-is-pytorch/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-1/01-what-is-pytorch/</guid><description>A gentle, math-free introduction to PyTorch for engineers and technical PMs — what it actually is, what you can safely skip, and how to set up Google Colab to run real AI models.</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Tensors: The One Data Structure You Actually Have to Like</title><link>https://engineers-musings.dev/blog/pytorch/phase-1/02-tensors/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-1/02-tensors/</guid><description>A beginner-friendly tour of pytorch tensors — creating them, reshaping them, and moving them to the GPU — with no linear-algebra homework attached.</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate></item><item><title>What a Model Really Is: A Read-Only Peek Inside the Black Box</title><link>https://engineers-musings.dev/blog/pytorch/phase-1/03-inside-a-model/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-1/03-inside-a-model/</guid><description>A gentle, math-free look at what a neural network is actually made of — layers and parameters — by opening up a real PyTorch nn.Module and reading it like a spec sheet. Beginner-friendly.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Your First Real Model Run, From Photo to Verdict</title><link>https://engineers-musings.dev/blog/pytorch/phase-1/04-running-a-pretrained-model/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-1/04-running-a-pretrained-model/</guid><description>A beginner-friendly walkthrough to run a pretrained model in PyTorch end to end — download an image and do image classification with torchvision, no deep-learning math required.</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Logits, Softmax, and the Two Ends of Every Model</title><link>https://engineers-musings.dev/blog/pytorch/phase-1/05-inputs-and-outputs/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-1/05-inputs-and-outputs/</guid><description>A beginner-friendly guide to PyTorch model inputs and outputs — preprocessing and batch dimensions on one end, logits vs probabilities on the other — so you can run any pretrained model with confidence.</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Three Lines and a Verdict: Running Models with Hugging Face Pipelines</title><link>https://engineers-musings.dev/blog/pytorch/phase-1/06-huggingface-pipelines/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-1/06-huggingface-pipelines/</guid><description>A beginner-friendly tour of the Hugging Face transformers pipeline — the fastest way to run a pretrained model in three lines, across text, images, and audio.</description><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Beyond pipeline(): Taking the Wheel with from_pretrained</title><link>https://engineers-musings.dev/blog/pytorch/phase-1/07-beyond-pipelines/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-1/07-beyond-pipelines/</guid><description>A beginner-friendly guide to dropping below pipeline() for control — using AutoTokenizer and AutoModel from_pretrained, a huggingface tokenizer, and reading raw logits by hand.</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate></item><item><title>The Hub and the Heavyweights: Finding Models and Running Big Ones Without Melting Your Laptop</title><link>https://engineers-musings.dev/blog/pytorch/phase-1/08-the-hub-and-bigger-models/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-1/08-the-hub-and-bigger-models/</guid><description>A beginner-friendly guide to the Hugging Face Hub — how to find the right model and read its card and license — plus how to run large models with quantization so they fit on a free Colab GPU.</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate></item><item><title>From Notebook to App: Wrap a Model in a UI Anyone Can Use</title><link>https://engineers-musings.dev/blog/pytorch/phase-1/09-capstone-build-a-model-app/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-1/09-capstone-build-a-model-app/</guid><description>Build an AI app in PyTorch by wrapping a pretrained model in a Gradio app — a beginner-friendly capstone that turns a model into a real, shareable little tool.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate></item><item><title>How a Model Learns: Being Wrong, On Purpose, A Million Times</title><link>https://engineers-musings.dev/blog/pytorch/phase-2/01-how-models-learn/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-2/01-how-models-learn/</guid><description>A math-free, beginner-friendly walkthrough of how neural networks learn — the training intuition behind loss, gradients, optimizers, and epochs, with no calculus required.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate></item><item><title>The Five-Line Training Loop That Makes PyTorch Learn</title><link>https://engineers-musings.dev/blog/pytorch/phase-2/02-the-training-loop/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-2/02-the-training-loop/</guid><description>A beginner-friendly walk through the PyTorch training loop — forward, loss, backward, optimizer step — and what loss.backward() and optimizer.step() actually do.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate></item><item><title>Datasets and DataLoaders: Feeding the Beast Without Choking It</title><link>https://engineers-musings.dev/blog/pytorch/phase-2/03-datasets-and-dataloaders/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-2/03-datasets-and-dataloaders/</guid><description>A beginner-friendly guide to the PyTorch Dataset and DataLoader — how batching data and shuffling feed your training loop the right way, with a tiny custom example.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate></item><item><title>Transfer Learning: Standing on a Pretrained Model&apos;s Shoulders</title><link>https://engineers-musings.dev/blog/pytorch/phase-2/04-transfer-learning/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-2/04-transfer-learning/</guid><description>A beginner-friendly guide to transfer learning in PyTorch — fine-tune a pretrained model by swapping its head and freezing the backbone, no training-from-scratch required.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate></item><item><title>Fine-Tuning the Lazy Way: Let the Trainer Run Your Loop</title><link>https://engineers-musings.dev/blog/pytorch/phase-2/05-fine-tuning-with-the-trainer/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-2/05-fine-tuning-with-the-trainer/</guid><description>A beginner-friendly walkthrough of huggingface Trainer fine-tuning — fine-tune a text classifier on a real dataset end to end, with the hand-written training loop done for you.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate></item><item><title>Did Your Model Actually Learn Anything? Evaluating Honestly</title><link>https://engineers-musings.dev/blog/pytorch/phase-2/06-evaluating-your-model/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-2/06-evaluating-your-model/</guid><description>A beginner-friendly guide to evaluating a machine learning model — train/validation/test splits, accuracy, precision/recall and F1, and spotting overfitting before it fools you.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate></item><item><title>LoRA: Fine-Tune a Giant Model on a Free GPU</title><link>https://engineers-musings.dev/blog/pytorch/phase-2/07-lora-and-peft/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-2/07-lora-and-peft/</guid><description>A beginner-friendly guide to LoRA fine-tuning and PEFT (parameter-efficient fine-tuning) — freeze the big model, train tiny adapters, and ship megabytes instead of gigabytes.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate></item><item><title>When Not to Fine-Tune: The Cheaper Things to Try First</title><link>https://engineers-musings.dev/blog/pytorch/phase-2/08-when-not-to-fine-tune/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-2/08-when-not-to-fine-tune/</guid><description>A beginner-friendly guide to when to fine-tune vs prompting vs RAG — why fine-tuning is usually the wrong first move, and the faster, cheaper options to reach for before it.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate></item><item><title>The Capstone: Fine-Tune a Model and Put It on the Hub</title><link>https://engineers-musings.dev/blog/pytorch/phase-2/09-capstone-fine-tune-and-ship/</link><guid isPermaLink="true">https://engineers-musings.dev/blog/pytorch/phase-2/09-capstone-fine-tune-and-ship/</guid><description>A beginner-friendly capstone — fine-tune a text classifier with the Trainer, then push to Hugging Face Hub and load it straight back to prove it&apos;s a real, shareable model.</description><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate></item></channel></rss>