<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Grant Isom</title>
    <description>👋 Hi, I&apos;m Grant.
</description>
    <link>https://grantisom.com/</link>
    <atom:link href="https://grantisom.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 24 Feb 2026 17:04:46 +0000</pubDate>
    <lastBuildDate>Tue, 24 Feb 2026 17:04:46 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>Bringing ListWithMe Back to Life</title>
        <description>&lt;p&gt;Back in 2019, I built &lt;a href=&quot;/listwithme/&quot;&gt;ListWithMe&lt;/a&gt;—a simple iMessage app for creating shared shopping lists. My wife and I used it constantly for grocery runs and weekend errands. It was nothing fancy, but it solved a real problem: quickly creating a list that both of us could see and edit in real-time, right inside our conversation.&lt;/p&gt;

&lt;p&gt;Then life happened. The app sat untouched as iOS evolved, and eventually Apple removed it from the App Store. I always meant to update it, but between work and other projects, it kept getting pushed to “someday.”&lt;/p&gt;

&lt;p&gt;Well, someday finally arrived.&lt;/p&gt;

&lt;h2 id=&quot;a-complete-rebuild&quot;&gt;A Complete Rebuild&lt;/h2&gt;

&lt;p&gt;Rather than patch the old UIKit codebase, I decided to rebuild ListWithMe from scratch using SwiftUI. The original app was functional but minimal—just lists and items. The new version keeps that simplicity while adding features I’ve wanted for years:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Input&lt;/strong&gt; — Type “3 apples” or “milk x2” and the app automatically parses the quantity. It sounds small, but it makes adding items so much faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Priorities &amp;amp; Due Dates&lt;/strong&gt; — Not everything on a shopping list is equal. Now you can mark items as high priority or set a due date for time-sensitive errands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Categories&lt;/strong&gt; — Group items by aisle or type. When you’re navigating a store, having items organized by Produce, Dairy, and Frozen makes the trip faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Activity Feed&lt;/strong&gt; — See who added or completed items. When you’re shopping together but apart, it’s helpful to know what your partner just grabbed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Batch Actions&lt;/strong&gt; — Select multiple items to complete or delete at once. Clear all completed items with a single tap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search &amp;amp; Sort&lt;/strong&gt; — Find items quickly in long lists. Sort by name, category, priority, due date, or drag to reorder manually.&lt;/p&gt;

&lt;h2 id=&quot;the-technical-side&quot;&gt;The Technical Side&lt;/h2&gt;

&lt;p&gt;The rebuild gave me a chance to work with some iOS technologies I hadn’t used in personal projects:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;SwiftUI&lt;/strong&gt; with the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@Observable&lt;/code&gt; macro (iOS 17+)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Core Data&lt;/strong&gt; with CloudKit sync for seamless multi-device support&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Modern Swift&lt;/strong&gt; patterns and concurrency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The codebase is &lt;a href=&quot;https://github.com/glisom/ListWithMe&quot;&gt;open source on GitHub&lt;/a&gt; if you want to poke around. It’s a good example of a relatively simple but complete SwiftUI app with persistence.&lt;/p&gt;

&lt;h2 id=&quot;why-imessage-apps-still-matter&quot;&gt;Why iMessage Apps Still Matter&lt;/h2&gt;

&lt;p&gt;When I first released ListWithMe, the biggest complaint was discoverability. Users would download it, then struggle to find where it went—because iMessage apps don’t appear on your home screen. That’s still true today, and it’s still the biggest friction point.&lt;/p&gt;

&lt;p&gt;But I think there’s something valuable about apps that live inside your conversations. You don’t need to context-switch. You don’t need to share links or coordinate which app to use. If you’re already texting someone, the list is right there.&lt;/p&gt;

&lt;p&gt;For my wife and me, it’s become invisible infrastructure. We don’t think about it—we just have a shared list that updates as we shop.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next&lt;/h2&gt;

&lt;p&gt;ListWithMe 2.0 is available now on the &lt;a href=&quot;#&quot;&gt;App Store&lt;/a&gt;. I’m planning to keep iterating based on feedback. A few things I’m considering:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Recurring lists (weekly grocery templates)&lt;/li&gt;
  &lt;li&gt;Siri integration&lt;/li&gt;
  &lt;li&gt;Widgets for quick access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it out, I’d love to hear what you think. You can find me on &lt;a href=&quot;https://github.com/glisom&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here’s to shared lists and fewer forgotten items.&lt;/p&gt;
