<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dean’s blog</title><link>https://blog.thomasdurand.fr/</link><description>Recent content on Dean’s blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 17 Jan 2025 11:20:00 +0100</lastBuildDate><atom:link href="https://blog.thomasdurand.fr/index.xml" rel="self" type="application/rss+xml"/><item><title>Attending Apple Intelligence and App Intents workshop at Paris</title><link>https://blog.thomasdurand.fr/story/2025-01-17-attending-apple-workshop/</link><pubDate>Fri, 17 Jan 2025 11:20:00 +0100</pubDate><guid>https://blog.thomasdurand.fr/story/2025-01-17-attending-apple-workshop/</guid><description>&lt;p&gt;This Wednesday, Apple organized a workshop in Paris entitled &amp;ldquo;&lt;a href="https://developer.apple.com/events/view/8AS3847UT2/dashboard" target="_blank" rel="noopener noreferrer"&gt;Enhance your apps with Apple Intelligence and App Intents&lt;/a&gt;&amp;rdquo;.
An appealing title that immediately triggered my interest and pushed me to register.&lt;/p&gt;</description></item><item><title>Indie Diary #8 — Giving watchOS the love it deserves</title><link>https://blog.thomasdurand.fr/story/2024-08-15-indie-diary-8/</link><pubDate>Thu, 15 Aug 2024 15:00:00 +0200</pubDate><guid>https://blog.thomasdurand.fr/story/2024-08-15-indie-diary-8/</guid><description>&lt;p&gt;In the last few weeks, I&amp;rsquo;ve started a &amp;ldquo;big rebuilding&amp;rdquo; for Padlok. The goal is to refine the first user experience right after the app was installed, bring more SwiftUI and love to the overall UI, rework the brand identity, and bring both more modern code architecture approaches, as well as Swift 6 strict concurrency, to the codebase.&lt;/p&gt;</description></item><item><title>Attending WWDC24 recap at Apple Paris</title><link>https://blog.thomasdurand.fr/story/2024-06-26-wwdc24-recap/</link><pubDate>Thu, 27 Jun 2024 23:55:00 +0200</pubDate><guid>https://blog.thomasdurand.fr/story/2024-06-26-wwdc24-recap/</guid><description>&lt;p&gt;This Wednesday morning, I had the opportunity to attend the in-person recap of this year WWDC in Paris. I&amp;rsquo;m very happy to see those events flourishing all around the world, and specifically this year as I hadn&amp;rsquo;t as much time as I&amp;rsquo;d have liked during WWDC to really make the most of it.&lt;/p&gt;</description></item><item><title>Backend APIs: Constant evolution but tethered to the past</title><link>https://blog.thomasdurand.fr/story/2024-05-12-backend-api-tethered-to-the-past/</link><pubDate>Sun, 12 May 2024 10:45:00 +0200</pubDate><guid>https://blog.thomasdurand.fr/story/2024-05-12-backend-api-tethered-to-the-past/</guid><description>&lt;p&gt;Depending on the challenges you face while building your app, you might encounter the need to build your own backend logic and APIs to bring your app to life.&lt;/p&gt;
&lt;p&gt;As discussed in an &lt;a href="https://blog.thomasdurand.fr/story/2023-12-14-dont-ship-api-keys/"&gt;earlier story&lt;/a&gt;, backend is the best way to secure most of your API keys from stealing. But building your own backend comes with a hidden cost: evolution and compatibility. And this &lt;a href="https://www.threads.net/@mikaelacaron/post/C6zq2AVAxvD/" target="_blank" rel="noopener noreferrer"&gt;Thread from Mikaela&lt;/a&gt; confirms my suspicion that it is not a straightforward thing to solve.&lt;/p&gt;</description></item><item><title>Indie Diary #7 — Recharging batteries</title><link>https://blog.thomasdurand.fr/story/2024-05-01-indie-diary-7/</link><pubDate>Wed, 01 May 2024 12:00:00 +0200</pubDate><guid>https://blog.thomasdurand.fr/story/2024-05-01-indie-diary-7/</guid><description>&lt;p&gt;It&amp;rsquo;s been a while since my latest diary entry.
This entry will be both about &lt;a href="https://getomee.app" target="_blank" rel="noopener noreferrer"&gt;Omee&lt;/a&gt;, but also about why I wasn&amp;rsquo;t around the past month.&lt;/p&gt;</description></item><item><title>SwiftUI Previews-based architecture</title><link>https://blog.thomasdurand.fr/story/2024-03-15-preview-based-architecture/</link><pubDate>Fri, 15 Mar 2024 15:30:00 +0100</pubDate><guid>https://blog.thomasdurand.fr/story/2024-03-15-preview-based-architecture/</guid><description>&lt;p&gt;Like I said in my last &lt;a href="https://blog.thomasdurand.fr/story/2024-03-07-indie-diary-6/"&gt;Indie Diary&lt;/a&gt;, I knew when starting what would become Omee that I&amp;rsquo;d need a very flexible architecture for my app, built with SwiftUI previews in mind.&lt;/p&gt;
&lt;p&gt;SwiftUI Previews are a tremendous improvement for &lt;abbr title="Developer eXperience"&gt;DX&lt;/abbr&gt; since their introduction back in 2019. This time, I needed them more than ever, so I started experimenting with possible architectures for them.&lt;/p&gt;</description></item><item><title>Indie Diary #6 — Building a new app</title><link>https://blog.thomasdurand.fr/story/2024-03-07-indie-diary-6/</link><pubDate>Thu, 07 Mar 2024 20:00:00 +0100</pubDate><guid>https://blog.thomasdurand.fr/story/2024-03-07-indie-diary-6/</guid><description>&lt;p&gt;At the end of last December, I came with an idea.&lt;/p&gt;
&lt;p&gt;I use Siri a lot for my connected home. Turn on this room, turn off this other…
Sadly, I stopped counting when it didn&amp;rsquo;t worked as expected.&lt;/p&gt;
&lt;p&gt;What if I brought latest &lt;abbr title="Large Language Model"&gt;LLM&lt;/abbr&gt; with HomeKit together?&lt;/p&gt;</description></item><item><title>One-way bindings in SwiftUI</title><link>https://blog.thomasdurand.fr/story/2024-01-21-one-way-binding/</link><pubDate>Sun, 21 Jan 2024 19:00:00 +0100</pubDate><guid>https://blog.thomasdurand.fr/story/2024-01-21-one-way-binding/</guid><description>&lt;p&gt;Communication between views in SwiftUI can be tricky.
As explained in a previous story about &lt;a href="https://blog.thomasdurand.fr/story/2023-10-21-how-not-to-monitor-swiftui-state/" target="_blank" rel="noopener noreferrer"&gt;SwiftUI State monitoring&lt;/a&gt;, SwiftUI PropertyWrappers offer us a lot by hiding some complexity of managing the source of truth for our views. However, they can also bring confusion regarding state management and how to communicate between views.&lt;/p&gt;</description></item><item><title>Asynchronous SwiftUI buttons</title><link>https://blog.thomasdurand.fr/story/2024-01-14-asynchronous-swiftui-buttons/</link><pubDate>Sun, 14 Jan 2024 18:00:00 +0100</pubDate><guid>https://blog.thomasdurand.fr/story/2024-01-14-asynchronous-swiftui-buttons/</guid><description>&lt;p&gt;SwiftUI buttons are an example of what I would call an awesome and straight-to-the-point API: you describe a button and have a closure when it&amp;rsquo;s pressed!&lt;/p&gt;</description></item><item><title>Indie Diary #5 — A year in review.</title><link>https://blog.thomasdurand.fr/story/2023-12-31-indie-diary-5/</link><pubDate>Sun, 31 Dec 2023 15:30:00 +0100</pubDate><guid>https://blog.thomasdurand.fr/story/2023-12-31-indie-diary-5/</guid><description>&lt;p&gt;2023 comes to an end, and it was a very long year, full of stories, new habits, and new development as well! It&amp;rsquo;s time to wrap the year up, and summarize what succeeded, and what didn&amp;rsquo;t!&lt;/p&gt;</description></item><item><title>Don’t ship API keys!</title><link>https://blog.thomasdurand.fr/story/2023-12-14-dont-ship-api-keys/</link><pubDate>Thu, 14 Dec 2023 20:00:00 +0100</pubDate><guid>https://blog.thomasdurand.fr/story/2023-12-14-dont-ship-api-keys/</guid><description>&lt;p&gt;Not so long ago, I read about &lt;a href="https://augmentedcode.io/2023/11/27/using-on-demand-resources-for-securely-storing-api-keys-in-ios-apps/" target="_blank" rel="noopener noreferrer"&gt;this article&lt;/a&gt; from &lt;a href="https://mastodon.social/@toomasvahter" target="_blank" rel="noopener noreferrer"&gt;Thomas Vahter&lt;/a&gt; suggesting the distribution of API keys through on-demand resources. Although this approach is appealing, I suggest a different approach: avoid shipping your API keys at all costs!&lt;/p&gt;</description></item><item><title>Build a location sensitive iOS widget</title><link>https://blog.thomasdurand.fr/story/2023-12-10-location-sensitive-widget/</link><pubDate>Sun, 10 Dec 2023 22:00:00 +0100</pubDate><guid>https://blog.thomasdurand.fr/story/2023-12-10-location-sensitive-widget/</guid><description>&lt;p&gt;When I started working on Padlok widgets, my initial goal was clear: showing the current closest address using location. And if location based widget is supported since widgets exist, setting it up is not as straightforward as it seems.&lt;/p&gt;</description></item><item><title>Indie Diary #4 — SharePal launch.</title><link>https://blog.thomasdurand.fr/story/2023-11-01-indie-diary-4/</link><pubDate>Wed, 01 Nov 2023 18:00:00 +0100</pubDate><guid>https://blog.thomasdurand.fr/story/2023-11-01-indie-diary-4/</guid><description>&lt;p&gt;About a month ago, we launched our latest app, &lt;a href="https://getsharepal.app" target="_blank" rel="noopener noreferrer"&gt;SharePal&lt;/a&gt;. Since we launched &lt;a href="https://padlok.app" target="_blank" rel="noopener noreferrer"&gt;Padlok&lt;/a&gt; silently with low to no communication, this was our first &lt;em&gt;real&lt;/em&gt; indie launch. This will serve of manifesto so we can improve our communication skills over time.&lt;/p&gt;</description></item><item><title>How (not) to monitor SwiftUI @State</title><link>https://blog.thomasdurand.fr/story/2023-10-21-how-not-to-monitor-swiftui-state/</link><pubDate>Sat, 21 Oct 2023 14:00:00 +0200</pubDate><guid>https://blog.thomasdurand.fr/story/2023-10-21-how-not-to-monitor-swiftui-state/</guid><description>&lt;p&gt;While I was working on the first version of my latest app &lt;a href="https://getsharepal.app" target="_blank" rel="noopener noreferrer"&gt;SharePal&lt;/a&gt; ⚡️, I figured that I&amp;rsquo;d like to add haptic feedback for distinct action within the app.&lt;/p&gt;</description></item><item><title>Indie Diary #3 — Conferences, support, preparing a launch.</title><link>https://blog.thomasdurand.fr/story/2023-10-08-indie-diary-3/</link><pubDate>Sun, 08 Oct 2023 18:30:00 +0200</pubDate><guid>https://blog.thomasdurand.fr/story/2023-10-08-indie-diary-3/</guid><description>&lt;p&gt;Although &lt;a href="https://getsharepal.app" target="_blank" rel="noopener noreferrer"&gt;SharePal&lt;/a&gt; launched last Wednesday, this diary is not &lt;strong&gt;yet&lt;/strong&gt; about the launch itself, but everything that happened before, and oh boy, that was a very busy September.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s dive in!&lt;/p&gt;</description></item><item><title>The curious case of ShareLink with plain text strings</title><link>https://blog.thomasdurand.fr/story/2023-09-24-curious-case-of-sharelink/</link><pubDate>Sun, 24 Sep 2023 22:30:00 +0200</pubDate><guid>https://blog.thomasdurand.fr/story/2023-09-24-curious-case-of-sharelink/</guid><description>&lt;p&gt;I&amp;rsquo;m currently playing with ShareLink, a lot, for my &lt;strong&gt;&lt;a href="https://getsharepal.app" target="_blank" rel="noopener noreferrer"&gt;upcoming app SharePal&lt;/a&gt;&lt;/strong&gt;. And I couldn&amp;rsquo;t miss this &lt;em&gt;very strange&lt;/em&gt; and inconsistent behavior I got with it. Specifically when providing a string as an item.&lt;/p&gt;</description></item><item><title>Shake to undo in a SwiftUI app</title><link>https://blog.thomasdurand.fr/story/2023-09-04-shake-to-undo-swiftui/</link><pubDate>Tue, 05 Sep 2023 00:00:30 +0200</pubDate><guid>https://blog.thomasdurand.fr/story/2023-09-04-shake-to-undo-swiftui/</guid><description>&lt;p&gt;Shake to undo is a more than common &lt;abbr title="User Interface"&gt;UI&lt;/abbr&gt; on iOS. From Notes, Reminder and, well, mostly all apps, users expect it.&lt;/p&gt;
&lt;p&gt;This is why for my &lt;a href="https://getsharepal.app" target="_blank" rel="noopener noreferrer"&gt;latest app SharePal&lt;/a&gt;, I decided it would be a nice to have for when the user manages his data.&lt;/p&gt;</description></item><item><title>Indie Diary #2 — Padlok big release, and building Lego</title><link>https://blog.thomasdurand.fr/story/2023-08-20-indie-diary-2/</link><pubDate>Sun, 20 Aug 2023 13:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2023-08-20-indie-diary-2/</guid><description>&lt;p&gt;This month have been fairly busy in my Indie journey. I’ve completed, and shipped a major release for Padlok, including a bunch of new features, but we’ve also been planning with my fiance the &lt;strong&gt;next big thing&lt;/strong&gt;…&lt;/p&gt;</description></item><item><title>Renewing the blog (again!)</title><link>https://blog.thomasdurand.fr/story/2023-07-31-renewing-the-blog-again/</link><pubDate>Mon, 31 Jul 2023 11:30:00 +0200</pubDate><guid>https://blog.thomasdurand.fr/story/2023-07-31-renewing-the-blog-again/</guid><description>&lt;p&gt;It’s been 7 years!&lt;br&gt;
Seven years I’ve resisted the urge to rewrite my blog with new frameworks.&lt;/p&gt;
&lt;p&gt;But I did it anyway. Why? Because I needed to uniformize a little bit the website I’m maintaining. And because of the features it brings with it.&lt;/p&gt;</description></item><item><title>Indie Diary #1 — Indie App Sales</title><link>https://blog.thomasdurand.fr/story/2023-07-16-indie-diary-1/</link><pubDate>Sun, 16 Jul 2023 22:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2023-07-16-indie-diary-1/</guid><description>&lt;p&gt;I never really related about my indie apps journey until now in this blog. And that’s a miss because there is so much things to share!&lt;/p&gt;
&lt;p&gt;Today, I’ll take some time to discuss &lt;a href="https://padlok.app" target="_blank" rel="noopener noreferrer"&gt;Padlok&lt;/a&gt; participation to the &lt;a href="https://github.com/mattcorey/indie-dev-sales" target="_blank" rel="noopener noreferrer"&gt;Indie App Sales&lt;/a&gt; earlier this week, how it did, and what we learned in those two days!&lt;/p&gt;</description></item><item><title>Implement iOS 17’s new AirDrop experience</title><link>https://blog.thomasdurand.fr/story/2023-06-14-implement-new-airdrop-share/</link><pubDate>Wed, 14 Jun 2023 07:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2023-06-14-implement-new-airdrop-share/</guid><description>&lt;p&gt;One of the most “off radar” feature from this year WWDC probably is the new Share experience introduced by Apple with iOS 17.&lt;/p&gt;
&lt;p&gt;From sharing your info with NameDrop, to starting a new SharePlay, we can now just approach the top of our phones together to share some content.&lt;/p&gt;
&lt;p&gt;NameDrop is entirely system based, and SharePlay is documented with a few sessions videos from WWDC.
As for AirDrop, turns out the system leverage already existing API to make it work!&lt;/p&gt;
&lt;p class="updated"&gt;
 &lt;strong&gt;Updated on June 20, 2023&lt;/strong&gt;&lt;br&gt;
 Added the fact that iOS 17 NameDrop shipped with beta 2 only; and that initiating an AirDrop still need to open share sheet first for now.&lt;br&gt;
