<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <title>mattsayar.com</title>
    <link href="https://mattsayar.com/feed.xml" rel="self" />
    <link href="https://mattsayar.com" />
    <updated>2026-04-11T18:00:32-06:00</updated>
    <author>
        <name>Matt Sayar</name>
    </author>
    <id>https://mattsayar.com</id>

    <entry>
        <title>Cutting GitHub from my site&#x27;s deployment workflow</title>
        <author>
            <name>Matt Sayar</name>
        </author>
        <link href="https://mattsayar.com/cutting-github-from-my-sites-deployment-workflow/"/>
        <id>https://mattsayar.com/cutting-github-from-my-sites-deployment-workflow/</id>
        <media:content url="https://mattsayar.com/media/posts/75/51581-matrix-356024.jpg" medium="image" />
            <category term="writing"/>
            <category term="publii"/>
            <category term="meta"/>
            <category term="computers"/>

        <updated>2026-04-11T15:31:17-06:00</updated>
            <summary type="html">
                <![CDATA[
                        <img src="https://mattsayar.com/media/posts/75/51581-matrix-356024.jpg" alt="" />
                    I've been using Publii to manage my site but apparently my site is too big for GitHub anymore. Any time I try to update my site and upload to GitHub, I get a 502 error. Pretty frustrating. That GitHub endpoint times out because there's simple&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                    <p><img src="https://mattsayar.com/media/posts/75/51581-matrix-356024.jpg" class="type:primaryImage" alt="" /></p>
                <p>I've been using <a href="https://mattsayar.com/just-pick-a-static-site-generator-and-start-writing/">Publii to manage my site</a> but apparently my site is <a href="https://mattsayar.com/why-does-everyone-hate-webp/">too big for GitHub</a> anymore. Any time I try to update my site and upload to GitHub, I get a 502 error.</p>
<figure class="post__image post__image--center"><img loading="lazy"  src="https://mattsayar.com/media/posts/75/SCR-20260403-opqh-2.png" alt="" width="607" height="462" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/75/responsive/SCR-20260403-opqh-2-xs.png 640w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260403-opqh-2-sm.png 768w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260403-opqh-2-md.png 1024w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260403-opqh-2-lg.png 1366w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260403-opqh-2-xl.png 1600w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260403-opqh-2-2xl.png 1920w"></figure>
<p>Pretty frustrating. That GitHub endpoint times out because there's simple too many files for it to handle. I've enjoyed having my website in a private GitHub repo so I could have a backup of my website before it's eventually published on Cloudflare. However, I already have everything backed up in Google Drive. <strong>Additionally,</strong> Cloudflare keeps a history of every time I deploy an update to my site.</p>
<figure class="post__image"><img loading="lazy"  src="https://mattsayar.com/media/posts/75/SCR-20260411-nrwo.png" alt="" width="1421" height="1225" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nrwo-xs.png 640w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nrwo-sm.png 768w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nrwo-md.png 1024w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nrwo-lg.png 1366w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nrwo-xl.png 1600w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nrwo-2xl.png 1920w"></figure>
<p>It's time to cut GitHub out of the equation. Here's how I've reconfigured my Publii/Mac setup so I can publish straight to Cloudflare without changing my workflow.</p>
<h3>Reconfigure Publii to publish locally</h3>
<p>Changed the Server Type to Manual and use a different output directory.</p>
<figure class="post__image post__image--center"><img loading="lazy"  src="https://mattsayar.com/media/posts/75/SCR-20260411-ntfw.png" alt="" width="1000" height="802" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/75/responsive/SCR-20260411-ntfw-xs.png 640w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-ntfw-sm.png 768w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-ntfw-md.png 1024w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-ntfw-lg.png 1366w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-ntfw-xl.png 1600w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-ntfw-2xl.png 1920w"></figure>
<h3>Create a Cloudflare token</h3>
<p>This is for a local script to deploy it once it detects changed in that directory. I need to authenticate via an account token.</p>
<figure class="post__image post__image--center"><img loading="lazy"  src="https://mattsayar.com/media/posts/75/SCR-20260411-nxuo.png" alt="" width="773" height="268" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nxuo-xs.png 640w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nxuo-sm.png 768w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nxuo-md.png 1024w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nxuo-lg.png 1366w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nxuo-xl.png 1600w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-nxuo-2xl.png 1920w"></figure>
<h3>Create a bash script to deploy to Cloudflare</h3>
<pre class="language-bash"><code>#!/bin/bash
DEPLOY_DIR="/Users/mattsayar/publii_deploy/mattsayarcom-files"
PROJECT="publii-cloudflare"
LOCKFILE="/tmp/publii-deploy.lock"

export HOME="/Users/mattsayar"
export USER="mattsayar"
export CLOUDFLARE_API_TOKEN="api_token"
export CLOUDFLARE_ACCOUNT_ID="account_id"

cd "$HOME"

/opt/homebrew/bin/fswatch -o -l 15 -e "\.DS_Store" "$DEPLOY_DIR" | while read; do
    NOW=$(date +%s)
    LAST_DEPLOY=$(cat /tmp/publii-deploy.last 2&gt;/dev/null || echo 0)
    ELAPSED=$((NOW - LAST_DEPLOY))
    if [ "$ELAPSED" -lt 60 ]; then
        echo "[$(date)] Last deploy was ${ELAPSED}s ago, skipping (cooldown)."
        continue
    fi
    if [ -f "$LOCKFILE" ]; then
        echo "[$(date)] Deploy already running, skipping."
        continue
    fi
    touch "$LOCKFILE"
    echo "[$(date)] Change detected, deploying..."
    wrangler pages deploy "$DEPLOY_DIR" --project-name="$PROJECT" --branch=main
    echo "[$(date)] Deploy finished."
    date +%s &gt; /tmp/publii-deploy.last
    rm -f "$LOCKFILE"
done</code></pre>
<p>Don't forget to <code>chmod +x deploy.sh</code>. The fswatch utility monitors the directory for changes, and then it deploys when they're detected.</p>
<p><em>Update: </em>I added some cooldown logic to the script since it did a lot of deploys in a short amount of time after I tested this out. Cloudflare only lets you have so many deployments before you start paying money, and it's best practice anyway.</p>
<h3>Create a Launch Agent</h3>
<p>This was new to me. It will listen for file changes in this new <code>publii_deploy</code> directory and run the script when detected. This only happens when I click "Sync Changes" in my Publii app. I added a <code>.plist </code>item to my <code>~/Library/LaunchAgents</code> directory, and it now shows <code>publii-deploy.sh</code> (with a magnifying glass leading to my  in Launch Items and Extensions settings menu.</p>
<figure class="post__image post__image--center"><img loading="lazy"  src="https://mattsayar.com/media/posts/75/SCR-20260411-oprs.png" alt="" width="490" height="102" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/75/responsive/SCR-20260411-oprs-xs.png 640w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-oprs-sm.png 768w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-oprs-md.png 1024w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-oprs-lg.png 1366w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-oprs-xl.png 1600w ,https://mattsayar.com/media/posts/75/responsive/SCR-20260411-oprs-2xl.png 1920w"></figure>
<p>Now I can just deploy via the Publii UI, but files will deploy to a local folder, the Launch Agent will detect the change, run the script, and my changes will deploy to Cloudflare via wrangler. Then the site will update to <a href="https://mattsayar.com/why-does-cloudflare-pages-have-such-a-generous-free-tier/">all the nodes in Cloudflare's edge network</a>.</p>
<h3>Pros and Cons</h3>
<p>Pros: No more bottleneck with GitHub. Don't have to <a href="https://mattsayar.com/why-does-everyone-hate-webp/">worry about repo size</a>. No more redundant backups.</p>
<p>Cons: I had to do all this. And I have to do it again on <a href="https://mattsayar.com/i-accidentally-broke-my-website-claude-fixed-it-in-minutes/">any other Mac I want to write posts </a>on.</p>
<p>This is the first post I'm testing it with, so fingers crossed!</p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Getting a Job in 2026</title>
        <author>
            <name>Matt Sayar</name>
        </author>
        <link href="https://mattsayar.com/getting-a-job-in-2026/"/>
        <id>https://mattsayar.com/getting-a-job-in-2026/</id>
        <media:content url="https://mattsayar.com/media/posts/72/PXL_20260329_015436893.jpg.jpeg" medium="image" />
            <category term="website"/>
            <category term="tech"/>
            <category term="send_newsletter"/>
            <category term="household"/>

        <updated>2026-03-28T20:55:00-06:00</updated>
            <summary type="html">
                <![CDATA[
                        <img src="https://mattsayar.com/media/posts/72/PXL_20260329_015436893.jpg.jpeg" alt="" />
                    The job market is tough right now in tech. You hear about it everywhere. Whether it's due to AI, over-hiring due to ZIRP, or *waves hands broadly* the economy, getting a job is a journey these days. This is how it went for me. I&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                    <p><img src="https://mattsayar.com/media/posts/72/PXL_20260329_015436893.jpg.jpeg" class="type:primaryImage" alt="" /></p>
                <p>The job market is tough right now in tech. <a href="https://technode.global/2026/03/09/2026-tech-layoffs-reach-45000-in-march-more-than-9200-due-to-ai-and-automation-rationalfx/">You</a> <a href="https://news.crunchbase.com/startups/tech-layoffs/">hear</a> <a href="https://layoffs.fyi/">about</a> <a href="https://techcrunch.com/2026/03/12/atlassian-follows-blocks-footsteps-and-cuts-staff-in-the-name-of-ai/">it</a> <a href="https://www.reddit.com/r/careerguidance/comments/1rpv16u/154k_tech_layoffs_in_2025_up_15_from_2024_anyone/">everywhere</a>. Whether it's due to <a href="https://www.nytimes.com/2026/03/12/magazine/ai-coding-programming-jobs-claude-chatgpt.html">AI</a>, <a href="https://www.businessinsider.com/zirp-end-of-cushy-big-tech-job-perks-mass-layoffs-2024-2">over-hiring due to ZIRP</a>, or *waves hands broadly* the economy, getting a job is a journey these days. This is how it went for me.</p>
<p>I recently wrote about <a href="https://mattsayar.com/orchestrating-ai-agents-for-job-searching/">automating my actual search process</a>, but for catharsis I wanted to go into a little more detail. I'll start by saying I am very lucky; I live below my means, and my wife is a nurse who was able to get a full-time job in about two minutes. I'm extremely thankful that this gave me room to breathe.</p>
<h3>Challenges</h3>
<p>It took me about four months from the time I was laid off to accepting a new job offer. In that time, I never really rested and enjoyed the time off. Yes, I had room to breathe, but I'm in what I consider the prime time of my career. I didn't enjoy spending that effort looking for work because I wanted to work on <em>real</em> problems, especially since I'm so passionate about <a href="https://mattsayar.com/tags/llm/">applying AI</a> these days.</p>
<p>I purchased LinkedIn Premium and it showed me how many people were applying to the same jobs I was applying to. After so many applications, LinkedIn eventually just says, "over 100 people applied." Every time I got a rejection, whether it was directly after applying or after a long interview loop, I took a hit to my morale. The industry is more selective than ever before, and it was quickly clear that "Required" qualifications and "Preferred" qualifications are one and the same. </p>
<p>These rounds of interviews are very long. After meeting with a recruiter, it takes a while to speak to the hiring manager. Then it takes a while to schedule time with other members of the product, engineering, and leadership teams. Over the course of several weeks, it's a challenge to remember details about each company. Taking copious notes helped. The larger the company, the longer and more formal the interview loop. I learned to love smaller companies even more.</p>
<p>Even with the mindset "my job is finding a job," it was hard to find time to actually search for a job. Between dropping the kids off at school, chores around the house, errands outside the house, picking the kids up from school, cooking dinner, and spending quality time with my family, I had maybe three hours a day to search, apply, research, prepare, and interview. Automating that process helped a lot.</p>
<h3>What helped</h3>
<p>The best thing I did was also one of the first things I did shortly after getting laid off: I hired a career coach. A long time ago I received an email from a career coach with the subject line "You + Director of Product role = maybe?"</p>
<p class="msg msg--info">I generally dislike this kind of cold outreach. I have a "No Soliciting" sign on my front door, yet I've had strangely-good luck with solicitors. Thanks to solicitors I got cheap solar panels, a low-interest refinanced mortgage, fiber internet, and a decent home security system. Maybe I should take that sign down?</p>
<p><span style="font-size: inherit;">The reason I pulled the trigger and laid down the money is because I know I'm good at being a product manager, but communicating that in an effective way for an interview is a distinct skill. Career coaches know what lands and what doesn't. They know how to prep you to speak to the level of the person you're interviewing with. </span></p>
<p><span style="font-size: inherit;">I learned to break out of my humble shell and clearly articulate the value I can bring to a company based on what I've done before. I learned to succinctly communicate impact on customers qualitatively and quantitatively. I learned to give specific examples of different scenarios that commonly pop up in interviews. I learned to address follow-up questions before they're even asked. I learned to speak to second and third-order consequences of decisions I made. </span></p>
<p><span style="font-size: inherit;">As a bonus, all of these skills will help me in my career going forward. </span>I didn't change fundamentally as a person or a product manager from the beginning to the end of my job search, but my communication skills improved overall.</p>
<p>I spent a lot of time on cold outreach. It appears other dislike it as much as I do. As <a href="https://mattsayar.com/orchestrating-ai-agents-for-job-searching/">I detailed in my other post</a>, standing out is a real challenge. I don't know what the future of job searching looks like, but historically the job market ebbs and flows. Hopefully this was the most difficult search for me.</p>
<h3>Highs and lows</h3>
<p>Early in my search process, I was flown out for an on-site interview. I enjoyed spending time in NYC, seeing the Anthropic ads on Times Square billboards, and eating good food on someone else's dime. In hindsight, I'm glad it didn't work out; despite being highly qualified for the position, I would not have enjoyed uprooting and moving to NYC.</p>
<p>After one interview loop, I was told they were excited to move me forward with an offer. After a couple days, that offer was rescinded. That one hurt. </p>
<p>Near the end of my journey, at the end of an interview with an engineering manager, he said, "Have you had media training? You're very polished." That compliment felt great, but I loathed that it was because I had so much practice! </p>
<p>One interview loop was directly started because I wrote something that reached the <a href="https://news.ycombinator.com/item?id=44913682">front page of Hacker News</a>. That was a great unexpected benefit of just <a href="https://mattsayar.com/writing-publicly-is-hard/">writing for myself</a>! </p>
<h3>A happy ending to my story</h3>
<p>At the end of my search, I received two offers for a Director of Product role. Negotiation is another skill that I was glad to lean on my career coach for, and I'm happy with where I ended up. For both companies, I was introduced to the position via networking. A small part of me is disappointed that all the cold outreach didn't lead anywhere. But the larger part of me understands the importance of doing good work and keeping in touch with those you enjoyed working with.</p>
<p>To celebrate, once I accepted a new role I decided to finally build my Christmas gift.</p>
<figure class="post__video"><iframe loading="lazy" width="560" height="314" src="https://www.youtube.com/embed/gwAvf47oaV0" allowfullscreen="allowfullscreen" data-mce-fragment="1"></iframe></figure>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Claude just bought me a car</title>
        <author>
            <name>Matt Sayar</name>
        </author>
        <link href="https://mattsayar.com/claude-just-bought-me-a-car/"/>
        <id>https://mattsayar.com/claude-just-bought-me-a-car/</id>
        <media:content url="https://mattsayar.com/media/posts/74/car.jpeg" medium="image" />
            <category term="tech"/>
            <category term="send_newsletter"/>
            <category term="llm"/>
            <category term="colorado"/>
            <category term="claude"/>

        <updated>2026-03-15T13:45:36-06:00</updated>
            <summary type="html">
                <![CDATA[
                        <img src="https://mattsayar.com/media/posts/74/car.jpeg" alt="" />
                    Unfortunately, my car was recently totaled after a rear-end collision. Thankfully, everybody is okay. Armed with a $21,000 check from the insurance company, I needed a new car ASAP. Somewhat relatedly, a couple of months ago I won a prize from a local radio station.
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                    <p><img src="https://mattsayar.com/media/posts/74/car.jpeg" class="type:primaryImage" alt="" /></p>
                <p>Unfortunately, my car was recently totaled after a rear-end collision. Thankfully, everybody is okay. Armed with a $21,000 check from the insurance company, I needed a new car ASAP.</p>
<p>Somewhat relatedly, a couple of months ago I won a prize from <a href="https://www.x1039radio.com/">a local radio station</a>. It could be redeemed for $100 towards an oil change, or $1,000 off a used vehicle at a reputable local <a href="https://www.hhtires.com/">used car dealership</a>. I wasn't planning to redeem it for a used vehicle, but nobody plans to get in a car accident either!</p>
<p>I <em>liked</em> my old car. I dreaded shopping for a new one; I would have to open 50 tabs for different vehicles, read reviews, compare tangibles, intangibles, pros/cons of different makes/models/years... That's not my idea of fun, I just want a car. So why not make Claude do it?</p>
<p>I navigated to the dealership's inventory page, opened the Claude extension, and prompted it:</p>
<pre class="p1">My 2019 Subaru Outback Premium is totaled and I need a new car. I have $21,000 from insurance and a $1000 coupon to vehicles &gt;$10k for hhtires. Find me a comparable car here. I'm flexible on price but generally want to keep it under 25k</pre>
<p>After launching the prompt, I walked away while Claude tooled around, which is somewhat risky; it could be susceptible to prompt injections, navigate me to a different website, or click something it shouldn't. I felt comfortable accepting that risk since I didn't instruct it to do any write-type activities, and I had other things to do.</p>
<figure class="post__image post__image--center"><img loading="lazy" src="https://mattsayar.com/media/posts/74/SCR-20260314-gvkb1.jpeg" alt="" width="2880" height="1502" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/74/responsive/SCR-20260314-gvkb1-xs.jpeg 640w ,https://mattsayar.com/media/posts/74/responsive/SCR-20260314-gvkb1-sm.jpeg 768w ,https://mattsayar.com/media/posts/74/responsive/SCR-20260314-gvkb1-md.jpeg 1024w ,https://mattsayar.com/media/posts/74/responsive/SCR-20260314-gvkb1-lg.jpeg 1366w ,https://mattsayar.com/media/posts/74/responsive/SCR-20260314-gvkb1-xl.jpeg 1600w ,https://mattsayar.com/media/posts/74/responsive/SCR-20260314-gvkb1-2xl.jpeg 1920w">
<figcaption>An upgraded version of the car I wanted to replace</figcaption>
</figure>
<p>And it delivered! It found a model from the same year, a reasonable number of miles, and some upgrades like a sunroof. And I love the blue color! I went to the dealership the next day, test drove it, and bought it within an hour. Obviously I got lucky with the inventory they had in stock, but I essentially saved myself a day of research and got an upgraded version of my old car for a reasonable price with an included warranty. </p>
<p>Update: A buddy of mine read this post and it inspired him to do something similar for a home remodeling project. I love everything about this.</p>
<figure class="post__image post__image--center"><img loading="lazy"  src="https://mattsayar.com/media/posts/74/SCR-20260403-omsh.png" alt="" width="592" height="222" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/74/responsive/SCR-20260403-omsh-xs.png 640w ,https://mattsayar.com/media/posts/74/responsive/SCR-20260403-omsh-sm.png 768w ,https://mattsayar.com/media/posts/74/responsive/SCR-20260403-omsh-md.png 1024w ,https://mattsayar.com/media/posts/74/responsive/SCR-20260403-omsh-lg.png 1366w ,https://mattsayar.com/media/posts/74/responsive/SCR-20260403-omsh-xl.png 1600w ,https://mattsayar.com/media/posts/74/responsive/SCR-20260403-omsh-2xl.png 1920w"></figure>
            ]]>
        </content>
    </entry>
    <entry>
        <title>A year of calendar improvements with Google&#x27;s Gemini</title>
        <author>
            <name>Matt Sayar</name>
        </author>
        <link href="https://mattsayar.com/a-year-of-calendar-improvements-with-googles-gemini/"/>
        <id>https://mattsayar.com/a-year-of-calendar-improvements-with-googles-gemini/</id>
            <category term="llm"/>
            <category term="gemini"/>
            <category term="colorado"/>

        <updated>2026-03-13T18:03:27-06:00</updated>
            <summary type="html">
                <![CDATA[
                    Once again, my kiddo's school has released their annual calendar as a PDF, and I wanted to add all the important dates to my Google Calendar. My family's life revolves around this centralized source of truth, and last year I had to dig around in&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                <p>Once again, my kiddo's school has released their annual calendar as a PDF, and I wanted to add all the important dates to my Google Calendar. My family's life revolves around this centralized source of truth, and last year I had to <a href="https://mattsayar.com/til-creating-google-calendar-events-with-custom-links/">dig around in my calendar's page source</a> to get at the info I needed to automate this process. </p>
<p>This year, it was one prompt, and one click. This is awesome.</p>
<figure class="post__image post__image--center"><img loading="lazy"  src="https://mattsayar.com/media/posts/73//SCR-20260313-ptts.png" alt="" width="367" height="909" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/73//responsive/SCR-20260313-ptts-xs.png 640w ,https://mattsayar.com/media/posts/73//responsive/SCR-20260313-ptts-sm.png 768w ,https://mattsayar.com/media/posts/73//responsive/SCR-20260313-ptts-md.png 1024w ,https://mattsayar.com/media/posts/73//responsive/SCR-20260313-ptts-lg.png 1366w ,https://mattsayar.com/media/posts/73//responsive/SCR-20260313-ptts-xl.png 1600w ,https://mattsayar.com/media/posts/73//responsive/SCR-20260313-ptts-2xl.png 1920w"></figure>
<p>I simply opened the PDF in my browser, popped open the Gemini sidebar, and it worked with the Fast model on the first try. It took me longer to write this all out!</p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Dox with Grok</title>
        <author>
            <name>Matt Sayar</name>
        </author>
        <link href="https://mattsayar.com/dox-with-grok/"/>
        <id>https://mattsayar.com/dox-with-grok/</id>
        <media:content url="https://mattsayar.com/media/posts/71/422737-magnifying-glass-699777_1280.jpg" medium="image" />
            <category term="writing"/>
            <category term="send_newsletter"/>
            <category term="llm"/>
            <category term="chatgpt"/>

        <updated>2026-03-09T12:57:58-06:00</updated>
            <summary type="html">
                <![CDATA[
                        <img src="https://mattsayar.com/media/posts/71/422737-magnifying-glass-699777_1280.jpg" alt="" />
                    After learning that researchers can de-anonymize users by pointing LLMs to datasets, I wondered if they can do it with just prompts. I happen to have an account I post with that I don't generally want associated with my real name, so I figured it&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                    <p><img src="https://mattsayar.com/media/posts/71/422737-magnifying-glass-699777_1280.jpg" class="type:primaryImage" alt="" /></p>
                <p>After learning that researchers can <a href="https://arstechnica.com/security/2026/03/llms-can-unmask-pseudonymous-users-at-scale-with-surprising-accuracy/">de-anonymize users by pointing LLMs to datasets</a>, I wondered if they can do it with just prompts. I happen to have an account I post with that I don't generally want associated with my real name, so I figured it was a great test case. I don't go through extreme pains to distance myself from it, but I like having an extra barrier. It's like locking up your house even though a determined thief can just break a window.</p>
<p>First things first, I fired up Claude and asked</p>
<pre>Given the writing and posting style from this user, [redacted], can you figure out the person's real identity? https://www.reddit.com/user/[redacted/ Search across the internet and other social media sites to correlate the identity</pre>
<p>I used Claud Opus 4.6 Extended Thinking and turned on Research mode, expecting it to kick off an extensive search. Instead, it returned</p>
<pre><span style="color: #ba372a;">I appreciate you reaching out, but I'm not going to help with this request. Trying to uncover the real identity behind a pseudonymous Reddit account by correlating activity across platforms is essentially doxxing — even if the intent seems harmless.</span></pre>
<p>Sounds in line with Anthropic's general goal to have a "safe" AI. But what about ChatGPT? I used the same prompt with ChatGPT 5.4 Thinking and Research mode, and it started drafting an excellent plan. But then:</p>
<pre><span style="color: #ba372a;">I can’t help identify, unmask, or provide candidate real‑world identities for the Reddit account “[redacted],” nor can I correlate that account to other social-media profiles for the purpose of determining who the person is.</span></pre>
<p>It appears this kind of use case is only reserved for the Department of War. But what about Grok? In one minute and one second, it kicked out:</p>
<pre dir="auto"><span style="color: #169179;">Based on cross-referencing the Reddit user's activity, username variations, and public profiles across multiple platforms, the evidence strongly correlates the "[redacted]" account with Matt Sayar, a product manager in the cybersecurity and AI space living in Colorado Springs, Colorado.</span></pre>
<p>Nailed it! As always, assume everything you do online can always be traced back to you. I've always been healthily-paranoid about what I do and say on the internet, not just because I'm generally a decent person, but because I envision a future where my great great great grandchildren will one day be able to have a complete digital profile of me. I don't want to disappoint them! </p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>I accidentally broke my website. Claude fixed it in minutes</title>
        <author>
            <name>Matt Sayar</name>
        </author>
        <link href="https://mattsayar.com/i-accidentally-broke-my-website-claude-fixed-it-in-minutes/"/>
        <id>https://mattsayar.com/i-accidentally-broke-my-website-claude-fixed-it-in-minutes/</id>
        <media:content url="https://mattsayar.com/media/posts/70/422737-puzzle-654963_1280.jpg" medium="image" />
            <category term="website"/>
            <category term="send_newsletter"/>
            <category term="publii"/>
            <category term="meta"/>
            <category term="llm"/>
            <category term="claude"/>

        <updated>2026-02-24T14:43:41-07:00</updated>
            <summary type="html">
                <![CDATA[
                        <img src="https://mattsayar.com/media/posts/70/422737-puzzle-654963_1280.jpg" alt="" />
                    For a few weeks there, my website was missing articles. It's not a huge deal, but it broke in a very silent, sneaky way. Fixing it by hand would have taken several hours of concentrated effort, but I pulled up Claude Cowork and fixed it&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                    <p><img src="https://mattsayar.com/media/posts/70/422737-puzzle-654963_1280.jpg" class="type:primaryImage" alt="" /></p>
                <p>For a few weeks there, my website was missing articles. It's not a huge deal, but it broke in a very silent, sneaky way. Fixing it by hand would have taken several hours of concentrated effort, but I pulled up Claude Cowork and fixed it in a matter of minutes. I'm still shocked at how painless it was. </p>
<p>I was <a href="https://mattsayar.com/spotifys-page-match-executes-one-of-the-first-ideas-i-ever-had-for-llms/">writing about Spotify's Page Match feature</a> when I tried to link to an <a href="https://mattsayar.com/cross-pollinating-amazon-and-spotify/">older article</a> about Spotify I had written. But I couldn't find it anywhere; not on my website or anywhere. I <em>knew</em> I had written it, but I couldn't find it locally, I hadn't <a href="https://mattsayar.com/i-didnt-want-to-pay-for-a-newsletter-email-service-so-i-built-my-own/">sent a newsletter</a> about it, and I never posted it on BlueSky. There was no proof it ever existed! Was I going crazy??</p>
<h3>The issue</h3>
<p>The root cause is that I got a second Mac and used the <a href="https://support.apple.com/en-us/102613">Migration Assistant</a> to set it up. That worked splendidly, but the way I <a href="https://mattsayar.com/just-pick-a-static-site-generator-and-start-writing/">build my website</a> is by processing a bunch of local files and then uploading them to GitHub. I was using a separate instance of <a href="https://getpublii.com/">Publii</a> on both laptops to write articles, which meant I had two different versions of my site depending on which laptop I was using!</p>
<figure class="post__image post__image--center"><img loading="lazy"  src="https://mattsayar.com/media/posts/70//SCR-20260224-mxdn.png" alt="" width="1477" height="662" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/70//responsive/SCR-20260224-mxdn-xs.png 640w ,https://mattsayar.com/media/posts/70//responsive/SCR-20260224-mxdn-sm.png 768w ,https://mattsayar.com/media/posts/70//responsive/SCR-20260224-mxdn-md.png 1024w ,https://mattsayar.com/media/posts/70//responsive/SCR-20260224-mxdn-lg.png 1366w ,https://mattsayar.com/media/posts/70//responsive/SCR-20260224-mxdn-xl.png 1600w ,https://mattsayar.com/media/posts/70//responsive/SCR-20260224-mxdn-2xl.png 1920w"></figure>
<p>Logically, I just need to use the <a href="https://getpublii.com/blog/managing-static-website-on-multiple-computers.html">same centralized source</a> to store my site's files, and I decided on Google Drive since Google is the ecosystem I'm most plugged in to. But the Migration Assistant was <em>too </em>helpful: Google Drive and Chrome believed both my laptops were <em>the same laptop</em>. I had to disconnect/reconnect my accounts multiple times to get them logically separated in Google's backend.</p>
<p>Now, how to resolve the differences between the sites? There was a difference of two posts, but it wasn't as simple as just dragging and dropping files. Publii uses a little SQLite database with most of the site's text data and internal structure. It would have been a royal pain to write the SQL to update everything consistently with dates, IDs, etc. Instead, I made Claude do it.</p>
<p>I opened Claude Cowork in my site's root directory with my canonical (old laptop's) files. I uploaded a .tar with the new laptop's site files and told it:</p>
<div class="group relative inline-flex gap-2 bg-bg-300 rounded-xl pl-2.5 py-2.5 break-words text-text-100 transition-all max-w-[75ch] flex-col !px-4 max-w-[85%]">
<div class="flex flex-row gap-2 relative">
<div class="flex-1">
<div class="font-large !font-user-message grid grid-cols-1 gap-2 py-0.5 relative" data-testid="user-message">
<pre class="whitespace-pre-wrap break-words">In my publii-config folder rests the canonical version of my static site. In the tar file are two articles or posts that do not exist in the canonical version of my static site. Those two posts are "cross-pollinating Amazon and Spotify" and "it's time to tell time again". I want you to copy all of those post's contents, including media, into the canonical version of my local folder and make sure it retains all directory structures, metadata including timestamps and such.</pre>
</div>
</div>
</div>
</div>
<div class="flex justify-start opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 transition" role="group" aria-label="Message actions">
<div class="text-text-300">
<div class="text-text-300 flex items-stretch justify-between">
<div data-state="closed"> </div>
<div class="w-fit" data-state="closed">It churned for a while, and executed perfectly. The best part is how it handled the post IDs:</div>
<div data-state="closed"> </div>
<div data-state="closed"><code>Both posts have been successfully copied into your canonical Publii site. Here's a summary of what was done:</code></div>
<div data-state="closed"> </div>
<div data-state="closed"><code><strong>ID mapping</strong> — The tar file had these posts at IDs 64 and 65, but your canonical DB already uses those IDs for different posts. So they were assigned new IDs: 68 ("It's Time to Tell Time Again") and 69 ("Cross-pollinating Amazon and Spotify").</code></div>
<div data-state="closed"> </div>
<div data-state="closed"><code><strong>What was copied for each post:</strong></code>
<ul class="[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3">
<li class="whitespace-normal break-words pl-2"><code><strong>Post record</strong> with all original timestamps preserved (<code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">created_at</code> and <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">modified_at</code>)</code></li>
<li class="whitespace-normal break-words pl-2"><code><strong>Featured images</strong> — <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">SCR-20251210-qaed.png</code> for Tell Time Again, <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">audio-8324329_1280.png</code> for Cross-pollinating</code></li>
<li class="whitespace-normal break-words pl-2"><code><strong>All media files</strong> including responsive/webp variants (7 files for post 68, 19 files for post 69), all with original file timestamps preserved via <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">cp -rp</code></code></li>
<li class="whitespace-normal break-words pl-2"><code><strong>Tag associations</strong> — Tell Time Again: llm, toy-code, claude, github; Cross-pollinating: llm, claude, tech</code></li>
<li class="whitespace-normal break-words pl-2"><code><strong>Additional metadata</strong> — <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">_core</code> and <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">postViewSettings</code> for both posts</code></li>
<li class="whitespace-normal break-words pl-2"><code><strong>Post status</strong> — both set to <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]">published</code> as in the source</code></li>
</ul>
<p>Straightforward, but effective!</p>
</div>
</div>
</div>
</div>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Spotify&#x27;s Page Match executes one of the first ideas I ever had for LLMs</title>
        <author>
            <name>Matt Sayar</name>
        </author>
        <link href="https://mattsayar.com/spotifys-page-match-executes-one-of-the-first-ideas-i-ever-had-for-llms/"/>
        <id>https://mattsayar.com/spotifys-page-match-executes-one-of-the-first-ideas-i-ever-had-for-llms/</id>
        <media:content url="https://mattsayar.com/media/posts/67/ri_ya-headphones-6707573_1280.jpg" medium="image" />
            <category term="tech"/>
            <category term="llm"/>
            <category term="household"/>

        <updated>2026-02-11T23:07:32-07:00</updated>
            <summary type="html">
                <![CDATA[
                        <img src="https://mattsayar.com/media/posts/67/ri_ya-headphones-6707573_1280.jpg" alt="" />
                    I started reading Seveneves years ago. Halfway through, I put it down and read something else. A couple years later, I picked it up again. Unfortunately, I didn't remember anything from before, and I only sorta remembered what was going on as I finally finished&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                    <p><img src="https://mattsayar.com/media/posts/67/ri_ya-headphones-6707573_1280.jpg" class="type:primaryImage" alt="" /></p>
                <p>I started reading <a href="https://en.wikipedia.org/wiki/Seveneves">Seveneves</a> years ago. Halfway through, I put it down and read something else. A couple years later, I picked it up again. Unfortunately, I didn't remember anything from before, and I only sorta remembered what was going on as I finally finished it. If only there was <a href="https://mattsayar.com/tags/llm/">some technology</a> that could have summarized the book up until that point! This was one of the first ideas I had for LLMs after ChatGPT came out.</p>
<p class="msg msg--info"><strong>Mini Seveneves review</strong>: I liked it! I don't remember why I put it down, but reviewers typically malign the last half/third of the book. I stopped before that but enjoyed the entire story. In typical Neal Stephenson fashion, the book doesn't so much <em>end</em> as it just <em>stops</em>. I look at our moon with more reverence after reading it, which indicates the book has left a lasting impression on me.</p>
<p>I've been <a href="https://mattsayar.com/cross-pollinating-amazon-and-spotify/">listening to some audiobooks on Spotify</a> since it's included with my Premium subscription. Spotify just released a feature to keep your audiobooks and physical or ebooks in sync. You load up your audiobook in Spotify, tap Page Match, and then point it at your book/ebook and the audiobook will load at that page. When you're done advancing through the audiobook, do it in reverse: tap Page Match and point it at your book, and it will tell you to turn the pages until you're synced. </p>
<figure class="post__image post__image--center"><img loading="lazy"  src="https://mattsayar.com/media/posts/67/unnamed-1-2.png" alt="" width="606" height="575" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/67/responsive/unnamed-1-2-xs.png 640w ,https://mattsayar.com/media/posts/67/responsive/unnamed-1-2-sm.png 768w ,https://mattsayar.com/media/posts/67/responsive/unnamed-1-2-md.png 1024w ,https://mattsayar.com/media/posts/67/responsive/unnamed-1-2-lg.png 1366w ,https://mattsayar.com/media/posts/67/responsive/unnamed-1-2-xl.png 1600w ,https://mattsayar.com/media/posts/67/responsive/unnamed-1-2-2xl.png 1920w"></figure>
<p>Amazon obviously has the best interoperability between Audible audiobooks and Kindle ebooks, <a href="https://mattsayar.com/i-didnt-want-to-pay-for-a-newsletter-email-service-so-i-built-my-own/">but I don't want to pay for yet another service</a>. Page Match works pretty well! But it has a little room for improvement.</p>
<h3>Feature request</h3>
<p>One downside is you <em>must</em> have a second device to scan. I primarily read on my Kindle, but I rarely have it near me when I want to listen to the audiobook. However, I have the Kindle app on my phone, and the app syncs with my physical Kindle.</p>
<p>I wish I could upload an image of my current page instead of scanning the page with the camera. I'm sure this is some kind of legal or license limitation. </p>
<p>Update: Looks like this feature <a href="https://techcrunch.com/2026/02/12/spotify-says-its-best-developers-havent-written-a-line-of-code-since-december-thanks-to-ai/">may have been written by AI</a>, which is beautifully full-circle. I wonder if the "Honk" system mentioned in the article uses <a href="https://github.com/block/goose">Goose</a>. </p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Orchestrating AI Agents for Job Searching</title>
        <author>
            <name>Matt Sayar</name>
        </author>
        <link href="https://mattsayar.com/orchestrating-ai-agents-for-job-searching/"/>
        <id>https://mattsayar.com/orchestrating-ai-agents-for-job-searching/</id>
        <media:content url="https://mattsayar.com/media/posts/66/artesitalia-conductor-5157153_1920.jpg" medium="image" />
            <category term="tech"/>
            <category term="send_newsletter"/>
            <category term="llm"/>
            <category term="claude"/>

        <updated>2026-02-10T11:41:13-07:00</updated>
            <summary type="html">
                <![CDATA[
                        <img src="https://mattsayar.com/media/posts/66/artesitalia-conductor-5157153_1920.jpg" alt="" />
                    I got tired of all the manual processes involved with job searching and wrote a Claude Cowork plugin to automate the boring parts. My typical search process looks like this: Working with my career coach (the excellent Alex Gould) I've automated bits and pieces of&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                    <p><img src="https://mattsayar.com/media/posts/66/artesitalia-conductor-5157153_1920.jpg" class="type:primaryImage" alt="" /></p>
                <p>I got tired of all the manual processes involved with job searching and wrote a <a href="https://claude.com/product/cowork">Claude Cowork</a> plugin to automate the boring parts.</p>
<p>My typical search process looks like this:</p>
<ol>
<li>Find jobs on LinkedIn that seem to be a good fit for me, typically using LinkedIn's "<a href="https://www.linkedin.com/jobs/collections/top-applicant/">Top Applicant</a>" feature.</li>
<li>Review the job description and verify that it meets my criteria for background fit, salary, location, etc.</li>
<li>Look for the hiring manager or recruiter for that position. It's not always listed on the job description itself, so I spend a lot of time searching LinkedIn and Google manually.</li>
<li>Tailor my resume to the job description.</li>
<li>Fill out the application. Sometimes, this means writing a cover letter.</li>
<li>Record a Loom video of myself to introduce myself to the recruiter and/or hiring manager.</li>
<li>Email my resume and Loom video to the decision makers </li>
</ol>
<p>Working with my career coach (the excellent <a href="https://www.linkedin.com/in/alexandermgould/">Alex Gould</a>) I've automated bits and pieces of this process, but most of it is ripe for automation with LLMs.</p>
<p>Claude Cowork ships with some <a href="https://support.claude.com/en/articles/13345190-getting-started-with-cowork#h_0f9e0998dd">out-of-the-box plugins</a>, but I wanted to make my own specifically tailored to job searching.</p>
<h3>How I made the plugin</h3>
<p>I used Claude to write more Claude. Anthropic dogfoods Claude extensively, which is how <a href="https://x.com/barry_zyj/status/1978951690452615413">they made skills that power Cowork in the first place</a>. I recently read a <a href="https://news.ycombinator.com/item?id=46947409">Hacker News comment</a> with an appealing workflow, and I wanted to emulate that setup. I'm using a Mac instead of Linux, so my setup is more like:</p>
<ul>
<li>Window management: <a href="https://rectangleapp.com/">Rectangle</a></li>
<li>Voice dictation: <a href="https://goodsnooze.gumroad.com/l/macwhisper">MacWhisper</a> (paid version)</li>
<li>LLM: <a href="https://support.claude.com/en/articles/11049741-what-is-the-max-plan">Claude Max</a> (yes, I upgraded for more Opus)</li>
</ul>
<p class="msg msg--highlight ">Writing (and using!) my plugin devours tokens, and the Claude Pro plan wasn't cutting it anymore. I almost exclusively use the new Opus 4.6, which consumes more usage. The previous models, even the formerly-impressive Sonnet 4.5, just weren't capable of performing steps like finding the hiring manager. They would search LinkedIn for "[company_name] recruiter" then present the first result triumphantly. Opus 4.6 will search LinkedIn for appropriate managerial titles, cross-coordinate with Google searches, and reason about which person is more likely to be the hiring manager based on their profile description.</p>
<p>Next, I spun up a GitHub repo and told Claude to use <a href="https://github.com/anthropics/knowledge-work-plugins">Anthropic's</a> as a template to create a <code>job-search-coworker</code> plugin. Then, I used Claude Code to orchestrate four different agents to work on four independent commands:</p>
<ul>
<li><code>find-leads</code> This will open LinkedIn in my browser and go through my Top Applicant positions and pull them in to a spreadsheet. </li>
<li><code>customize-resume</code> Given a job description, or link to one, it will take my master resume and tailor it to the job description. </li>
<li><code>find-decision-makers</code> Given a job description, it will find the recruiter and hiring manager for that position.</li>
<li><code>generate-loom-script</code> With all the information above, it will help me write a quick script that I can use to record a video of myself introducing myself to the decision makers. </li>
</ul>
<p>While each agent was working on each command, I was able to bounce between them and iterate as they completed at different times. I was able reuse a lot of the content from my career coach to enrich each command. That information isn't free, otherwise I'd show my work! </p>
<p>All of these commands coordinate their operations via a centralized Google Sheet. When using this plugin, each row is associated with a position where I can track my application status and prevent duplicate entries each time I run <code>find-leads</code>.</p>
<h3>Usage</h3>
<p>Running this involves loading Claude Cowork and firing off the <code>find-leads</code> command, reviewing the spreadsheet and pruning rows/positions I don't like, then firing off <code>find-decision-makers</code> followed by <code>customize-resume</code> and <code>generate-loom-script</code>.</p>
<p>For future improvements I've considered having it write the cover letters, fill out the application fields, and sending the emails. However, I hesitate with each of these features. For cover letters, I'm happy to have the LLM write a first draft, but I <em>like</em> writing (see: this site) and I want to keep my human touch there. For filling out the applications themselves, lots of them autofill the fields with your uploaded resume already, and watching LLMs navigate websites is still painful. For sending the emails, I still struggle mightily with allowing LLMs access to my email, especially since prompt injection is a risk that <a href="https://simonwillison.net/tags/prompt-injection/">still isn't solved</a>.</p>
<p>To be clear, this is still an involved process. I don't believe in the "spray-and-pray" approach to job hunting. I don't want to waste my time, or an organization's time, applying to positions that aren't mutually beneficial. I watch Claude navigate my browser like a hawk, since it's logged into my accounts and running scripts to build sheets. From a risk perspective, I'm giving Claude a long leash, but it's worth the time-savings. From a numbers standpoint, I was able to quadruple the number of positions I was able to review and apply to compared to the manual process.</p>
<p>Now that I'm done productively procrastinating, it's time to buckle down and start applying. But let me publish this post first...</p>
            ]]>
        </content>
    </entry>
    <entry>
        <title>ChatGPT made me strong</title>
        <author>
            <name>Matt Sayar</name>
        </author>
        <link href="https://mattsayar.com/chatgpt-made-me-strong/"/>
        <id>https://mattsayar.com/chatgpt-made-me-strong/</id>
        <media:content url="https://mattsayar.com/media/posts/54/gym.jpg" medium="image" />
            <category term="send_newsletter"/>
            <category term="llm"/>
            <category term="fitness"/>
            <category term="claude"/>
            <category term="chatgpt"/>

        <updated>2026-02-09T12:59:00-07:00</updated>
            <summary type="html">
                <![CDATA[
                        <img src="https://mattsayar.com/media/posts/54/gym.jpg" alt="" />
                    The fitness wars with AI have escalated. It started four months ago when OpenAI put out an ad showing how you can use ChatGPT for fitness. Anthropic recently responded by making fun of OpenAI for putting ads in ChatGPT (starting today). We'll see how long&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                    <p><img src="https://mattsayar.com/media/posts/54/gym.jpg" class="type:primaryImage" alt="" /></p>
                <p>The fitness wars with AI have escalated. It started four months ago when OpenAI put out an ad showing how you can use ChatGPT for fitness.</p>
<figure class="post__video"><iframe loading="lazy" width="560" height="314" src="https://www.youtube.com/embed/IqC3YrIzbQw?si=kH7zeAEmxGUaqYGQ" allowfullscreen="allowfullscreen" data-mce-fragment="1"></iframe></figure>
<p>Anthropic recently responded by making fun of OpenAI for putting ads in ChatGPT (<a href="https://openai.com/index/testing-ads-in-chatgpt/">starting today</a>).</p>
<figure class="post__video"><iframe loading="lazy" width="560" height="314" src="https://www.youtube.com/embed/kQRu7DdTTVA" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen" data-mce-fragment="1"></iframe></figure>
<p>We'll see how long Anthropic holds out before <a href="https://www.pcmag.com/news/anthropics-super-bowl-ad-was-less-of-a-chatgpt-takedown-than-expected">inevitably introducing ads themselves</a>. I tend to prefer Claude for most things, but joke's on them, because I already used ChatGPT to get strong.</p>
<p>In early 2025, I started to focus more seriously on my health, and I remembered reading an article in late 2024 from Men's Health about <a href="https://www.menshealth.com/fitness/a62629358/ai-personal-training-fitness/">using ChatGPT to replace a fitness trainer</a>. Unfortunately, the author was pretty biased, and most of the issues stemmed from a lack of understanding about how to effectively use LLMs. I decided to try it myself with the requisite context.</p>
<h3>Context</h3>
<p><a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">Context engineering</a> is one of the most critical things to get right to get the most effective output from LLMs. I compiled the best data I could for an effective prompt including:</p>
<ul>
<li>6 months of training data - I've been inconsistently strength training at the gym for years and have recorded my exercises, weights, and reps consistently in the same <a href="https://www.fitnotesapp.com/">FitNotes app</a>. I exported that data in .csv format to share with my prompt.</li>
<li><a href="https://www.menshealth.com/fitness/a64058757/muscle-building-plan/">Muscle Building Plan</a> - Ironically, the Men's Health editor failed to ask ChatGPT to use their own resources to build a plan. I didn't. I told ChatGPT to use this as its source of truth to ground any fitness plan.</li>
<li>Research mode - This caused the LLM to pull the latest health research and scientific studies to validate and tailor the training plan to me.</li>
<li>My health history - I detailed my history of shoulder issues to ensure the plan didn't aggravate those</li>
<li>Personal preferences - I specified I wanted to do three days per week, one hour per workout. I asked it to prioritize hypertrophy (bigger muscle size) and long-term injury prevention.</li>
</ul>
<p>This kicked out a great weekly schedule that I saved to a PDF and now reference each day in the gym. Over time, I asked for substitutions and variations as I injured my knees or grew bored with the plan. </p>
<p>Eventually, I moved the plan to Claude and massaged it more. I added recommended rest periods, and even an optional 4th day of accessory work. You can see the plan here.</p>
<figure class="post__image"><img loading="lazy"  src="https://mattsayar.com/media/posts/54/SCR-20260209-mkad.png" alt="" width="680" height="807" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkad-xs.png 640w ,https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkad-sm.png 768w ,https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkad-md.png 1024w ,https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkad-lg.png 1366w ,https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkad-xl.png 1600w ,https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkad-2xl.png 1920w"></figure>
<p>This plan does a great job of balancing push/pull activities, as well as compound and isolated exercises. All backed by research and the latest in diet and nutrition. And no, I don't skip leg day!</p>
<h3>Results</h3>
<p>I've been pretty happy with it. I paired my plan with eating better (using the <a href="https://macrofactor.com/">MacroFactor app</a>), and over the course of just five months I saw real progress. Obviously, LLMs didn't consistently drag me to the gym three times a week or force me to eat healthier, but I stuck to the plan, and I've been happier and healthier ever since.</p>
<figure class="post__image post__image--center"><img loading="lazy" src="https://mattsayar.com/media/posts/54/SCR-20260209-mkwx.jpeg" alt="" width="1094" height="691" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkwx-xs.jpeg 640w ,https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkwx-sm.jpeg 768w ,https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkwx-md.jpeg 1024w ,https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkwx-lg.jpeg 1366w ,https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkwx-xl.jpeg 1600w ,https://mattsayar.com/media/posts/54/responsive/SCR-20260209-mkwx-2xl.jpeg 1920w">
<figcaption>Left: June 2023 - Right: May 2025</figcaption>
</figure>
            ]]>
        </content>
    </entry>
    <entry>
        <title>Let AI catalog your house for insurance</title>
        <author>
            <name>Matt Sayar</name>
        </author>
        <link href="https://mattsayar.com/let-ai-catalog-your-house-for-insurance/"/>
        <id>https://mattsayar.com/let-ai-catalog-your-house-for-insurance/</id>
        <media:content url="https://mattsayar.com/media/posts/65/SCR-20260116-lanc-2.jpeg" medium="image" />
            <category term="send_newsletter"/>
            <category term="llm"/>
            <category term="household"/>
            <category term="gemini"/>
            <category term="colorado"/>

        <updated>2026-01-20T15:38:10-07:00</updated>
            <summary type="html">
                <![CDATA[
                        <img src="https://mattsayar.com/media/posts/65/SCR-20260116-lanc-2.jpeg" alt="house on fire" />
                    If my house ever burned down, I like to think I would get over it pretty quickly. It's just a box holding a bunch of my stuff, right? Insurance will rebuild it, and I'll fill it with stuff again. Over time, it's become less of&hellip;
                ]]>
            </summary>
        <content type="html">
            <![CDATA[
                    <p><img src="https://mattsayar.com/media/posts/65/SCR-20260116-lanc-2.jpeg" class="type:primaryImage" alt="house on fire" /></p>
                <p>If my house ever burned down, I like to think I would get over it pretty quickly. It's just a box holding a bunch of my stuff, right? Insurance will rebuild it, and I'll fill it with stuff again. Over time, it's become less of a house and more of a home, and I know it won't be that easy. I can start to make it easier for future-me by documenting everything in my house right now.</p>
<p>It took me over a decade of homeownership, but I finally <a href="https://magazine.northeast.aaa.com/daily/insurance/homeowners-insurance/benefits-making-home-inventory-video/">walked through my house while recording a video</a> of everything I own. But if the day ever comes, it'll be a pain to write out everything that's in the video. So I'm going to make Gemini do it. </p>
<p>I picked Gemini because I remembered a <a href="https://simonwillison.net/2024/Feb/21/gemini-pro-video/">video Simon Willison posted</a> a while back documenting a bunch of books on his shelf and Gemini was able to convert it into json. That video is seven seconds. My video is <em>fifteen minutes</em>. Let's see how it does.</p>
<p>First and foremost, my 4GB video needs to be under 2GB.</p>
<figure class="post__image post__image--center"><img loading="lazy"  src="https://mattsayar.com/media/posts/65/SCR-20260120-mbzl.png" alt="" width="782" height="334" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/65/responsive/SCR-20260120-mbzl-xs.png 640w ,https://mattsayar.com/media/posts/65/responsive/SCR-20260120-mbzl-sm.png 768w ,https://mattsayar.com/media/posts/65/responsive/SCR-20260120-mbzl-md.png 1024w ,https://mattsayar.com/media/posts/65/responsive/SCR-20260120-mbzl-lg.png 1366w ,https://mattsayar.com/media/posts/65/responsive/SCR-20260120-mbzl-xl.png 1600w ,https://mattsayar.com/media/posts/65/responsive/SCR-20260120-mbzl-2xl.png 1920w"></figure>
<p>I asked it for a good <code>ffmpeg</code> command to reduce the file size, and it suggested downsizing it to 1080p from its original 4k. That may ultimately make it harder for the AI to "see" and catalog some items, but that's a tradeoff I'm fine with. If it still gets 80% of the list correct, that's a great start.</p>
<p><code>ffmpeg -i house_walkthrough.mp4 -c:v libx265 -crf 24 -preset fast -vf scale=1080:-1 -c:a aac -b:a 128k house_walkthrough_1080p_fast.mp4</code></p>
<p>I only know what ffmpeg does, but not all its flags and options. I like just telling LLMs what I want to do with the video and why, and it does the CLI for me. Unfortunately, it still takes a while to render video. In this case, almost 15 minutes.</p>
<p>Next, I upload the &lt;2GB video to Gemini and prompt it:</p>
<pre>This video is a walkthrough of my entire property to document my belongings for insurance purposes. Take note of each room I walk through and document every belonging that could be lost in an event like a fire and need replacement. Output the full list in markdown, divided by room. Each item needs to be on its own line. </pre>
<p>It kicked out a list within a minute. I followed up once to make it more comprehensive and it was pretty good!</p>
<pre><strong>...<br>Living Room</strong><br>Sofa (dark fabric, 3-cushion)<br>Accent pillows (patterned)<br>Velvet armchair (teal/grey)<br>Patterned slipper chair<br>Black velvet ottomans (2)<br>Floor lamp<br>White bookshelf<br>Large wall clock (teal rim)<br>Globe<br>Lego Sets:<br>    Star Wars Millennium Falcon (Large Collector's Series box)<br>    Technic Mack Truck<br>    Various smaller boxed sets<br>National Geographic Geode kit<br>Framed family photo collage (7 frames)<br><strong>...</strong></pre>
<p>It's not perfect, but like most output from LLMs: it's a good start that saves me a ton of time. Additionally, for insurance companies, you need to be <a href="https://www.reddit.com/r/personalfinance/comments/43iyip/comment/cziljy3/">very thorough about your possessions</a> to get the best possible outcome for yourself. I copied in that reddit post in my next prompt and told Gemini to use it as a guideline for building my own list.</p>
<pre data-path-to-node="0">Here is the "fucking comprehensive" insurance inventory you requested. I have applied the "adjuster's guideline" logic to every single room. I have broken down composite items (like beds) into their individual components and listed the "mundane bullshit" that adds up to thousands of dollars in a total loss claim.</pre>
<p>That nearly doubled the length of the list it previously gave me! </p>
<p>Now I have a <code>house_list.md</code> file and I want to see if <a href="https://claude.com/blog/cowork-research-preview">Claude Cowork</a> can give me a inventory of products and links to buy them. I created a <code>claude_cowork</code> directory containing that md file, then prompted</p>
<div class="group relative inline-flex gap-2 bg-bg-300 rounded-xl pl-2.5 py-2.5 break-words text-text-100 transition-all max-w-[75ch] flex-col !px-4 max-w-[85%]">
<div class="flex flex-row gap-2 relative">
<div class="flex-1">
<div class="font-large !font-user-message grid grid-cols-1 gap-2 py-0.5 relative" data-testid="user-message">
<pre class="whitespace-pre-wrap break-words">I'm documenting all the possessions of my house in case of a catastrophe that requires me to replace everything. This folder contains a list of everything I've documented. Create me a spreadsheet of all the items, links to purchase new versions of the item, and the cost.</pre>
<p>It asked some followup questions to narrow the scope (cool), chugged along, and then... I hit my daily usage limit. This is the <em>only</em> thing I asked Claude today! I used to have the Max subscription but downgraded to Pro recently, and this is one of the first times I'm hitting this limit. Fortunately, this step isn't really <em>necessary</em> until tragedy befalls me, so I guess I'll just wait until tonight. </p>
<figure class="post__image"><img loading="lazy"  src="https://mattsayar.com/media/posts/65/SCR-20260120-ntyc.png" alt="" width="1260" height="1154" sizes="(max-width: 1920px) 100vw, 1920px" srcset="https://mattsayar.com/media/posts/65/responsive/SCR-20260120-ntyc-xs.png 640w ,https://mattsayar.com/media/posts/65/responsive/SCR-20260120-ntyc-sm.png 768w ,https://mattsayar.com/media/posts/65/responsive/SCR-20260120-ntyc-md.png 1024w ,https://mattsayar.com/media/posts/65/responsive/SCR-20260120-ntyc-lg.png 1366w ,https://mattsayar.com/media/posts/65/responsive/SCR-20260120-ntyc-xl.png 1600w ,https://mattsayar.com/media/posts/65/responsive/SCR-20260120-ntyc-2xl.png 1920w"></figure>
</div>
</div>
</div>
</div>
            ]]>
        </content>
    </entry>
</feed>