</description>
        <pubDate>Tue, 24 Feb 2026 00:00:00 +0000</pubDate>
        <link>https://grantisom.com/2026/02/24/listwithme-returns.html</link>
        <guid isPermaLink="true">https://grantisom.com/2026/02/24/listwithme-returns.html</guid>
        
        <category>ios</category>
        
        <category>imessages</category>
        
        <category>xcode</category>
        
        <category>swift</category>
        
        <category>swiftui</category>
        
        
      </item>
    
      <item>
        <title>HealthQL Now Supports React Native</title>
        <description>&lt;p&gt;HealthQL v1.1.0 adds full React Native and Expo support. You can now query Apple HealthKit using the same SQL syntax from JavaScript/TypeScript apps.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/glisom/HealthQL&quot;&gt;GitHub&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://glisom.github.io/HealthQL&quot;&gt;Documentation&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://www.npmjs.com/package/react-native-healthql&quot;&gt;npm&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;quick-example&quot;&gt;Quick Example&lt;/h3&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HealthQL&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;react-native-healthql&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Request authorization&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HealthQL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;requestAuthorization&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;heart_rate&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;sleep_analysis&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Query with SQL&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;results&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HealthQL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`
  SELECT avg(value) FROM heart_rate
  WHERE date &amp;gt; today() - 7d
  GROUP BY day
