{"version":"https://jsonfeed.org/version/1.1","title":"Patrick Gibbs: Writing","home_page_url":"https://patrickgibbs.dev/","feed_url":"https://patrickgibbs.dev/feed.json","language":"en-US","description":"Build notes from my own tools and websites, and lessons from software I've built and improved for clients.","items":[{"id":"https://patrickgibbs.dev/writing/agent-ready-personal-site/","url":"https://patrickgibbs.dev/writing/agent-ready-personal-site/","title":"What does it mean to connect an AI app to a website?","content_html":"<p>If you’re looking through my work, you can read the pages yourself or ask a compatible AI app to help. The connection lets your app request information directly from this site, including my profile, projects, résumé, and available meeting times.</p>\n<p>You may see this called an “agent-ready website”. Here, it means I’ve provided a structured version of my published information that software can request and read.</p>\n<h2 id=\"what-you-can-ask\">What you can ask</h2>\n<p>Once connected, try “What has Patrick built?”, “Find a project similar to mine”, or “Show me his résumé.” Your app can retrieve the relevant information and link you to the original pages.</p>\n<p>Unlike a passage copied into a chat, a new request can retrieve the site’s current published information. That gives the app a direct source, although it can still misunderstand or summarize something incorrectly.</p>\n<h2 id=\"what-stays-under-your-control\">What stays under your control</h2>\n<p>The connection only reads what I’ve published. Private client files and the details of my calendar events aren’t part of it, and it can’t change my pages. When you’re ready to book, pick a time yourself on the <a href=\"https://patrickgibbs.dev/connect/\">booking page</a>.</p>\n<p>An app can also submit a short note for my review. It doesn’t appear publicly until I approve it.</p>\n<h2 id=\"how-to-try-it\">How to try it</h2>\n<p>Open the <a href=\"https://patrickgibbs.dev/mcp/\">AI connection guide</a>, choose your app, and follow its setup instructions. Some apps require a step in their settings. The connection is working when your app successfully requests information from the site.</p>\n","summary":"You can connect a compatible AI app to this site and ask about my work. Here's what that connection does and how to try it.","date_published":"2026-09-14T00:00:00.000Z","tags":["Build notes","ai","knowledge"]},{"id":"https://patrickgibbs.dev/writing/mano-swartz-953-to-1627-tests/","url":"https://patrickgibbs.dev/writing/mano-swartz-953-to-1627-tests/","title":"Adding tests to software a business uses every day","content_html":"<p>Mano Swartz Furs uses software and AI agents I built to manage its fur-buying program. An AI agent checks customer photos and drafts replies in the owner’s voice, AI voice agents I built or maintain answer phone inquiries, and the software keeps track of offers and returns. The business kept using all of it while I made improvements.</p>\n<p>Automated tests help check that a change hasn’t broken behavior the business depends on. The recorded suite grew from 953 to 1,627 tests across 63 files by the September 2026 check.</p>\n<h2 id=\"what-the-number-tells-you\">What the number tells you</h2>\n<p>The count describes the checks in that suite. It doesn’t prove the software has no defects, or tell you by itself how valuable each test is. The important question is whether the checks cover behavior people need to rely on.</p>\n<p>In this project, that behavior sits around real work: checking customer photos, drafting replies, preparing offers, and keeping track of inquiries. Some checks cover the AI agent’s limits: which replies may go out on their own from the owner’s approved scripts, and which wait as drafts for his tap. The project record includes 20,054 photos returned to the client’s Google Drive and 689 inquiry records across 491 callers.</p>\n<h2 id=\"what-id-carry-into-another-project\">What I’d carry into another project</h2>\n<p>I’d start by identifying the actions people cannot afford to lose when the software changes. Then I’d make those actions part of the checks used to review a change.</p>\n<p>If you’re nervous about changing software your business relies on, tests are one part of the investigation. Clear requirements, reliable data, and a way to recover from a failed update matter too.</p>\n","summary":"For a fur-buying business, improving its software and AI agents also meant checking that customer inquiries, drafted replies, offers, and follow-up kept working.","date_published":"2026-09-14T00:00:00.000Z","tags":["Field notes","product"]},{"id":"https://patrickgibbs.dev/writing/music-exclusive-where-i-started/","url":"https://patrickgibbs.dev/writing/music-exclusive-where-i-started/","title":"Where I started with an inherited music platform","content_html":"<p>Music Exclusive is a music subscription platform. I joined to investigate and repair software built by a previous developer as the founder prepared for launch.</p>\n<p>The problems included account-access defects, unreliable scheduled tasks, and failures in the steps artists and fans needed to complete. My first job was to understand which failures could cause the most harm.</p>\n<h2 id=\"put-account-and-data-problems-first\">Put account and data problems first</h2>\n<p>An account takeover issue needed attention before cosmetic cleanup. I prioritized access, identity, and payments, then worked through the rest of the findings.</p>\n<p>Across two audits, I resolved 15 security findings. The recorded four-day launch-readiness work also included checking 27 steps across the artist and fan experience.</p>\n<h2 id=\"make-the-next-change-easier-to-check\">Make the next change easier to check</h2>\n<p>Repairing the immediate problems was part of the job. I also removed obsolete code and added automated checks so later changes could be reviewed against a clearer baseline.</p>\n<p>For someone taking over unfamiliar software, my starting point would be the same: understand the existing behavior, identify the most consequential failures, and verify each repair before expanding the work.</p>\n<p>The case study explains the scope of my contribution and includes the founder’s account of working with me.</p>\n","summary":"Music Exclusive needed security and payment problems fixed before launch. The first decision was which problems to tackle first.","date_published":"2026-09-14T00:00:00.000Z","tags":["Field notes","rescue"]},{"id":"https://patrickgibbs.dev/writing/sgnews-89-second-backlog-run/","url":"https://patrickgibbs.dev/writing/sgnews-89-second-backlog-run/","title":"Finding articles that an automated publishing system skipped","content_html":"<p>SGNews is a news site that publishes through an AI editorial pipeline I built. AI rewrites each source story as a short briefing, and the pipeline publishes it. I also worked on how it collected source stories and handled failures.</p>\n<p>The project record counted 47,277 articles published between 7 May and 12 September 2026, including 2,445 in the final measured week. Those are historical figures from the site’s public data.</p>\n<h2 id=\"the-articles-left-behind\">The articles left behind</h2>\n<p>Thirteen articles had been skipped by earlier processing runs. Some source pages carried too little text for a full briefing, so I had the AI write a shorter summary for thin pages instead of skipping them. After that repair, a recorded run processed the thirteen articles in 89 seconds with no errors.</p>\n<p>That timing describes one run. The more useful lesson was that the waiting articles could be identified and recovered, instead of disappearing into an apparently successful process.</p>\n<h2 id=\"show-what-failed\">Show what failed</h2>\n<p>A source can stop working for several reasons: its page structure changes, it returns no article text, or access is blocked. Those failures need different fixes.</p>\n<p>I worked on identifying those conditions and keeping the processing queue moving through the waiting articles. For a business relying on automatic publishing, knowing what was skipped is part of knowing whether the system is working.</p>\n","summary":"At SGNews, repairing the publishing process included making skipped articles visible so they could be processed again.","date_published":"2026-09-14T00:00:00.000Z","tags":["Field notes","data"]},{"id":"https://patrickgibbs.dev/writing/vettique-missing-listing-not-proof/","url":"https://patrickgibbs.dev/writing/vettique-missing-listing-not-proof/","title":"Why missing supplier information shouldn't become a risk finding","content_html":"<p>Vettique is a supplier-assessment tool whose risk reports are written by an AI model. When I worked on it, missing information could push a supplier’s risk score up even when there wasn’t evidence that the supplier was unsafe.</p>\n<p>A business-directory search is one example. Failing to find a listing tells you that the search returned no listing; it doesn’t establish why the business is absent.</p>\n<h2 id=\"make-the-available-evidence-visible\">Make the available evidence visible</h2>\n<p>I connected seven sources of supplier information, including customs records, business listings, pricing information, and website checks, and rewrote the AI’s instructions so that evidence drives its analysis. The reports were also changed to show missing information separately from signs of risk.</p>\n<p>In one recorded example, a verified supplier’s score changed from 85, labeled AVOID, to 25, labeled PROCEED. That example illustrates a corrected assessment; it doesn’t establish the overall accuracy of the scoring system.</p>\n<h2 id=\"check-whose-records-youre-using\">Check whose records you’re using</h2>\n<p>The work also identified 396,339 shipment records assigned to the wrong suppliers. Those records were removed before launch.</p>\n<p>Adding sources is only useful if the information belongs to the business being assessed and the report makes its limitations clear. That’s the lesson I’d carry into another research or assessment tool.</p>\n","summary":"Vettique uses AI to assess suppliers. I changed how its reports used external information so missing records were distinguished from evidence of risk.","date_published":"2026-09-14T00:00:00.000Z","tags":["Field notes","data"]},{"id":"https://patrickgibbs.dev/writing/what-an-agent-ready-site-exposes/","url":"https://patrickgibbs.dev/writing/what-an-agent-ready-site-exposes/","title":"What your AI app can access on this site","content_html":"<p>I wanted someone exploring my work to be able to use their own AI app. That meant deciding what the app should be able to request and which actions should remain with the person using it.</p>\n<h2 id=\"information-the-app-can-request\">Information the app can request</h2>\n<p>A connected app can read my professional profile, résumé, projects, client stories, services, writing, and meeting options. It can also search for relevant work and check available meeting times.</p>\n<p>Those requests return information I’ve chosen to publish. They don’t give the app access to the private systems behind my client projects.</p>\n<h2 id=\"booking-stays-with-you\">Booking stays with you</h2>\n<p>The app works from what I’ve published. It doesn’t edit the website, open private files, or see the details of events on my calendar. To book a call, you pick and confirm a time yourself on the <a href=\"https://patrickgibbs.dev/connect/\">booking page</a>.</p>\n<p>Keeping that final step with you makes it clear which appointment you’re reserving. A suggested time and a confirmed reservation are different things.</p>\n<h2 id=\"a-small-exception-notes-for-review\">A small exception: notes for review</h2>\n<p>The connection includes a tool for submitting a short note. I review each one before it appears publicly. An app can submit a note for that review, but it cannot publish it directly.</p>\n<h2 id=\"checking-the-answer\">Checking the answer</h2>\n<p>A direct connection gives an AI app a source to work from; it doesn’t guarantee a correct answer. The setup prompt asks the app to confirm each successful request and to include links, so you can check what it tells you.</p>\n<p>If you’d like to try it, the <a href=\"https://patrickgibbs.dev/mcp/\">connection guide</a> includes instructions for compatible apps.</p>\n","summary":"The connection provides my published work and meeting availability. It keeps private information and appointment booking separate.","date_published":"2026-09-14T00:00:00.000Z","tags":["Build notes","ai","automation"]},{"id":"https://patrickgibbs.dev/writing/building-the-pixel-portrait/","url":"https://patrickgibbs.dev/writing/building-the-pixel-portrait/","title":"How I built a portrait you can pull apart","content_html":"<p>I wanted this website to feel like something I’d built, with a detail people could play with and remember. Ruben Marcus’s portfolio was the starting point. His digital portrait made me wonder what my own version could feel like.</p>\n<p>The first challenge was getting the image right. I wanted my arms and hands visible, as if I were working at the laptop. A close-up of my face wouldn’t tell the same story.</p>\n<h2 id=\"the-video-was-only-the-beginning\">The video was only the beginning</h2>\n<p>I tried generating a blue, pixelated video. Some attempts looked close until I watched them carefully. The laptop logo looked pasted on. In one clip, my eyes closed and stayed closed too long. Those small things were enough to make the whole image feel wrong.</p>\n<p>Once the video worked, simply putting it on the page wasn’t enough. I wanted visitors to affect it.</p>\n<p>The browser now uses the moving video as the source for a field of particles. Those particles can move away from their original positions while the underlying footage continues to play. That gives the scene somewhere precise to return to.</p>\n<h2 id=\"a-small-cursor-a-strong-response\">A small cursor, a strong response</h2>\n<p>My first correction was about the size of the disturbance. A large circle around the cursor made the portrait look smudged. Shrinking the circle helped, but reducing the force at the same time lost the effect I wanted.</p>\n<p>The useful distinction was between the area affected and how far the pixels moved. I wanted a narrow cut with enough movement to break up the image inside it.</p>\n<p>Fast movement brought another problem. The browser doesn’t report every position the cursor passes through. Connecting those reported positions keeps a quick swipe from jumping over the image without touching it.</p>\n<h2 id=\"the-whole-scene-belongs-together\">The whole scene belongs together</h2>\n<p>At first, a click only affected the portrait. Then I added tiny pixels around it and across the hero. They needed to feel connected, with the whole scene responding as one. A normal click disturbs the nearby area. In the Lab, Explode everything scatters the whole scene.</p>\n<p>I also removed the effect that made the whole portrait float with the cursor. It made me dizzy. Keeping the image fixed gave the smaller interactions room to work.</p>\n<p>The result still has motion, but it always has a stable place to return to. How the interaction feels when it settles mattered more to me than adding another effect.</p>\n<p><a href=\"https://patrickgibbs.dev/lab/portrait/\">Try the portrait in the Lab</a>, or <a href=\"https://patrickgibbs.dev/about-this-site/\">read about the tools and inspiration</a>.</p>\n","summary":"From a blue still image to a moving portrait that scatters under the cursor. The choices that made the interaction feel right.","date_published":"2026-09-10T00:00:00.000Z","tags":["Build notes","product"]}]}