<?xml version="1.0" encoding="UTF-8"?>
<urlset
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
    http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
    xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
>
    <url><loc>https://johnfraney.ca/buy-canadian/</loc><lastmod>2026-02-02</lastmod></url>
    <url><loc>https://johnfraney.ca/hire/</loc><lastmod>2025-01-21</lastmod></url>
    <url><loc>https://johnfraney.ca/404/</loc><lastmod>2022-01-12</lastmod></url>
    <url><loc>https://johnfraney.ca/contact/</loc><lastmod>2023-09-02</lastmod></url>
    <url><loc>https://johnfraney.ca/</loc><lastmod>2025-01-22</lastmod></url>
    <url><loc>https://johnfraney.ca/privacy/</loc><lastmod>2023-04-04</lastmod></url>
    <url><loc>https://johnfraney.ca/projects/</loc><lastmod>2025-11-26</lastmod></url>
    <url><loc>https://johnfraney.ca/tools/convert-usd-to-cad/</loc><lastmod>2025-03-10</lastmod></url>
    <url><loc>https://johnfraney.ca/tools/csv-file-combiner/</loc><lastmod>2023-11-05</lastmod></url>
    <url><loc>https://johnfraney.ca/tools/responsive-image-generator/</loc><lastmod>2025-01-03</lastmod></url>
    <url><loc>https://johnfraney.ca/tools/</loc><lastmod>2025-03-10</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/how-to-unit-test-a-vue-composable-with-typescript/</loc><lastmod>2025-11-30</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/how-to-triple-google-search-traffic-with-one-wording-change/</loc><lastmod>2024-11-28</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/how-to-publish-a-python-package-with-poetry-and-github-actions/</loc><lastmod>2024-05-22</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/how-to-write-user-stories-that-actually-get-done/</loc><lastmod>2024-01-23</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/aws-documentation-frustrations/</loc><lastmod>2023-09-16</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/vue-static-site-web-component-custom-elements/</loc><lastmod>2023-10-03</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/seo-driven-feature-development/</loc><lastmod>2023-01-03</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/dynamodb-python-type-hints/</loc><lastmod>2022-06-28</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/lessons-learned-from-a-small-side-project/</loc><lastmod>2022-03-01</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/unit-test-dynamodb-python-pytest-dynalite/</loc><lastmod>2022-02-07</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/typescript-synchronize-django-rest-framework-vue-js-2/</loc><lastmod>2021-01-06</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/preparing-a-gourmet-pull-request/</loc><lastmod>2020-10-20</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/how-to-write-responsive-html-tables/</loc><lastmod>2020-05-12</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/pytest-watched-failed-tests/</loc><lastmod>2020-02-19</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/improve-page-speed-google-fonts/</loc><lastmod>2019-12-10</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/pipenv-poetry-benchmarks-ergonomics-2/</loc><lastmod>2019-11-19</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/typescript-synchronize-django-rest-framework-vue-js/</loc><lastmod>2019-09-26</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/create-publish-python-package-poetry/</loc><lastmod>2024-06-08</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/integrate-django-vuejs/</loc><lastmod>2019-12-10</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/human-readable-regular-expressions/</loc><lastmod>2023-06-30</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/pipenv-poetry-benchmarks-ergonomics/</loc><lastmod>2019-03-06</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/build-deploy-static-site-dokku/</loc><lastmod>2019-10-07</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/rebuilding-my-blog-pelican/</loc><lastmod>2019-02-04</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/writing-unit-tests-celery-tasks-async-functions/</loc><lastmod>2019-10-07</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/modern-django-admin-using-wagtail/</loc><lastmod>2018-11-02</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/writing-vuejs-app-python/</loc><lastmod>2018-08-13</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/writing-reusable-modelform-templates-django/</loc><lastmod>2019-10-08</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/responsive-blog-layout-using-css-grid/</loc><lastmod>2018-03-30</lastmod></url>
    <url><loc>https://johnfraney.ca/blog/</loc><lastmod>2023-04-04</lastmod></url>
</urlset>