“Share sheet less” share experience was marked as later this year &lt;a href="https://www.apple.com/ios/ios-17-preview/" target="_blank" rel="noopener noreferrer"&gt;by Apple&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>SwiftUI backward-compatibility with Disfavored Overload</title><link>https://blog.thomasdurand.fr/story/2023-06-10-swiftui-retrocompatibility-with-disfavored-overload/</link><pubDate>Sat, 10 Jun 2023 20:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2023-06-10-swiftui-retrocompatibility-with-disfavored-overload/</guid><description>&lt;p&gt;Each year, new SwiftUI APIs are gladly arriving for our apps at WWDC.&lt;/p&gt;
&lt;p&gt;And each year, those new APIs are central to make your app a first class citizen on the newer OS, but as you know, it’s painful to maintain backward compatibility with older OSes when using newly introduced modifiers.&lt;/p&gt;</description></item><item><title>Leveraging SwiftUI for any app extension</title><link>https://blog.thomasdurand.fr/story/2023-03-31-swiftui-for-all-extensions/</link><pubDate>Fri, 31 Mar 2023 22:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2023-03-31-swiftui-for-all-extensions/</guid><description>&lt;p&gt;Since 2020, Widgets fully embrace SwiftUI by being a system extension fully based on them.&lt;/p&gt;
&lt;p&gt;Building SwiftUI views instead of UIKit views is advantageous, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Declarative syntax is easier than dealing with old school constraints&lt;/li&gt;
&lt;li&gt;Less code for equivalent user interfaces&lt;/li&gt;
&lt;li&gt;Live Preview to iterate faster over the development life cycle&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Automatic rsync deployment with Github Workflows</title><link>https://blog.thomasdurand.fr/story/2023-03-17-automatic-deployment-github-workflow/</link><pubDate>Fri, 17 Mar 2023 21:30:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2023-03-17-automatic-deployment-github-workflow/</guid><description>&lt;p class="updated"&gt;
 &lt;strong&gt;Updated on July 29, 2023&lt;/strong&gt;&lt;br&gt;
 Updated the fact that this blog is now built with Hugo instead of Jekyll