`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Same SQL syntax as the Swift version—the React Native package wraps the native Swift implementation, so you get real HealthKit queries, not mock data.&lt;/p&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;react-native-healthql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Add the Expo config plugin to your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app.json&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;expo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;plugins&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;react-native-healthql&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;healthShareUsageDescription&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Read health data to display insights&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then rebuild:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npx expo prebuild &lt;span class=&quot;nt&quot;&gt;--clean&lt;/span&gt;
npx expo run:ios
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;whats-included&quot;&gt;What’s Included&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Full TypeScript types&lt;/li&gt;
  &lt;li&gt;All 18 quantity types (heart rate, steps, calories, etc.)&lt;/li&gt;
  &lt;li&gt;Category types (sleep analysis, headache, fatigue)&lt;/li&gt;
  &lt;li&gt;Workouts and sleep sessions&lt;/li&gt;
  &lt;li&gt;Schema introspection for building dynamic UIs&lt;/li&gt;
  &lt;li&gt;Structured error handling with suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;also-new-cocoapods-support&quot;&gt;Also New: CocoaPods Support&lt;/h3&gt;

&lt;p&gt;The Swift library is now available via CocoaPods in addition to SPM:&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;pod&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;HealthQL&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;~&amp;gt; 1.1.0&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;platform-support&quot;&gt;Platform Support&lt;/h3&gt;

&lt;p&gt;iOS only for now. Android throws a clear &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PLATFORM_NOT_SUPPORTED&lt;/code&gt; error—Health Connect support is on the roadmap.&lt;/p&gt;

&lt;p&gt;Check the &lt;a href=&quot;https://glisom.github.io/HealthQL/#/react-native&quot;&gt;React Native docs&lt;/a&gt; for the full API reference.&lt;/p&gt;
</description>
        <pubDate>Sat, 07 Feb 2026 20:00:00 +0000</pubDate>
        <link>https://grantisom.com/2026/02/07/healthql-react-native.html</link>
        <guid isPermaLink="true">https://grantisom.com/2026/02/07/healthql-react-native.html</guid>
        
        <category>react native</category>
        
        <category>expo</category>
        
        <category>healthkit</category>
        
        <category>open source</category>
        
        <category>typescript</category>
        
        
      </item>
    
      <item>
        <title>HealthQL: SQL for Apple HealthKit</title>
        <description>&lt;p&gt;I built a Swift library that lets you query HealthKit data using SQL syntax. Working with HealthKit directly involves a lot of boilerplate—callback-based APIs, type-specific query objects, manual result transformation. HealthQL simplifies this into something more familiar.&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;https://github.com/glisom/HealthQL&quot;&gt;GitHub&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://glisom.github.io/HealthQL&quot;&gt;Documentation&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;quick-example&quot;&gt;Quick Example&lt;/h3&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;avg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;heart_rate&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;today&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;GROUP&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;BY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;day&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This returns daily heart rate stats for the past week. The library handles all the HealthKit query setup, permissions, and result formatting.&lt;/p&gt;

&lt;h3 id=&quot;swift-dsl&quot;&gt;Swift DSL&lt;/h3&gt;

&lt;p&gt;If you prefer type-safety, there’s also a Swift DSL:&lt;/p&gt;

&lt;div class=&quot;language-swift highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Health&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;heartRate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;aggregates&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;avg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;greaterThan&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;daysAgo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;groupBy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;day&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Both approaches compile down to the same intermediate representation before hitting HealthKit.&lt;/p&gt;

&lt;h3 id=&quot;supported-data&quot;&gt;Supported Data&lt;/h3&gt;

&lt;p&gt;The library covers most common health types—steps, heart rate, calories, workouts, sleep sessions, and more. It supports aggregations, grouping by time periods, and the standard comparison operators you’d expect.&lt;/p&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;p&gt;Add it via Swift Package Manager:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;https://github.com/glisom/HealthQL.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href=&quot;https://glisom.github.io/HealthQL&quot;&gt;documentation site&lt;/a&gt; has the full syntax reference and more examples. Feel free to open an issue if you run into any problems or have suggestions.&lt;/p&gt;
</description>
        <pubDate>Sun, 01 Feb 2026 20:00:00 +0000</pubDate>
        <link>https://grantisom.com/2026/02/01/healthql-sql-for-healthkit.html</link>
        <guid isPermaLink="true">https://grantisom.com/2026/02/01/healthql-sql-for-healthkit.html</guid>
        
        <category>swift</category>
        
        <category>iOS development</category>
        
        <category>healthkit</category>
        
        <category>open source</category>
        
        
      </item>
    
      <item>
        <title>Accessibility Testing in Maestro</title>
        <description>&lt;p&gt;Recently, our mobile team came across a problem with text sizing in our app when customers had the “Larger Accessibility Sizes” Display Text option on. After updating our app to more fully support dynamic text, we came across a cool solution to automate testing this for future releases.&lt;/p&gt;

&lt;p&gt;Using &lt;a href=&quot;https://maestro.mobile.dev&quot;&gt;Maestro&lt;/a&gt; UI Testing, we could enable these settings for certain tests. We created actions within our flows to enable certain settings prior to running the actual UI tests steps. This pattern can be applied on both Android or iOS as Maestro gives you full access to the simulator even running in their cloud environment. If you have not checked out Maestro for UI testing on either React Native or Native applications, I would highly recommend it, as it solves so many historical issues with similar tools.&lt;/p&gt;

&lt;p&gt;Below is an example enabling the “Larger Accessibility Sizes” and then launching the target application in an iOS Simulator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Maestro Flow&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;appId&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;lt;your_bundle_id&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tapOn&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Settings&quot;&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tapOn&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;ACCESSIBILITY&quot;&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tapOn&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;DISPLAY_AND_TEXT&quot;&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tapOn&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;LARGER_TEXT&quot;&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tapOn&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Larger&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Accessibility&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Sizes&quot;&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tapOn&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;50%,90%&quot;&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;pressKey&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Home&quot;&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;launchApp&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;appId&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;lt;your_bundle_id&amp;gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This pattern or strategy can be applied to any of the accessibility settings available on simulators/emulators. This can be a huge help to ensure new UI updates and features are accessible while continuing to release fast.&lt;/p&gt;
</description>
        <pubDate>Wed, 19 Jul 2023 15:33:47 +0000</pubDate>
        <link>https://grantisom.com/2023/07/19/accessibility-testing-in.html</link>
        <guid isPermaLink="true">https://grantisom.com/2023/07/19/accessibility-testing-in.html</guid>
        
        <category>maestro</category>
        
        <category>mobile development</category>
        
        <category>mobile CI/CD</category>
        
        <category>iOS development</category>
        
        <category>Android development</category>
        
        
      </item>
    
      <item>
        <title>Using Act to Run Github Actions Locally</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://github.com/nektos/act&quot;&gt;https://github.com/nektos/act&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Act package offers a convenient way to execute your GitHub Action workflows locally. It’s a valuable tool when debugging or working on issues that either have a long runtime or are complex, saving you those precious minutes.&lt;/p&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;p&gt;The installation process is quite straightforward. First, ensure Docker Desktop is installed on your computer. Then, for Mac/Linux users, the easiest installation method is via &lt;a href=&quot;https://brew.sh&quot; title=&quot;Homebrew&quot;&gt;Homebrew&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew install act
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That’s all there is to it! Upon executing your workflows for the first time, the required Docker containers should automatically download.&lt;/p&gt;

&lt;h3 id=&quot;setup&quot;&gt;Setup&lt;/h3&gt;

&lt;p&gt;An essential point to remember is to &lt;a href=&quot;https://docs.github.com/en/enterprise-server@3.4/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token&quot;&gt;pass in your personal access token from GitHub&lt;/a&gt; when running any workflow dependent on SECRETS or environment variables.&lt;/p&gt;

&lt;h3 id=&quot;executing-workflows&quot;&gt;Executing Workflows&lt;/h3&gt;

&lt;p&gt;With everything set up, running workflows becomes a breeze:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;➜ act pull_request --container-architecture linux/amd64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Checkout the README for additional examples and a comprehensive breakdown of all the capabilities this package offers. I believe Act is an indispensable tool for anyone working with GitHub Actions who wants to test or debug their changes swiftly.&lt;/p&gt;
</description>
        <pubDate>Mon, 15 May 2023 22:06:58 +0000</pubDate>
        <link>https://grantisom.com/2023/05/15/using-act-to.html</link>
        <guid isPermaLink="true">https://grantisom.com/2023/05/15/using-act-to.html</guid>
        
        
      </item>
    
      <item>
        <title>Expo App Config Setup for Multiple Environments</title>
        <description>&lt;p&gt;Expo is a free and open-source platform for creating and building mobile apps using JavaScript and React Native. It is a popular choice among developers for its ease of use and its ability to quickly set up and run a mobile app without the need for extensive configuration. Expo provides a set of tools and services that allow developers to build, test, and publish their apps to the App Store and Google Play with minimal setup and without the need for Xcode or Android Studio.&lt;/p&gt;

&lt;p&gt;One of the most powerful features of Expo is the ability to use a single codebase to create apps for both iOS and Android platforms, which can save a lot of time and effort. Expo also provides a rich set of pre-built components and APIs for common functionality such as push notifications, camera access, and location tracking, which can help developers get their apps up and running quickly.&lt;/p&gt;

&lt;p&gt;One of the things you may come across is figuring out how to setup different environments or app variants within an Expo app. If you want to just target one binary on iOS and Android, there is very little to do other than setup some &lt;a href=&quot;https://docs.expo.dev/guides/environment-variables/&quot;&gt;environment variables&lt;/a&gt;. If you want to have multiple apps for development, QA/test, production, etc then you’ll need to do a few things to be able to take advantage of all Expo has to offer without having to manage these things yourself.&lt;/p&gt;

&lt;h2 id=&quot;converting-to-appjson-to-appconfigjs-for-multiple-environments&quot;&gt;Converting to app.json to app.config.js for multiple environments.&lt;/h2&gt;

&lt;p&gt;The first step is to convert the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app.json&lt;/code&gt; file into an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app.config.js&lt;/code&gt; file. This allows for dynamic changes for things such as your app’s bundle identifier/package name. Below is an example of a basic conversion. Somethings to note is that you are not able to auto bump build numbers when using the app.config.js but there are other ways to accomplish this.&lt;/p&gt;

&lt;h4 id=&quot;appconfigjs&quot;&gt;app.config.js&lt;/h4&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getBundleId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;APP_VARIANT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;development&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;com.isom.grant.dev&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;qa&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;com.isom.grant.qa&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;production&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;com.isom.grant.prod&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;com.isom.grant.dev&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;ios&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;bundleIdentifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getBundleId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;android&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getBundleId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;APP_VARIANT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;APP_VARIANT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;development&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;easjson&quot;&gt;eas.json&lt;/h4&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;development&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;distribution&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;internal&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;developmentClient&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;autoIncrement&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;APP_VARIANT&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;development&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;android&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;buildType&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;apk&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now simply providing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--profile&lt;/code&gt; when running an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eas build&lt;/code&gt; command will set the bundle identifier and package name of your app. You can do this for environment variables as well.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Constants.expoConfig?.extra?.APP_VARIANT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The above snippet will return the value set during build at runtime.&lt;/p&gt;

&lt;h2 id=&quot;passing-environment-variables-to-eas-update&quot;&gt;Passing Environment Variables to EAS Update&lt;/h2&gt;

&lt;p&gt;Environment variables are fairly straightforward for updates. You will need to configure use interactive mode to attach branches to variants. But after that, you will just include the environment variable(s) before the command like any other CLI.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;APP_VARIANT=&apos;production&apos; eas update -p all --branch prod
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To wrap things up, if you’re using Expo to build your mobile app, setting up multiple environments or variants can be a big help. By converting your app.json file to a app.config.js file, you’ll have more control over your app’s settings and can utilize environment variables for native pieces. And if you need to pass on environment variables to the EAS update, it’s pretty simple. Just include the variables before you run the update command and you’re good to go. All in all, Expo makes it easy for you to build, test, and publish your app to both the App Store and Google Play with a smooth and stress-free experience.&lt;/p&gt;
</description>
        <pubDate>Wed, 01 Feb 2023 04:22:25 +0000</pubDate>
        <link>https://grantisom.com/2023/02/01/expo-app-config.html</link>
        <guid isPermaLink="true">https://grantisom.com/2023/02/01/expo-app-config.html</guid>
        
        <category>mobile app development</category>
        
        <category>expo</category>
        
        <category>eas</category>
        
        <category>react native</category>
        
        
      </item>
    
      <item>
        <title>Notion 101 for Software Engineers</title>
        <description>&lt;p&gt;As a software engineer, staying organized and on top of your projects can be a challenge. Not only are there many projects going on at times, but how your work is managed can be split between tools. We use Jira, Confluence, and Github at work, I use Todoist to deal with personal tasks and projects, and then Notion sits in between all of those helping to bring the information needed to the front. In this blog post, I will walk through how I use Notion as a software engineer to keep my work running smoothly and streamline how I capture interesting or important information.&lt;/p&gt;

&lt;h2 id=&quot;the-work-log&quot;&gt;The Work Log&lt;/h2&gt;

&lt;p&gt;Keeping a Daily/Weekly Work Log is a great way to document what you worked on during the day and any questions you want to bring up at Standup the next morning. This can be done in any note-taking tool, but I find that Notion is particularly useful for this purpose. I have a daily template set up that I use to log my work and any questions I may have. This template includes sections for:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tasks completed&lt;/li&gt;
  &lt;li&gt;Problems encountered&lt;/li&gt;
  &lt;li&gt;Questions for the team&lt;/li&gt;
  &lt;li&gt;Things to follow up on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This has been incredibly helpful in keeping my update concise and to the point while not forgetting something I need help with. The work log has also served as a great utility when trying to track down something I worked on that is not easily found in Jira or Github. I highly recommend every engineer at least try keeping a log for a couple months and see if they get a benefit from it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://grantisom.com/uploads/2023/f159196842.png&quot; alt=&quot;&quot; /&gt; &lt;img src=&quot;https://grantisom.com/uploads/2023/fa6c5dfe53.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;templates&quot;&gt;Templates&lt;/h2&gt;

&lt;p&gt;One of the most powerful features of Notion is its ability to create custom templates. These templates can be used for everything from meeting notes to planning sprints, and they can be easily shared with other members of your team. These allow you to spend less time setting things up and more time capturing the important information needed during meetings. For example, I have a template set up for meeting notes that includes sections for:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Agenda&lt;/li&gt;
  &lt;li&gt;Attendees&lt;/li&gt;
  &lt;li&gt;Discussions&lt;/li&gt;
  &lt;li&gt;Action items&lt;/li&gt;
  &lt;li&gt;Follow-up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This has been extremely helpful in keeping track of what was discussed during meetings and what the next steps are. I also have a template for capturing my achievements and work during the year. This way when it comes time for reviews I have a breakdown of all of the things I was proud of throughout the year. This can be very helpful at companies of all sizes and makes your manager’s life easier when understanding your impact. There are endless ways templates can be used, but I think this is a major reason to use Notion or a similar tool over something like Apple Notes.&lt;/p&gt;

&lt;h2 id=&quot;web-clipper&quot;&gt;Web Clipper&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://www.notion.so/web-clipper&quot;&gt;The Notion Web Clipper&lt;/a&gt; has fully replaced Instapaper or Chrome/Safari Reading Lists for me. It allows me to capture helpful articles, links, even things like README’s from Github. It works on pretty much any browser and mobile and is an easy way to quickly capture web pages that you want to reference later. It also tries to pull the text into a page so you can search over the content of all of your saved links. The Web Clipper is an extremely helpful tool when you are starting a new project as well since you can gather a massive amount of information and references very quickly without having to keep a million tabs open.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://grantisom.com/uploads/2023/5fd90bfbf1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;teamspaces-and-notion-ai&quot;&gt;Teamspaces and Notion AI&lt;/h2&gt;

&lt;p&gt;Notion’s recent release of team spaces and Notion AI has made it an even more versatile tool for software engineers. Team spaces allows for easy collaboration and sharing of templates, databases and pages within a team, making it a great tool for managing projects and tasks together. Notion AI, on the other hand, offers a range of features to help you with your workflow such as automated reminders, scheduling, and natural language processing to quickly find information. These features have the potential to greatly improve productivity and collaboration within teams. Additionally, with a growing community and tons of resources online to maximize Notion’s potential, it is an extremely versatile tool that can help software engineers stay organized and get work done faster.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://grantisom.com/uploads/2023/6647450a28.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 14 Jan 2023 20:28:58 +0000</pubDate>
        <link>https://grantisom.com/2023/01/14/notion-for-software.html</link>
        <guid isPermaLink="true">https://grantisom.com/2023/01/14/notion-for-software.html</guid>
        
        <category>software engineering</category>
        
        <category>notion</category>
        
        <category>mobile app development</category>
        
        <category>productivity</category>
        
        <category>notetaking</category>
        
        
      </item>
    
      <item>
        <title>9 Must-Read Books for Software Engineers in 2023</title>
        <description>&lt;p&gt;As a software engineer, staying up-to-date with the latest developments and best practices is essential for growth. One of my favorite (and what I feel is overlooked) methods for growth is reading books. We spend a large part of our day reading Stack Overflow and blog posts, but books have really helped me see things in a different light or understand something I do not come across on a daily basis.&lt;/p&gt;

&lt;p&gt;In 2022, I read a number of books that were extremely valuable to my career as a software engineer. Here are nine that I highly recommend for software engineers at all stages of their careers to consider adding to their reading lists for 2023:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ec18f32904.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/59783101-build&quot;&gt;“Build: An Unorthodox Guide to Making Things Worth Making”&lt;/a&gt; by Tony Fadell is a must-read for anyone looking to create things that matter. Fadell shares his unique perspective on how to focus on small, achievable goals and pivot when necessary.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/475c3984d0.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/38191426-the-phoenix-project&quot;&gt;“The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win”&lt;/a&gt; by Gene Kim, Kevin Behr, and George Spafford is a captivating story about an IT manager who must turn around a failing project. Along the way, he learns about the principles of DevOps and how to apply them to his work.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/7337cde14c.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/20657434-the-hard-thing-about-hard-things&quot;&gt;“The Hard Thing About Hard Things: Building a Business When There Are No Easy Answers”&lt;/a&gt; by Ben Horowitz offers candid and practical advice on the challenges of entrepreneurship. Horowitz covers topics such as hiring, firing, and managing through tough times, and provides valuable insights on how to navigate the ups and downs of building a business.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/a97bedecb3.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/43713.Structure_and_Interpretation_of_Computer_Programs&quot;&gt;“Structure and Interpretation of Computer Programs,”&lt;/a&gt; also known as the “Wizard Book,” is a classic text that covers the fundamental concepts of computer science and programming using the Lisp language. This book is a must-read for any serious software engineer.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/5f538d59de.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/43701534-a-philosophy-of-software-design&quot;&gt;“A Philosophy of Software Design”&lt;/a&gt; by John Ousterhout argues that good software design is all about simplicity and clarity. He offers practical advice on how to achieve these qualities in your own code. This is a good one to read even on a yearly basis.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/45d7f5784d.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/50701156-the-pragmatic-programmer&quot;&gt;“The Pragmatic Programmer: From Journeyman to Master”&lt;/a&gt; by Andrew Hunt and David Thomas is a comprehensive guide to becoming a better software engineer. It covers a wide range of topics, including debugging, testing, and refactoring, and is filled with useful tips and techniques. Make sure to pick up the 20th anniversary edition.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/e1d2ad7014.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/45303387-an-elegant-puzzle&quot;&gt;“An Elegant Puzzle: Systems of Engineering Management”&lt;/a&gt; by Will Larson discusses the challenges and opportunities of managing software development teams. Larson covers topics such as building effective processes, setting goals, and creating a positive culture.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/a37debf5ab.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/48816586-software-engineering-at-google&quot;&gt;“Software Engineering at Google: Lessons Learned from Programming Over Time”&lt;/a&gt; by Titus Winters, Tom Manshreck, and Hyrum Wright offers a behind-the-scenes look at how Google approaches software development. It covers topics such as code review, testing, and technical debt, and provides valuable insights into how to build reliable and scalable systems.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/96ce2ec5a6.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.goodreads.com/book/show/36645100-inspired&quot;&gt;“INSPIRED: How to Create Tech Products Customers Love”&lt;/a&gt; by Marty Cagan is a must-read for anyone looking to create successful tech products. Cagan covers topics such as defining the product vision, building a strong team, and gathering customer feedback, and provides practical advice on how to apply these principles to your own work. Commonly recommended for product managers, I think its a great read for engineers as well as it will help when working cross-functionally with your product team.&lt;/p&gt;

&lt;p&gt;These books provided invaluable insights and kept me motivated and inspired throughout the year. “An Elegant Puzzle” was particularly helpful in figuring out how to more effectively handle support issues within my team, while “Software Engineering at Google” offered valuable guidance as we were setting up a new project and repository. I hope this list of recommendations will provide some useful reading options for you in 2023 as you continue to grow and develop in your software engineering career.&lt;/p&gt;
</description>
        <pubDate>Mon, 02 Jan 2023 23:43:56 +0000</pubDate>
        <link>https://grantisom.com/2023/01/02/mustread-books-for.html</link>
        <guid isPermaLink="true">https://grantisom.com/2023/01/02/mustread-books-for.html</guid>
        
        <category>career</category>
        
        <category>reading books</category>
        
        <category>software engineering</category>
        
        <category>2023</category>
        
        
      </item>
    
      <item>
        <title>2 Years at Illuminate, A Retrospective</title>
        <description>&lt;p&gt;As I move on to the next chapter in my career, I wanted to reflect on the past two years at Illuminate. Here are the lessons learned from moving to a 20 person startup from a 26k person company.&lt;/p&gt;

&lt;h3 id=&quot;tldr&quot;&gt;TL;DR&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Things move fast.&lt;/li&gt;
  &lt;li&gt;You can make an immediate impact on the organization.&lt;/li&gt;
  &lt;li&gt;Your architecture will reflect your organization.&lt;/li&gt;
  &lt;li&gt;Managing is more than 1 on 1’s.&lt;/li&gt;
  &lt;li&gt;Culture matters even more than at a larger organization.&lt;/li&gt;
  &lt;li&gt;Healthcare software is challenging, the data is not uniform, but is some of the most rewarding work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;things-move-fast&quot;&gt;Things move fast.&lt;/h3&gt;

&lt;p&gt;Coming from a larger company, I was used to quarterly planning, long release cycles, and processes for just about everything. One of my favorite things about going to a startup was how quickly we moved. The only processes that existed were for compliance and to ensure high quality with our changes. If you have an idea, or want try something you are empowered to do it!&lt;/p&gt;

&lt;h3 id=&quot;impact&quot;&gt;Impact&lt;/h3&gt;

&lt;p&gt;Being at a startup, you can have a tremendous amount of impact and responsibility. It can be a great opportunity to take a chance or risk but can also create silo’s of critical information. During my second year, we decided to try a new approach and have engineers focus on a general area of architecture instead of a product and also participate in a support rotation. With the level of tech debt we were facing, this was an extremely painful switch. Three months in we noticed our team had quickly destroyed most of these silo’s and documented some of our unknowns. One of my coworkers during this time, started writing down everything he came across during his support rotation and how to reproduce or fix the issues. He not only fixed a lot of the issues but he created a shared space that included all the details. As time went on, the rest of the team followed suite and this became one of the greatest changes our team made. He didn’t tell anyone else to do it, just showed everyone and the team immediately bought it. The time spent on support decreased by almost half due to this. I just think that is a great example of how even little things can make a big difference, and when the team is only 8 people, you really feel it.&lt;/p&gt;

&lt;h3 id=&quot;organizational-architecture&quot;&gt;Organizational Architecture&lt;/h3&gt;

&lt;p&gt;One of the things I was excited to be involved in was helping relayout our company’s org chart to be closer to how we did business. From an engineering perspective, there were three things I thought really made an impact:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We made engineering flatter and less specific, aka SWE’s and SRE’s shared responsibilities and worked closer together.&lt;/li&gt;
  &lt;li&gt;Support was incorporated into the entire engineering team versus being something dealt with by client services.&lt;/li&gt;
  &lt;li&gt;We created processes that captured data and work being done so we could make objective decisions versus relying on people’s experiences purely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ended up showing us some of our biggest pain points and we were able to rapidly adjust.&lt;/p&gt;

&lt;p&gt;The next thing we spent a lot of time trying to figure out was how to have client services interact with the engineering team. This led to building out tools and processes that let each organization be more independent from each other. We integrated our work tracking tools like Monday and Jira, and we identified things engineering could pass off to client services to speed up client onboarding. When I first started, client services was at the whim of engineering which meant these tasks like onboarding or transforming data was always held up by engineering. While I am sure this is still ongoing today, we made massive improvements that really helped our teams work together instead of bottleneck each other.&lt;/p&gt;

&lt;h3 id=&quot;managing-a-team&quot;&gt;Managing a Team&lt;/h3&gt;

&lt;p&gt;Illuminate was my first chance to really manage an entire team. At my previous company, I managed a team of 5 engineers in an organization of 200. This was a wildly different experience. Three hard learning lessons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Strong individual contributors do not always make strong managers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While I believe it can be dangerous to move too slow promoting or recognizing a strong team member, it can be worse to put them in a position they cannot continue to succeed in. Annual review cycles work and prevent a lot of political issues within an organization. There are also times where it makes sense to move someone into a new role outside of cycles, but those should be something done as infrequently as possible.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Your direct reports should always have a good understanding of how they are performing, aka they should not be caught off guard with good or bad news.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Communication and regular 1 on 1’s are not for you to talk about work, they are there to let your direct report talk with you about anything on their mind and for you to communicate anything about their personal growth within the organization. If you have to let someone go or put them on a performance plan, they should be aware that it was coming. Being caught off guard is not a fun situation for your direct report and will probably lead to a poor professional relationship with them.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Watch out for legends of the old guard or team members talking about things that “just work” or “don’t want to mess with”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I really got kicked in the butt when I realized all the stories about previous engineering teams doing miracle work or having to do something extraordinary was just a cover up for tech debt. Nothing is worse than getting a call from a client about a piece of your tech stack that you do not have strong visibility over.&lt;/p&gt;

&lt;p&gt;The biggest takeaway I have is that, as a manager, you are there to help your direct reports succeed and provide a buffer from things that prevent them from being able to do great work. You can’t be everyone’s friend but you also need to recognize that you are there to help them first and foremost.&lt;/p&gt;

&lt;h3 id=&quot;culture&quot;&gt;Culture&lt;/h3&gt;

&lt;p&gt;If there was only one thing I could take away from this last experience, it would be how important a good work culture is. Especially in a fast paced environment, I realized the health of the team is dependent on making sure work is somewhere where everyone feels supported and can be themselves. When things start getting challenging or an emergency happens, it seemed like these are the things that make the biggest difference. Going forward, will be one of the main things I look for in a company. It cannot be an after thought, it needs to be a priority. I don’t mean free food and ping pong tables or extra days off, but a place that supports their staff in the work they do and understands employees have lives outside of work.&lt;/p&gt;

&lt;h3 id=&quot;healthcare-software&quot;&gt;Healthcare Software&lt;/h3&gt;

&lt;p&gt;Healthcare software and data is a mess. Nothing is uniform due to the emergence and integration of electronic medical records over the last 40 years. There are some exciting companies and projects tackling those problems around data uniformity and cross organization data sharing, but while I was at Illuminate, it was both fun and challenging working on the data ingestion pipelines across our client base. While everything is generally similar, no two hospitals are the same which led us down some interesting paths around solving this problem at scale. The other interesting thing about AI or machine learning in healthcare is the amount of insights or data points generated versus how many are actually acted on. One of the biggest things I learned was that follow-up, or helping the hospitals track patients related to some insight is one of the biggest holes in the digital space right now. I am excited to see where the team goes the next couple of years working on these problems.&lt;/p&gt;

&lt;h3 id=&quot;in-conclusion&quot;&gt;In Conclusion&lt;/h3&gt;

&lt;p&gt;I had a great two years at Illuminate and will miss working with the engineering team. It was my first time getting to lead a team of that size and learned a lot in the process. Looking forward, I feel like the experience prepared me for what is to come in my next couple chapters.&lt;/p&gt;
</description>
        <pubDate>Mon, 07 Nov 2022 23:51:06 +0000</pubDate>
        <link>https://grantisom.com/2022/11/07/2-years-at-illuminate.html</link>
        <guid isPermaLink="true">https://grantisom.com/2022/11/07/2-years-at-illuminate.html</guid>
        
        <category>career</category>
        
        <category>engineering management</category>
        
        <category>reflection</category>
        
        
      </item>
    
      <item>
        <title>Next Chapter</title>
        <description>&lt;p&gt;Starting back in July, I made the next move in my personal career. After meeting with one of my good friends, Alek, I decided to follow him to another Kansas City company, &lt;a href=&quot;https://goilluminate.com&quot;&gt;Illuminate&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/logo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The one thing I had to really think about was stepping away from the app development world for a while. It has been a great space to start my career and is what got me into software from the beginning. But I would be doing myself a disservice staying so narrowly focused in one development ecosystem or frame. At Illuminate I have been working mainly on a “&lt;a href=&quot;https://en.wikipedia.org/wiki/MLOps&quot;&gt;MLOps&lt;/a&gt;” application for creating datasets for training models over. It allows our clinical experts to label radiology notes and documents efficiently, while also being a broad enough solution for any other similar data grouping.&lt;/p&gt;

&lt;p&gt;I have really enjoyed going to a smaller startup so far, our team moves fast, everyone gets along, and we have tons of really exciting opportunities in front of us as a company!&lt;/p&gt;

&lt;p&gt;I also think the change of technology stacks will lead to some interesting topics to talk about on here. Stay tuned!&lt;/p&gt;
</description>
        <pubDate>Mon, 28 Sep 2020 00:00:00 +0000</pubDate>
        <link>https://grantisom.com/2020/09/28/next-chapter.html</link>
        <guid isPermaLink="true">https://grantisom.com/2020/09/28/next-chapter.html</guid>
        
        <category>career</category>
        
        
      </item>
    
  </channel>
</rss>
