<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://www.andyhorn.dev/blog</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2024-07-06</lastmod>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/blog/deploying-supabase-migrations-from-github-actions</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
    <lastmod>2024-07-06</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/8c3fce84-f37c-4c8b-bed7-eb82512395ba/Screenshot+2024-07-06+at+11.46.09%E2%80%AFAM.png</image:loc>
      <image:title>Blog - Deploying Supabase Migrations from GitHub Actions - Make it stand out</image:title>
      <image:caption>Whatever it is, the way you tell your story online can make all the difference.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/d4e0e158-e984-4930-bda5-f1959ede22cc/AccessTokens.png</image:loc>
      <image:title>Blog - Deploying Supabase Migrations from GitHub Actions - To find your Supabase access token, login and open your dashboard. On the left-hand side, click the “Access Tokens” menu option.</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/48cd2365-829c-4557-abd3-fa41bf6ddc15/Screenshot+2024-07-06+at+11.37.16%E2%80%AFAM.png</image:loc>
      <image:title>Blog - Deploying Supabase Migrations from GitHub Actions - Adding a Secret</image:title>
      <image:caption>To add a secret, open your repository and click the “Security” &gt; “Secrets and Variables” &gt; “Actions” link.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/7f66e081-bb04-4148-9393-c9f9fe0059b5/Screenshot+2024-07-06+at+11.48.31%E2%80%AFAM.png</image:loc>
      <image:title>Blog - Deploying Supabase Migrations from GitHub Actions - Example Workflow</image:title>
      <image:caption>In the example workflow above, we’ve configured the three environment variables in the env section, pulling them from our repository secrets. It’s important that the access token and database password are added to the correctly-named variables, as pictured above. Your project reference can use any name. Then, in our steps: Use the supabase/setup-cli action to install the Supabase CLI Run supabase link with your project reference to link the code inside the container to your Supabase project Run supabase db push to deploy any pending migrations</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/0f59e5fa-09f6-4086-93f0-6a02910eb3c5/Screenshot+2024-07-06+at+11.28.39%E2%80%AFAM.png</image:loc>
      <image:title>Blog - Deploying Supabase Migrations from GitHub Actions - Make it stand out</image:title>
      <image:caption>Whatever it is, the way you tell your story online can make all the difference.</image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/blog/forecasting-your-cash-flow</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
    <lastmod>2024-04-13</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/b3a15a7d-d8bd-40db-84f6-5bc98914725a/Screenshot+2024-03-25+at+12.16.03%E2%80%AFPM.png</image:loc>
      <image:title>Blog - Forecasting your cash flow - Make it stand out</image:title>
      <image:caption>Whatever it is, the way you tell your story online can make all the difference.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/780bf4d5-53a4-4053-9ce6-3b56cff8258a/Screenshot+2024-03-25+at+12.12.16%E2%80%AFPM.png</image:loc>
      <image:title>Blog - Forecasting your cash flow - Make it stand out</image:title>
      <image:caption>Whatever it is, the way you tell your story online can make all the difference.</image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/blog/on-being-laid-off</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
    <lastmod>2024-04-13</lastmod>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/blog/database-migrations-in-dart-land</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
    <lastmod>2024-03-25</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/d155b6ee-64b3-4e48-93f4-4b0f6496e815/create.png</image:loc>
      <image:title>Blog - Database Migrations in Dart-land - Make it stand out</image:title>
      <image:caption>Whatever it is, the way you tell your story online can make all the difference.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/12f9bc94-4c5c-421b-90a1-4a3db0e40e1a/migrate_url.png</image:loc>
      <image:title>Blog - Database Migrations in Dart-land - Make it stand out</image:title>
      <image:caption>Whatever it is, the way you tell your story online can make all the difference.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/6153fcaa-c0d1-4554-9f54-693bdbd093f8/configuration.png</image:loc>
      <image:title>Blog - Database Migrations in Dart-land - Make it stand out</image:title>
      <image:caption>Whatever it is, the way you tell your story online can make all the difference.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/d13bb9d0-cbea-45fa-8ea6-a4fc251d6a5e/folder.png</image:loc>
      <image:title>Blog - Database Migrations in Dart-land - Make it stand out</image:title>
      <image:caption>Whatever it is, the way you tell your story online can make all the difference.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/6c396502-447d-49c8-843d-611bc9130aa1/pubspec.png</image:loc>
      <image:title>Blog - Database Migrations in Dart-land - Make it stand out</image:title>
      <image:caption>Whatever it is, the way you tell your story online can make all the difference.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/eb4ba77c-75ed-4284-a2f1-fb36653798c1/migrate_env.png</image:loc>
      <image:title>Blog - Database Migrations in Dart-land - Make it stand out</image:title>
      <image:caption>Whatever it is, the way you tell your story online can make all the difference.</image:caption>
    </image:image>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/blog/simple-routes</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
    <lastmod>2024-04-13</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/b8ad3adb-4f45-4436-a369-839fc75d16b9/extraction2.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - A favorite pattern of mine is to use a named constructor or factory on your data class to extract data from GoRouterState.</image:title>
      <image:caption>This encapsulates all of the responsibility for managing your route’s data in one class and makes your router’s builder functions much cleaner.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/cd08b6b2-36a7-45d6-bb9d-0451ec49f0ad/simple+navigation.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - and navigating.</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/94656611-9977-49d9-9a95-237c22e773c8/router.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - configuring GoRouter,</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/76525da1-0867-470b-8e84-6c4a009fb76f/child+router.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - Add this route to your router using the same .goPath property as every other route.</image:title>
      <image:caption>SimpleRoutes is smart enough to not append a leading slash to any child/nested routes.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/b495a03e-4b6c-4a99-9b69-1311299bafa3/data+route+navigation.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - When navigating to a data route, SimpleRoutes will enforce the data class in a required, typed data argument in both the go and push methods.</image:title>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/bd98ca84-db26-4383-95e0-6e9ca6283ef3/extraction.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - SimpleRoutes provides extension methods on GoRouterState to make data extraction simple, too.</image:title>
      <image:caption>Extract path parameters using the getParam method, query parameters using the getQuery method, and “extra” data using getExtra.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/3d9ed8be-21af-438e-95f0-5f544623785c/child+route.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - Any child routes should implement the ChildRoute interface, typed for their immediate parent route.</image:title>
      <image:caption>Then, override the parent property and provide an instance of that route. This is how SimpleRoutes builds the fully-qualified path used during navigation.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/1c4d71bd-82ee-452d-951d-5060af1a5fee/route+data.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - Define a SimpleRouteData class. Override one or more of the data properties and SimpleRoutes will inject your parameters for you:.</image:title>
      <image:caption>For path parameters, override the parameters property with a map of Enum values to Strings. This is how we interpolate your values into the path template. There are additional properties for query parameters and extra data.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/3563e39d-e7d0-4901-9d8a-d690b4a9fcfb/data+route.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - Last but not least, define your DataRoute class. Your route should now extend the DataRoute class with the appropriate generic type.</image:title>
      <image:caption>This links the route to its data requirements, to be enforced by SimpleRoutes when you set up navigation (more below).</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/f9fd36d9-daa7-4ad9-8495-b4bf74beea12/route+params.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - Define your path parameter names using Enum keys.</image:title>
      <image:caption>Enums are used to eliminate the use of “magic strings” and to standardize parameter keys used in the template interpolation.</image:caption>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/d53f7bd2-a6eb-4f9e-95b7-ecc1ee424336/simple+route.png</image:loc>
      <image:title>Blog - Simple routing with GoRouter - Defining your routes,</image:title>
    </image:image>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/blog/tag/dart</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/blog/tag/flutter</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/blog/tag/open+source</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/blog/tag/sql</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/about</loc>
    <changefreq>daily</changefreq>
    <priority>1.0</priority>
    <lastmod>2024-11-11</lastmod>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/6de85ffe-57b0-4d6f-9174-fb01e9d6e77a/dribbble_szablon__1_1.png</image:loc>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/cf88cbeb-6304-4d5b-b960-e6cd86da150b/icon_flutter.png</image:loc>
    </image:image>
    <image:image>
      <image:loc>https://images.squarespace-cdn.com/content/v1/64e64b668dc84d1c5de05480/3cc2117c-b633-4146-bb62-7cafbd9c9d16/angular.png</image:loc>
    </image:image>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/portfolio</loc>
    <changefreq>daily</changefreq>
    <priority>0.75</priority>
    <lastmod>2024-11-11</lastmod>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/portfolio/simple-routes</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
    <lastmod>2024-11-11</lastmod>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/portfolio/kqed</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
    <lastmod>2024-11-11</lastmod>
  </url>
  <url>
    <loc>https://www.andyhorn.dev/portfolio/faninc</loc>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
    <lastmod>2024-11-11</lastmod>
  </url>
</urlset>