&lt;/p&gt;

&lt;p&gt;As an indie developer, I used to manually deploy my web applications to my VPS.
But the more and more subsystems and apps I tend to build, the more my server get crowded with new applications to deploy and maintain.&lt;/p&gt;</description></item><item><title>Struggling: you’re not alone, you’re learning!</title><link>https://blog.thomasdurand.fr/story/2023-03-03-struggling-is-learning/</link><pubDate>Fri, 03 Mar 2023 18:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2023-03-03-struggling-is-learning/</guid><description>&lt;h2 id="learning-ios"&gt;Learning iOS &lt;a href="#learning-ios"&gt;&lt;svg viewBox="0 0 16 16"&gt;&lt;use xlink:href="https://blog.thomasdurand.fr/img/icons.svg#u"&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I started iOS development in 2014, right when Swift language was announced at WWDC.
Starting iOS was something I wanted to do for a long time, but this announcement alone was exactly the push I needed to buy a Mac, and begin this &lt;em&gt;very&lt;/em&gt; long journey.&lt;/p&gt;
&lt;p&gt;It leaded me to a lot of small wins, but also to a lot of frustrations.
Learning something new is long, but it guided me to what I actually wanna do after my studies: iOS apps! It became a goal.&lt;/p&gt;</description></item><item><title>Building a share feature with privacy in mind</title><link>https://blog.thomasdurand.fr/story/2022-03-06-share-data-with-privacy-in-mind/</link><pubDate>Sun, 06 Mar 2022 20:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2022-03-06-share-data-with-privacy-in-mind/</guid><description>&lt;p&gt;One of the main reason for me to build &lt;a href="https://padlok.app" target="_blank" rel="noopener noreferrer"&gt;Padlok&lt;/a&gt; was data management. I didn’t want anyone to retrieve my friends addresses and codes. As with any contact related infos, I may have trust issues about them.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;And so should you!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That’s also why Padlok development &lt;strong&gt;is focused around data privacy and security&lt;/strong&gt;. Data is stored on device only, an synced with iCloud. And early share feature was simply generating a small text to be shared. But this experience was not enough.&lt;/p&gt;</description></item><item><title>Build a Vapor app on Debian 11</title><link>https://blog.thomasdurand.fr/story/2022-01-25-vapor-on-debian-11-vps/</link><pubDate>Tue, 25 Jan 2022 12:30:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2022-01-25-vapor-on-debian-11-vps/</guid><description>&lt;p class="outdated"&gt;&lt;em&gt;This story might be outdated:&lt;/em&gt;&lt;br&gt;For now, I’ve stopped using Vapor on my VPS for multiple reasons.&lt;/p&gt;
&lt;p&gt;Although Swift and Vapor is not built to actually run on Debian, but for Ubuntu, let’s say that both distributions share enough so that running Vapor applications on it is not impossible.&lt;/p&gt;
&lt;p&gt;Since it’s not actually a &lt;em&gt;supported&lt;/em&gt; solution, please note that maybe some features or things might not work properly. But it worked for my implementation of &lt;a href="https://padlok.app" target="_blank" rel="noopener noreferrer"&gt;Padlok&lt;/a&gt; API.&lt;/p&gt;
&lt;p&gt;You’ll be able to learn more about my &lt;a href="https://padlok.app" target="_blank" rel="noopener noreferrer"&gt;Padlok&lt;/a&gt; project and implementations in a later story.&lt;/p&gt;</description></item><item><title>Safari theme color and notch support</title><link>https://blog.thomasdurand.fr/story/2021-06-27-theme-color-safe-area-safari-15/</link><pubDate>Sun, 27 Jun 2021 20:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2021-06-27-theme-color-safe-area-safari-15/</guid><description>&lt;p class="outdated"&gt;&lt;em&gt;This story might be outdated:&lt;/em&gt;&lt;br&gt;Although it uses the same principles, this blog now uses &lt;a href="https://github.com/mvllow/tailwindcss-safe-area" target="_blank" rel="noopener noreferrer"&gt;TailwindCSS Safe Area extension&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Recently, Apple released its new beta software during  WWDC21; and with it, the very new Safari 15.&lt;/p&gt;
&lt;p&gt;This new Safari requires some improvements for each websites to embrace the new design, with some attention to the new header that colors itself to feel like it’s part of the site itself, and on iOS 15 for iPhone, the new bottom bar that requires safe-area to make sure nothing important gets hidden.&lt;/p&gt;</description></item><item><title>Target iOS beta while using regular Xcode.app</title><link>https://blog.thomasdurand.fr/story/2021-02-12-beta-software-build-on-release-xcode/</link><pubDate>Fri, 12 Feb 2021 09:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2021-02-12-beta-software-build-on-release-xcode/</guid><description>&lt;p class="outdated"&gt;&lt;em&gt;This story might be outdated:&lt;/em&gt;&lt;br&gt;I haven’t tested this technique for a while, so I’m not sure it’s working for latest software. If it still work, tell me on Mastodon!&lt;/p&gt;
&lt;p&gt;One of the most frustrating thing that could happen when developing with Xcode is the fact that using release version of Xcode can’t build an App for a device that is currently running a beta software.
You’ll have to open Xcode-Beta in order to build your current work on your device, and eventually get back on Xcode to re-gain stability.&lt;/p&gt;
&lt;p&gt;But there is another very simple way. Using symlink can save you time by building on your Beta device directly from non-beta Xcode!&lt;/p&gt;</description></item><item><title>Generating lottery numbers using CryptoKit</title><link>https://blog.thomasdurand.fr/story/2019-06-25-generating-lottery-numbers-with-cryptokit/</link><pubDate>Tue, 25 Jun 2019 18:30:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2019-06-25-generating-lottery-numbers-with-cryptokit/</guid><description>&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Because we can!&lt;/p&gt;
&lt;p&gt;WWDC19 announcements came with CryptoKit; a new framework designed for making cryptography easy.&lt;/p&gt;
&lt;p&gt;Today, I want to show how to use CryptoKit to generate numbers.&lt;/p&gt;</description></item><item><title>A (long) week at  WWDC19</title><link>https://blog.thomasdurand.fr/story/2019-06-07-a-long-week-at-wwdc19/</link><pubDate>Fri, 07 Jun 2019 17:30:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2019-06-07-a-long-week-at-wwdc19/</guid><description>&lt;p&gt;What a long week it’s been!&lt;/p&gt;
&lt;p&gt;My first &lt;a href="https://developer.apple.com/wwdc19/" target="_blank" rel="noopener noreferrer"&gt; WWDC&lt;/a&gt; is now over, and there’s a lot to say. I’ve learnt a lot, met incredible people, and corrected a lot of bugs with the help of fellows Apple engineers.&lt;/p&gt;</description></item><item><title>IPv6 setup on Debian 9 Stretch</title><link>https://blog.thomasdurand.fr/story/2019-04-14-ipv6-setup-on-ovh-vps/</link><pubDate>Sun, 14 Apr 2019 12:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2019-04-14-ipv6-setup-on-ovh-vps/</guid><description>&lt;p&gt;IPv6 isn’t new at all, but it’s stunning to see how much the web isn’t ready for it at all!&lt;/p&gt;
&lt;p&gt;But that can change, and making your web server compatible with it is a great start!&lt;/p&gt;</description></item><item><title>Attending  WWDC19</title><link>https://blog.thomasdurand.fr/story/2019-04-01-attending-wwdc19/</link><pubDate>Mon, 01 Apr 2019 12:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2019-04-01-attending-wwdc19/</guid><description>&lt;p&gt;(This is not an April fool!)&lt;/p&gt;
&lt;p&gt;It’s with great pleasure that I will attend this year &lt;a href="https://developer.apple.com/wwdc19/" target="_blank" rel="noopener noreferrer"&gt; WWDC&lt;/a&gt;.&lt;br&gt;
It’ll be my first WWDC from the inside, and I’m super excited about it already!&lt;/p&gt;</description></item><item><title>Embrace macOS’s dark mode with Safari</title><link>https://blog.thomasdurand.fr/story/2019-03-27-embrase-macos-dark-mode-using-css/</link><pubDate>Wed, 27 Mar 2019 12:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2019-03-27-embrase-macos-dark-mode-using-css/</guid><description>&lt;p class="outdated"&gt;&lt;em&gt;This story might be outdated:&lt;/em&gt;&lt;br&gt;This blog now uses &lt;a href="https://tailwindcss.com/docs/dark-mode" target="_blank" rel="noopener noreferrer"&gt;tailwindCSS&lt;/a&gt; to handle dark mode; the screenshots also are a bit outdated.&lt;/p&gt;
&lt;p&gt;This last Monday (March 25, 2019), Apple released the last version of macOS 10.14.4, along with Safari 12.1.
This last version of Safari expose a CSS api using the &lt;code&gt;@media&lt;/code&gt; tag allowing you to support a &lt;strong&gt;Dark theme&lt;/strong&gt; for your site, working along with macOS’s dark mode.&lt;/p&gt;</description></item><item><title>Keep PHP up to date on Debian 9 Stretch</title><link>https://blog.thomasdurand.fr/story/2019-03-20-keep-php-updated-on-debian-9/</link><pubDate>Wed, 20 Mar 2019 12:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2019-03-20-keep-php-updated-on-debian-9/</guid><description>&lt;p class="outdated"&gt;&lt;em&gt;This story might be outdated:&lt;/em&gt;&lt;br&gt;PHP 7.x is now end-of-life. You might wanna update to PHP 8.x (and also update to a newer Debian?)&lt;/p&gt;
&lt;p&gt;When installing PHP on Debian 9, the default version is &lt;strong&gt;PHP 7.0&lt;/strong&gt;, that have been declared &lt;em&gt;End-of-life&lt;/em&gt; &lt;a href="https://secure.php.net/supported-versions.php" target="_blank" rel="noopener noreferrer"&gt;since January 10, 2019&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;PHP 7.0 will not go further version &lt;em&gt;7.0.33&lt;/em&gt; on Debian 9.&lt;/p&gt;
&lt;h2 id="adding-a-new-repository-for-newer-versions-of-php"&gt;Adding a new repository for newer versions of PHP &lt;a href="#adding-a-new-repository-for-newer-versions-of-php"&gt;&lt;svg viewBox="0 0 16 16"&gt;&lt;use xlink:href="https://blog.thomasdurand.fr/img/icons.svg#u"&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;First, this repository uses &lt;abbr title="Advanced Packaging Tool"&gt;APT&lt;/abbr&gt; &lt;em&gt;transport over HTTPS&lt;/em&gt;. This is basically getting packages over a &lt;abbr title="Transport Layer Security"&gt;TLS&lt;/abbr&gt; connection.&lt;br&gt;
Let’s install the necessary packages, if you do not have them already:&lt;/p&gt;</description></item><item><title>Build a privacy-safe home network using Pi-hole</title><link>https://blog.thomasdurand.fr/story/2018-10-20-privacy-at-home-with-pi-hole/</link><pubDate>Sat, 20 Oct 2018 12:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2018-10-20-privacy-at-home-with-pi-hole/</guid><description>&lt;p&gt;Data privacy, and the usage of collected data have now became a controversial subject. People tends to acknowledge more and more the importance of keeping private data; and private life … well … private.&lt;/p&gt;
&lt;p&gt;In this tutorial, you’ll see what solution I came around keeping my own privacy at my home network.&lt;/p&gt;</description></item><item><title>How anyone could feed my cat</title><link>https://blog.thomasdurand.fr/story/2018-01-31-how-anyone-could-feed-my-cat/</link><pubDate>Wed, 31 Jan 2018 12:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2018-01-31-how-anyone-could-feed-my-cat/</guid><description>&lt;p&gt;As a software engineer for &lt;a href="https://www.dilitrust.com/en/" target="_blank" rel="noopener noreferrer"&gt;DiliTrust&lt;/a&gt;, I think software security as a primary feature for any kind of product or software.
Every time we heard a story about any kind of security flaw, we take it seriously: how is that possible? Am we directly or indirectly impacted?&lt;/p&gt;
&lt;p&gt;Well, I guess I wasn’t yet prepared for my last discovery.&lt;/p&gt;</description></item><item><title>Avoid 5 common mistakes with AES encryption</title><link>https://blog.thomasdurand.fr/story/2017-07-12-aes-encryption-good-practice-with-swift/</link><pubDate>Wed, 12 Jul 2017 12:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2017-07-12-aes-encryption-good-practice-with-swift/</guid><description>&lt;p class="outdated"&gt;&lt;em&gt;This story might be outdated:&lt;/em&gt;&lt;br&gt;This code was written for &lt;strong&gt;Swift 3&lt;/strong&gt; with &lt;strong&gt;Xcode 8.1&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;With libraries like &lt;a href="https://github.com/krzyzanowskim/CryptoSwift" target="_blank" rel="noopener noreferrer"&gt;CryptoSwift&lt;/a&gt;, it&amp;rsquo;s easier and easier to
use encryption in your code. But there are also some common mistakes not to fall
into when using cryptography!&lt;/p&gt;
&lt;p&gt;The rest of this article will use CryptoSwift as an example.&lt;/p&gt;</description></item><item><title>iOS disclosure indicators done right</title><link>https://blog.thomasdurand.fr/story/2016-08-12-ios-disclosure-indicator-done-right/</link><pubDate>Fri, 12 Aug 2016 12:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2016-08-12-ios-disclosure-indicator-done-right/</guid><description>&lt;p class="outdated"&gt;&lt;em&gt;This story might be outdated:&lt;/em&gt;&lt;br&gt;This code was last updated for &lt;strong&gt;Swift 3&lt;/strong&gt; with &lt;strong&gt;Xcode 8.1&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Disclosure indicators are very common in an iOS application, and they allow the
user to know that if they select a cell, they will be pushed somewhere else.
You can also read &lt;a href="https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TableView_iPhone/TableViewStyles/TableViewCharacteristics.html" target="_blank" rel="noopener noreferrer"&gt;Apple documentation&lt;/a&gt; about them.&lt;/p&gt;</description></item><item><title>iOS basics: UITableView setup with Swift 3</title><link>https://blog.thomasdurand.fr/story/2016-08-07-ios-basics-tableview-setup/</link><pubDate>Sun, 07 Aug 2016 12:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2016-08-07-ios-basics-tableview-setup/</guid><description>&lt;p class="outdated"&gt;&lt;em&gt;This story might be outdated:&lt;/em&gt;&lt;br&gt;This code was last updated for &lt;strong&gt;Swift 3&lt;/strong&gt; with &lt;strong&gt;Xcode 8.1&lt;/strong&gt;. This code would be today either made using SwiftUI, or using &lt;code&gt;UITableViewDiffableDataSource&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now that I begin to feel very familiar with &lt;em&gt;Swift&lt;/em&gt; syntax and &lt;em&gt;iOS&lt;/em&gt; app design; and that I am totally convinced by how easy it is to do swift code, I want to share with you how to use it to make one of the more common &lt;abbr title="User Interface"&gt;UI&lt;/abbr&gt; and &lt;abbr title="User eXperience"&gt;UX&lt;/abbr&gt; of &lt;em&gt;iOS&lt;/em&gt;: a TableView presentation for &lt;em&gt;iOS&lt;/em&gt; !&lt;/p&gt;
&lt;p&gt;This is the first article about &lt;em&gt;iOS&lt;/em&gt; development on this blog and I really hope I will manage to write more.&lt;/p&gt;</description></item><item><title>Renewing the blog</title><link>https://blog.thomasdurand.fr/story/2016-08-06-renewing-the-blog/</link><pubDate>Sat, 06 Aug 2016 12:00:00 +0000</pubDate><guid>https://blog.thomasdurand.fr/story/2016-08-06-renewing-the-blog/</guid><description>&lt;p class="outdated"&gt;&lt;em&gt;This story might be outdated:&lt;/em&gt;&lt;br&gt;This blog now uses Hugo, see &lt;a href="https://blog.thomasdurand.fr/story/2023-07-31-renewing-the-blog-again/" target="_blank" rel="noopener noreferrer"&gt;Renewing the blog (again!)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For the people who knew the blog from before 2016, it’s completely gone.&lt;/p&gt;
&lt;h2 id="why-"&gt;Why ? &lt;a href="#why-"&gt;&lt;svg viewBox="0 0 16 16"&gt;&lt;use xlink:href="https://blog.thomasdurand.fr/img/icons.svg#u"&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Because I previously used Dotclear, and it didn’t really fit my needs: it was too complex compared with my real needs.
Plus, there were an issue with the Dotclear’s comment system, it was polluted by bots.
So I decided to retire it.&lt;/p&gt;</description></item></channel></rss>