<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>slekens.dev — Blog</title>
    <link>https://slekens.dev/en/blog/</link>
    <atom:link href="https://slekens.dev/en/rss.xml" rel="self" type="application/rss+xml" />
    <description>iOS and macOS development with Swift, by Slekens.</description>
    <language>en</language>
    <lastBuildDate>Tue, 23 Jun 2026 16:27:42 GMT</lastBuildDate>
    <item>
      <title>WWDC 2026 for devs (part 4): visionOS, Siri's shift, and the rest of the ecosystem</title>
      <link>https://slekens.dev/en/blog/wwdc-2026-part-4-for-devs/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/wwdc-2026-part-4-for-devs/</guid>
      <pubDate>Sun, 21 Jun 2026 10:00:00 GMT</pubDate>
      <description>Part four of the WWDC 2026 developer recap: visionOS 27 and RealityKit, App Intents as Siri's new contract, StoreKit updates, and the automatic adoption of Liquid Glass.</description>
      <category>WWDC</category>
      <category>visionOS</category>
      <category>App Intents</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Narcisse 1.2.0 is out</title>
      <link>https://slekens.dev/en/blog/narcisse-1-2-0-available/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/narcisse-1-2-0-available/</guid>
      <pubDate>Wed, 17 Jun 2026 18:00:00 GMT</pubDate>
      <description>Narcisse 1.2.0 is here: a full visual redesign, skin undertone and 9 hair colors, an «I own it» wishlist, a free widget, and dark mode.</description>
      <category>Apps</category>
      <category>Narcisse</category>
      <category>iOS</category>
    </item>
    <item>
      <title>WWDC 2026 for devs (part 3): Xcode Agent Skills and the official SwiftUI APIs</title>
      <link>https://slekens.dev/en/blog/wwdc-2026-part-3-for-devs/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/wwdc-2026-part-3-for-devs/</guid>
      <pubDate>Sun, 14 Jun 2026 15:00:00 GMT</pubDate>
      <description>Part three of the WWDC 2026 developer recap: the Agent Skills Xcode 27 ships with (and how to build your own), plus the official SwiftUI API names from Apple's guide.</description>
      <category>WWDC</category>
      <category>Xcode</category>
      <category>SwiftUI</category>
      <category>Swift</category>
    </item>
    <item>
      <title>WWDC 2026 for devs (part 2): AI in apps, agents, and more SwiftUI</title>
      <link>https://slekens.dev/en/blog/wwdc-2026-part-2-for-devs/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/wwdc-2026-part-2-for-devs/</guid>
      <pubDate>Sun, 14 Jun 2026 09:00:00 GMT</pubDate>
      <description>Part two of the WWDC 2026 developer recap: the Foundation Models LanguageModel protocol, Xcode 27's dual-engine agents, and more SwiftUI/SwiftData details.</description>
      <category>WWDC</category>
      <category>Swift</category>
      <category>SwiftUI</category>
      <category>AI</category>
    </item>
    <item>
      <title>WWDC 2026 for developers: what we know so far</title>
      <link>https://slekens.dev/en/blog/wwdc-2026-news-for-devs/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/wwdc-2026-news-for-devs/</guid>
      <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
      <description>A dev-focused recap of WWDC 2026: what's new in SwiftUI, Swift 6.4, Xcode 27, and the new AI APIs (App Intents and Foundation Models). Preliminary info.</description>
      <category>WWDC</category>
      <category>Swift</category>
      <category>SwiftUI</category>
      <category>Xcode</category>
    </item>
    <item>
      <title>Building a Pokédex on iOS — Part 10: CI/CD with GitHub Actions</title>
      <link>https://slekens.dev/en/blog/poketracker-10-cicd-en/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/poketracker-10-cicd-en/</guid>
      <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
      <description>Final part of the PokeTracker series: we set up a CI/CD pipeline with GitHub Actions that builds and tests the app on every push. Plus the repository.</description>
      <category>Swift</category>
      <category>CI/CD</category>
      <category>GitHub Actions</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Building a Pokédex on iOS — Part 9: Unit testing with Swift Testing</title>
      <link>https://slekens.dev/en/blog/poketracker-09-testing-en/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/poketracker-09-testing-en/</guid>
      <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
      <description>Part 9 of the PokeTracker series: we write unit tests with the new Swift Testing framework using Mocks, @Suite, and #expect.</description>
      <category>Swift</category>
      <category>Testing</category>
      <category>Unit Tests</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Building a Pokédex on iOS — Part 8: ViewModel with @Observable</title>
      <link>https://slekens.dev/en/blog/poketracker-08-viewmodel-en/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/poketracker-08-viewmodel-en/</guid>
      <pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate>
      <description>Part 8 of the PokeTracker series: we build PokemonListViewModel with the new @Observable macro, handling pagination, search, filters, and the cache-first logic.</description>
      <category>Swift</category>
      <category>SwiftUI</category>
      <category>Observable</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Building a Pokédex on iOS — Part 7: Image cache</title>
      <link>https://slekens.dev/en/blog/poketracker-07-image-cache-en/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/poketracker-07-image-cache-en/</guid>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
      <description>Part 7 of the PokeTracker series: we implement a two-level image cache system — NSCache in memory and FileManager on disk — using Swift actors.</description>
      <category>Swift</category>
      <category>Cache</category>
      <category>actor</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Building a Pokédex on iOS — Part 6: Offline persistence with SwiftData</title>
      <link>https://slekens.dev/en/blog/poketracker-06-swiftdata-en/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/poketracker-06-swiftdata-en/</guid>
      <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
      <description>Part 6 of the PokeTracker series: we implement the @Model models, the data service, and the cache-first strategy so the app works without a network connection.</description>
      <category>Swift</category>
      <category>SwiftData</category>
      <category>Persistencia</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Building a Pokédex on iOS — Part 5: Domain models and Use Cases</title>
      <link>https://slekens.dev/en/blog/poketracker-05-domain/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/poketracker-05-domain/</guid>
      <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
      <description>Part 5 of the PokeTracker series: we create the app's own models and the Use Cases that convert DTOs into data ready for the interface.</description>
      <category>Swift</category>
      <category>Arquitectura</category>
      <category>Domain</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Building a Pokédex on iOS — Part 4: Repository Pattern</title>
      <link>https://slekens.dev/en/blog/poketracker-04-repository-en/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/poketracker-04-repository-en/</guid>
      <pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate>
      <description>Part 4 of the PokeTracker series: what the Repository Pattern is, why we use it, and how we implement PokemonRepository.</description>
      <category>Swift</category>
      <category>Arquitectura</category>
      <category>Repository</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Building a Pokédex on iOS — Part 3: DTOs and the API contract</title>
      <link>https://slekens.dev/en/blog/poketracker-03-dtos-en/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/poketracker-03-dtos-en/</guid>
      <pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate>
      <description>Part 3 of the PokeTracker series: what DTOs are, why we don't use API data directly, and how we define the contract with PokéAPI.</description>
      <category>Swift</category>
      <category>DTOs</category>
      <category>Networking</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Building a Pokédex on iOS — Part 2: Network layer</title>
      <link>https://slekens.dev/en/blog/poketracker-02-network-layer/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/poketracker-02-network-layer/</guid>
      <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
      <description>Part 2 of the PokeTracker series: we build the HTTP client, define endpoints with an enum, and create typed network errors.</description>
      <category>Swift</category>
      <category>Networking</category>
      <category>async/await</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Building a Pokédex on iOS — Part 1: Project structure</title>
      <link>https://slekens.dev/en/blog/poketracker-01-architecture/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/poketracker-01-architecture/</guid>
      <pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate>
      <description>First post in the PokeTracker series: what we're building, how we structure the project, and why we organize the code into layers.</description>
      <category>Swift</category>
      <category>SwiftUI</category>
      <category>Arquitectura</category>
      <category>iOS</category>
    </item>
    <item>
      <title>Conditional compilation in Swift</title>
      <link>https://slekens.dev/en/blog/conditional-compilation-in-swift/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/conditional-compilation-in-swift/</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>What #if is in Swift, how it differs from a regular if, and when to use it: DEBUG, platforms, simulator, custom flags, and the difference with assert().</description>
      <category>Swift</category>
      <category>macOS</category>
      <category>Xcode</category>
    </item>
    <item>
      <title>Generics in Swift</title>
      <link>https://slekens.dev/en/blog/generics-in-swift/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/generics-in-swift/</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>What generics are, how to write them, when to constrain types with Comparable or Equatable, and why it's normal to arrive at them after writing repetitive code first.</description>
      <category>Swift</category>
      <category>macOS</category>
    </item>
    <item>
      <title>@propertyWrapper in Swift: beyond UserDefaults</title>
      <link>https://slekens.dev/en/blog/property-wrappers-in-swift/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/property-wrappers-in-swift/</guid>
      <pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate>
      <description>What property wrappers are, how to build one from scratch, and when to use them — with practical examples: @Clamped, @Trimmed, and projectedValue.</description>
      <category>Swift</category>
      <category>macOS</category>
    </item>
    <item>
      <title>Feature flags with UserDefaults on macOS</title>
      <link>https://slekens.dev/en/blog/feature-flags-with-userdefaults/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/feature-flags-with-userdefaults/</guid>
      <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
      <description>How to use UserDefaults as a local feature flag system on macOS: a typed @propertyWrapper, clean reset, and an automatic active-flag log on launch.</description>
      <category>Swift</category>
      <category>macOS</category>
      <category>Xcode</category>
    </item>
    <item>
      <title>Narcisse is now live</title>
      <link>https://slekens.dev/en/blog/narcisse-launch/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/narcisse-launch/</guid>
      <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
      <description>Narcisse is now on the App Store. The app my wife and I built together to solve a real problem: generating a coordinated look based on your personal color season.</description>
      <category>apps</category>
      <category>iOS</category>
      <category>Narcisse</category>
    </item>
    <item>
      <title>AlgoViewer is now available</title>
      <link>https://slekens.dev/en/blog/algoviewer-launch/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/algoviewer-launch/</guid>
      <pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate>
      <description>AlgoViewer is live on the App Store. An app to visualize algorithms and data structures step by step, with code examples in Swift, Python and Java.</description>
      <category>apps</category>
      <category>iOS</category>
      <category>AlgoViewer</category>
    </item>
    <item>
      <title>FigureDex: Your Amiibo Collection, Finally Organized</title>
      <link>https://slekens.dev/en/blog/figuredex-amiibo-collection/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/figuredex-amiibo-collection/</guid>
      <pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate>
      <description>FigureDex is on the App Store. A native catalog for Amiibo collectors with status tracking, series stats and iCloud sync.</description>
      <category>apps</category>
      <category>iOS</category>
      <category>FigureDex</category>
    </item>
    <item>
      <title>Basic operators</title>
      <link>https://slekens.dev/en/blog/basic-operators/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/basic-operators/</guid>
      <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
      <description>Arithmetic, comparison, logical, ternary, range and the nil-coalescing operator in modern Swift. Second post in the Swift Basics series.</description>
      <category>Swift</category>
      <category>The Basics</category>
    </item>
    <item>
      <title>struct — value type</title>
      <link>https://slekens.dev/en/blog/classes-and-structures/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/classes-and-structures/</guid>
      <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
      <description>Classes vs structs in modern Swift: value types vs reference types, properties, methods, initializers, inheritance and when to use each.</description>
      <category>Swift</category>
      <category>The Basics</category>
    </item>
    <item>
      <title>if / else if / else</title>
      <link>https://slekens.dev/en/blog/control-flow/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/control-flow/</guid>
      <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
      <description>Control flow in modern Swift: if/else, switch with pattern matching, for-in loops, while, and the guard statement that rewrites how you structure functions.</description>
      <category>Swift</category>
      <category>The Basics</category>
    </item>
    <item>
      <title>Basic function declaration</title>
      <link>https://slekens.dev/en/blog/functions/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/functions/</guid>
      <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
      <description>Functions in modern Swift: parameter labels, default values, multiple return values with tuples, variadic parameters and closures.</description>
      <category>Swift</category>
      <category>The Basics</category>
    </item>
    <item>
      <title>What is an Optional?</title>
      <link>https://slekens.dev/en/blog/optionals/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/optionals/</guid>
      <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
      <description>Optionals are Swift's most distinctive concept and why Swift apps tend to crash less. Learn if let, guard let, optional chaining and nil-coalescing.</description>
      <category>Swift</category>
      <category>The Basics</category>
    </item>
    <item>
      <title>What is a Swift Playground?</title>
      <link>https://slekens.dev/en/blog/swift-playgrounds-with-xcode/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/swift-playgrounds-with-xcode/</guid>
      <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
      <description>Swift Playgrounds let you write and run Swift code instantly, see results in real time, and experiment without creating a full project. Here's how to use them.</description>
      <category>Swift</category>
      <category>Tools</category>
    </item>
    <item>
      <title>What are variables and constants?</title>
      <link>https://slekens.dev/en/blog/variables-and-constants/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/variables-and-constants/</guid>
      <pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate>
      <description>Variables, constants, type inference, tuples and collections in modern Swift. The first post in the Swift Basics series.</description>
      <category>Swift</category>
      <category>The Basics</category>
    </item>
    <item>
      <title>How to expose an HTML interface in a macOS app</title>
      <link>https://slekens.dev/en/blog/exposing-html-interface-in-macos/</link>
      <guid isPermaLink="true">https://slekens.dev/en/blog/exposing-html-interface-in-macos/</guid>
      <pubDate>Fri, 04 Jul 2025 00:00:00 GMT</pubDate>
      <description>FlyingFox + swift-html: how to embed an HTTP server in a macOS app to serve web interfaces from the Bundle, without heavy frameworks.</description>
      <category>Swift</category>
      <category>macOS</category>
      <category>FlyingFox</category>
    </item>
  </channel>
</rss>