<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tristan Deane</title>
    <description>The latest articles on DEV Community by Tristan Deane (@softwaretrizzey).</description>
    <link>https://dev.to/softwaretrizzey</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3825678%2Fcaa4f159-58e5-4931-98c3-01e458da53e9.png</url>
      <title>DEV Community: Tristan Deane</title>
      <link>https://dev.to/softwaretrizzey</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/softwaretrizzey"/>
    <language>en</language>
    <item>
      <title>You Probably Don't Need a Custom Agent</title>
      <dc:creator>Tristan Deane</dc:creator>
      <pubDate>Tue, 14 Apr 2026 15:20:19 +0000</pubDate>
      <link>https://dev.to/softwaretrizzey/you-probably-dont-need-a-custom-agent-2ga</link>
      <guid>https://dev.to/softwaretrizzey/you-probably-dont-need-a-custom-agent-2ga</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cqt43v0nmldnmccmvyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cqt43v0nmldnmccmvyu.png" alt="A developer feeds a skill card to a small orange robot agent while a large decommissioned robot sits in the background." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
&lt;strong&gt;Quick note on terms:&lt;/strong&gt; In this post, I'm using coding agent to mean tools you can use out of the box, like &lt;a href="https://code.claude.com/docs/en/overview" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; or &lt;a href="https://developers.openai.com/codex/cli" rel="noopener noreferrer"&gt;Codex CLI&lt;/a&gt;. A custom agent is the version you build yourself with an SDK or some hand-rolled harness when you want more control.&lt;br&gt;

&lt;/div&gt;


&lt;p&gt;There's a point in learning about agents where building your own starts to feel inevitable. I hit that stage during my studies and created &lt;a href="https://dev.to/softwaretrizzey/za-a-pizza-ordering-agent-2848"&gt;Za&lt;/a&gt;, an agent that orders pizza. After that, I put together a &lt;a href="https://github.com/software-trizzey/agent-template" rel="noopener noreferrer"&gt;GitHub template&lt;/a&gt; for spinning up self-built agents, mostly because I assumed I'd keep building more of them.&lt;/p&gt;

&lt;p&gt;Working on that template is when I came across skills, and it changed how I thought about the problem. A lot of what I'd been treating as a reason to build a custom harness was really a repeatable process that needed packaging.&lt;/p&gt;

&lt;p&gt;Don't get me wrong, bespoke agents still have their place. I just think a lot of people, myself included, reach for them before asking a simpler question: do I need a new system, or just a better way of working?&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a skill?
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://agentskills.io/what-are-skills" rel="noopener noreferrer"&gt;skill&lt;/a&gt; is basically a packaged process that agents use to expand their capabilities.&lt;/p&gt;

&lt;p&gt;Usually, that means a &lt;code&gt;SKILL.md&lt;/code&gt; file plus whatever supporting material is required to work. That could be documentation, prompt templates, or small utilities that make the result more repeatable.&lt;/p&gt;

&lt;p&gt;The important part is not the file format. It is that the instructions, examples, and supporting material live in one place, so the agent can approach the task the same way each time.&lt;/p&gt;

&lt;p&gt;For a concrete example, I built a skill that audits my GitHub repos and commit history to generate a developer profile with stack signals, proficiency indicators, and role directions that I can use when updating my resume or LinkedIn profile. &lt;a href="https://gist.github.com/software-trizzey/c6126d9ee6e3af0bad1145afe4201283" rel="noopener noreferrer"&gt;This gist shows the skill definition and sample outputs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When building your own becomes overhead
&lt;/h2&gt;

&lt;p&gt;Most teams don't require a tailored agent. What they need is a process that behaves consistently each time. Teaching an existing system how to handle a task is one kind of work; building and supporting the system itself is another.&lt;/p&gt;

&lt;p&gt;If the real need is repeatability, a capable coding agent and strong skills can get you surprisingly far. You can define the approach up front, anchor it with examples, and add scripts when you need more predictable output. Domain knowledge lives in the skill rather than being rebuilt from scratch in each session. In that kind of setup, the bespoke path often starts to look more like overhead than leverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a custom agent makes sense
&lt;/h2&gt;

&lt;p&gt;A purpose-built agent starts to make sense when you need system-level control, not just a cleaner workflow.&lt;/p&gt;

&lt;p&gt;Maybe the workflow has to plug directly into your product. Maybe tool access needs hard constraints. Maybe you need custom memory or routing, or better control than a general agent can provide.&lt;/p&gt;

&lt;p&gt;That level of control can be worth it, but it is not free. The harness, the edge cases, and the upkeep become your responsibility.&lt;/p&gt;

&lt;p&gt;If an existing coding agent with the right skill can do the job, I think that is the route to try first. It is faster, cheaper, and less distracting than building an agent stack around a workflow that never needed one.&lt;/p&gt;

&lt;p&gt;So, before you download that agentic SDK, ask the boring question: do I actually need to build my own, or do I just need a better setup?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Za: A Pizza Ordering Agent</title>
      <dc:creator>Tristan Deane</dc:creator>
      <pubDate>Tue, 07 Apr 2026 16:19:32 +0000</pubDate>
      <link>https://dev.to/softwaretrizzey/za-a-pizza-ordering-agent-2848</link>
      <guid>https://dev.to/softwaretrizzey/za-a-pizza-ordering-agent-2848</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa869p0chg99pyahe5d2a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa869p0chg99pyahe5d2a.gif" alt="Za demo showing the interactive pizza ordering flow" width="760" height="343"&gt;&lt;/a&gt;&lt;br&gt;Za demo showing the interactive pizza ordering flow
  &lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/software-trizzey/za" rel="noopener noreferrer"&gt;github.com/software-trizzey/za&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Build This
&lt;/h2&gt;

&lt;p&gt;I'd been reading about agentic systems for a while: tools, context windows, MCPs, agent loops. I understood the concepts on paper. I could explain them to someone else. But I still didn't &lt;em&gt;feel&lt;/em&gt; like I understood them, if that makes sense.&lt;/p&gt;

&lt;p&gt;The docs got me oriented. Anthropic's &lt;a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/build-a-tool-using-agent" rel="noopener noreferrer"&gt;tutorial&lt;/a&gt; on building an agent was a good introduction. I also found OpenAI's &lt;a href="https://developers.openai.com/api/docs/guides/function-calling" rel="noopener noreferrer"&gt;function calling&lt;/a&gt; doc valuable for learning more about tools.&lt;/p&gt;

&lt;p&gt;Those tutorials were useful primers, but they didn't get me over the hump. For me, the "aha" moment only happens when I build something for myself and watch it break. So I decided to build Za, a focused agent that orders pizza.&lt;/p&gt;

&lt;p&gt;The name is intentional: "za" as in "grab a slice of za." If that term is new to you, here's a fun &lt;a href="https://www.reddit.com/r/AskReddit/comments/3pqy2j/is_za_an_acceptable_word_to_use_for_pizza/" rel="noopener noreferrer"&gt;Reddit debate&lt;/a&gt;. I'm clearly in the yes camp.&lt;/p&gt;

&lt;p&gt;Why pizza? Mostly because the workflow is small enough to finish, but complex enough to actually learn from. You browse a menu, pick items, confirm the order, and check out. There's just enough surface area to touch the important parts of an agent system without disappearing into a product rabbit hole.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building an MVP
&lt;/h2&gt;

&lt;p&gt;To avoid one-shotting the whole system into existence, I decided to hand-code the important bits and keep myself engaged. It's been a while since I'd done that. Most of my day-to-day work is higher-level, so sitting down to write the agent harness, tool system, and context management from scratch felt good. I let AI help with glue code where it made sense, but I wanted the core primitives to come from my own keyboard. That was the whole point.&lt;/p&gt;

&lt;p&gt;The first version of Za was dead simple. It read menu items from a JSON file, passed them to the model along with the user's order, and printed the final result to the terminal. No browser. No REPL. Just the loop.&lt;/p&gt;

&lt;p&gt;But even that stripped-down version taught me something I hadn't fully grasped from reading. Tools in an agent system aren't magic. You define what tools exist, describe when and how to use them, and then write the handlers that do the actual work. It's just function calls with good labels. I'd read that before, but now I &lt;em&gt;understood&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;I also used &lt;a href="https://bun.com/" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; for the first time on this project. Built-in env handling, a clean file reader, no complaints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Tool Errors
&lt;/h2&gt;

&lt;p&gt;I had a working concept and figured the hard part was behind me.&lt;/p&gt;

&lt;p&gt;It was not.&lt;/p&gt;

&lt;p&gt;The happy path worked fine. Then the agent hallucinated a tool name. Next, it sent invalid JSON as a tool argument. After that, it sent valid JSON with the wrong argument types. Each failure needed its own handling strategy, and they kept coming.&lt;/p&gt;

&lt;p&gt;The one that caught me off guard was when the agent tried to place an order without getting human approval first. I'd set up a rule saying Za had to confirm with the user before submitting, but the agent just skipped it and went straight to placing the order. So I had to build a safeguard that rejected the tool call and sent the error back to the agent with instructions to ask for confirmation. Getting that loop right took more iteration than I expected.&lt;/p&gt;

&lt;p&gt;None of this should have surprised me. Regular software development is the same story: the feature takes a day, the edge cases take a week. But working through these failures gave me a real sense of what production agentic systems have to deal with. Guardrails aren't a nice-to-have. They're most of the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Local Files to a Real Website
&lt;/h2&gt;

&lt;p&gt;After patching edge cases and tidying up the codebase around clearer single-responsibility boundaries, I had something that worked end to end. Za could read a user's order from a file, place it on their behalf, and write the results to a local JSON memory file. That cache stored the last five orders and tracked a favorite for easy reordering on follow-up runs.&lt;/p&gt;

&lt;p&gt;Not bad for a learning project. But ordering from a flat file felt like half the problem. I wanted to see the agent work against a real website.&lt;/p&gt;

&lt;p&gt;I could have pointed Za at the actual Domino's site, but that pulls you into bot detection, auth flows, and payment handling fast. And probably a Terms of Service violation too. None of that was interesting for what I was trying to learn.&lt;/p&gt;

&lt;p&gt;So I decided to build a fake one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter Zamino's
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzts1ltk05o7bznvy382.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzts1ltk05o7bznvy382.png" alt="Zamino's menu page with pizza cards and active cart" width="800" height="579"&gt;&lt;/a&gt;&lt;br&gt;Zamino's menu page with pizza cards and active cart (Live demo: &lt;a href="https://zaminos.onrender.com/" rel="noopener noreferrer"&gt;https://zaminos.onrender.com/&lt;/a&gt;)
  &lt;/p&gt;

&lt;p&gt;The name came first. I was spoofing Domino's, and the agent was called Za.&lt;/p&gt;

&lt;p&gt;So naturally: Za + Domino's = Zamino's.&lt;/p&gt;

&lt;p&gt;Once I had the name, the rest of the joke needed a storefront. I didn't want to burn a week on frontend work for a mock site, so I tried &lt;a href="https://stitch.withgoogle.com/" rel="noopener noreferrer"&gt;Google Stitch&lt;/a&gt;, which had just been released. I took a screenshot of the Domino's pizza menu, passed it in with a short prompt, and Stitch spat out the site assets in one shot. From there I pointed my local coding agent at the output and had it wire everything up as a simple static site.&lt;/p&gt;

&lt;p&gt;This endeavor took all of thirty minutes from start to finish. Tech is getting pretty wild.&lt;/p&gt;

&lt;h2&gt;
  
  
  V2: MCPs &amp;amp; Browser Automation
&lt;/h2&gt;

&lt;p&gt;With Zamino's running, Za needed a way to actually interact with a browser. I already use the Playwright MCP server at work for validating things in the browser, so the mental model was there. The question was how to wire it into Za.&lt;/p&gt;

&lt;p&gt;I expected this to be complicated. It wasn't.&lt;/p&gt;

&lt;p&gt;After some research, I found &lt;a href="https://ts.sdk.modelcontextprotocol.io/" rel="noopener noreferrer"&gt;&lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt;&lt;/a&gt; and built the integration on top of that. I added MCP server config and plugged the external tools into Za's tool registry. The whole thing clicked into place faster than I expected, and it drove home something useful: MCPs are just third-party tool definitions. The agent treats them the same as any local tool. They're not a separate concept. They're just more tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Teaching Za to Navigate Websites
&lt;/h3&gt;

&lt;p&gt;With Playwright wired up, I refactored Za for a browser-based ordering flow. The core concepts stayed the same: read the menu, get the user's order, place it, save the result. But now there was a new step: discovery.&lt;/p&gt;

&lt;p&gt;Instead of hardcoding a menu URL, I let Za find the menu on its own. That was deliberate. It makes the agent more generally useful. In theory, Za could now work on any pizza website, not just Zamino's. After updating the tool definitions and tuning the system prompt, Za was placing orders from a live website end to end.&lt;/p&gt;

&lt;p&gt;Another satisfying moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Side Quest
&lt;/h2&gt;

&lt;p&gt;During V2 I added a simple REPL using &lt;a href="https://www.npmjs.com/package/cac" rel="noopener noreferrer"&gt;&lt;code&gt;cac&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://www.npmjs.com/package/@inquirer/prompts" rel="noopener noreferrer"&gt;&lt;code&gt;@inquirer/prompts&lt;/code&gt;&lt;/a&gt; so I could talk to the agent without building a full UI.&lt;/p&gt;

&lt;p&gt;That integration went smoothly, so I got ambitious.&lt;/p&gt;

&lt;p&gt;I wanted the order confirmation step to route through Inquirer's &lt;a href="https://github.com/SBoudrias/Inquirer.js/tree/main/packages/confirm" rel="noopener noreferrer"&gt;confirm prompt&lt;/a&gt;. The idea was a cleaner, more deterministic flow: the model triggers a specific CLI prompt, reads the user's yes or no, and proceeds accordingly. Clean in theory.&lt;/p&gt;

&lt;p&gt;In practice, though, the model surfaced the confirmation too early. Or it didn't read the result and asked for confirmation again. And again. Or it just ignored the prompt entirely and kept going. I spent more time fighting this one interaction than I did wiring up the entire MCP integration.&lt;/p&gt;

&lt;p&gt;I eventually scrapped the approach and let the model handle confirmation on its own, in plain conversation. It worked immediately. The irony wasn't lost on me: trying to make that single step more deterministic injected way more randomness into the system as a whole.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Za is feature-complete, and I don't plan to take it further. I absorbed the concepts I set out to learn. The biggest thing that stuck with me is how much of building an agent is really building the scaffolding &lt;em&gt;around&lt;/em&gt; the agent: tool error handling, guardrails, context management. The AI part is probably the easiest.&lt;/p&gt;

&lt;p&gt;For the builders, I extracted the core agent loop into a reusable template as a starting point for your own project.&lt;/p&gt;

&lt;p&gt;Check it below, and thanks for following the journey!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/software-trizzey" rel="noopener noreferrer"&gt;
        software-trizzey
      &lt;/a&gt; / &lt;a href="https://github.com/software-trizzey/agent-template" rel="noopener noreferrer"&gt;
        agent-template
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Agent Template&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A reusable Bun-based agent runtime that I'm using in different agentic projects/ideas.&lt;/p&gt;
&lt;p&gt;This template keeps runtime orchestration in &lt;code&gt;src/core/*&lt;/code&gt; and puts domain behavior
in profile modules under &lt;code&gt;src/profiles/*&lt;/code&gt;. New repositories can start with the
default profile, then replace it with their own domain-specific profile.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/core/*&lt;/code&gt;: domain-agnostic runtime (model adapter, session loop, tools, policies, CLI)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/profiles/default&lt;/code&gt;: starter profile (instructions, context derivation, providers, policy list, env)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/profile.ts&lt;/code&gt;: single selection seam for the active profile&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/index.ts&lt;/code&gt;: app composition and lifecycle wiring&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Use This as a Template&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new repository from this template and clone it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Private: &lt;code&gt;gh repo create my-new-agent --private --template software-trizzey/agent-template --clone&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Public: &lt;code&gt;gh repo create my-new-agent --public --template software-trizzey/agent-template --clone&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create your desired agent profile at &lt;code&gt;src/profiles/&amp;lt;your-profile&amp;gt;/index.ts&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Export it from &lt;code&gt;src/profile.ts&lt;/code&gt; as &lt;code&gt;activeProfile&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add profile tests in &lt;code&gt;test/profiles&lt;/code&gt; and contract coverage in &lt;code&gt;test/contracts/profileContractSuite.ts&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run validation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bun run typecheck&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/software-trizzey/agent-template" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Project Teapot: A Reimagined Resume Experience</title>
      <dc:creator>Tristan Deane</dc:creator>
      <pubDate>Sat, 14 Feb 2026 00:03:14 +0000</pubDate>
      <link>https://dev.to/softwaretrizzey/project-teapot-a-reimagined-resume-experience-2iig</link>
      <guid>https://dev.to/softwaretrizzey/project-teapot-a-reimagined-resume-experience-2iig</guid>
      <description>&lt;p&gt;&lt;a href="https://teapot.tristandeane.ca" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flalxr30cmvmn3rpfgymu.gif" alt="Project Teapot waving animation" width="200" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;/blockquote&gt;

&lt;p&gt;Live demo: &lt;a href="https://teapot.tristandeane.ca" rel="noopener noreferrer"&gt;teapot.tristandeane.ca&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Source code: &lt;a href="https://github.com/software-trizzey/project-teapot" rel="noopener noreferrer"&gt;github.com/software-trizzey/project-teapot&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Project Teapot?
&lt;/h2&gt;

&lt;p&gt;Project Teapot is a silly, interactive resume scanner inspired by &lt;a href="https://shop.merchant.dev/" rel="noopener noreferrer"&gt;shop.merchant.dev&lt;/a&gt;. I built it after seeing the site all over X and finding no public repo to learn from.&lt;/p&gt;

&lt;p&gt;So I reverse-engineered the flow through source inspection and network tracing, then rebuilt it in my own style.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Build It?
&lt;/h2&gt;

&lt;p&gt;I wanted to get better at breaking down polished frontend experiences, rebuilding them from observation, and then pushing the concept with my own UX ideas.&lt;/p&gt;

&lt;p&gt;The hard parts were mostly animation workflow and compositing. This included things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generated clips were inconsistent across tools and prompts&lt;/li&gt;
&lt;li&gt;Aspect ratio and framing mismatches made compositing tricky&lt;/li&gt;
&lt;li&gt;I wrote an &lt;code&gt;ffmpeg&lt;/code&gt; script to normalize renders into one format&lt;/li&gt;
&lt;li&gt;I started with RunwayML, then moved to Veo 3.1 via the Gemini API for better first-pass output&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Core UX Loop
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Visitor enters the scene&lt;/li&gt;
&lt;li&gt;HR-418 Robots greets them&lt;/li&gt;
&lt;li&gt;Visitor can click the resume scanner or menu to open the dialog tree&lt;/li&gt;
&lt;li&gt;Visitor uploads a resume or picks a sample&lt;/li&gt;
&lt;li&gt;Scan runs and returns feedback with insights&lt;/li&gt;
&lt;li&gt;Visitor can then exit or retry another resume&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Processing Resumes
&lt;/h2&gt;

&lt;p&gt;I wanted real uploads, while keeping everything local to the browser. &lt;code&gt;.docx&lt;/code&gt; parsing uses &lt;a href="https://github.com/mwilliamson/mammoth.js" rel="noopener noreferrer"&gt;mammothjs&lt;/a&gt;, and &lt;code&gt;.pdf&lt;/code&gt; files are parsed in a web worker with &lt;a href="https://github.com/mozilla/pdf.js" rel="noopener noreferrer"&gt;PDF.js&lt;/a&gt; so the UI stays responsive.&lt;/p&gt;

&lt;p&gt;After parsing, resumes go through a simple rule-based scorecard. Example: experience is +8, skills is +4, email is +2, and missing email is -20 (yes, intentionally brutal). I also score for impact signals like leadership, KPIs, and measurable outcomes.&lt;/p&gt;

&lt;p&gt;The output is totaled out of 100, categorized as &lt;code&gt;weak | medium | strong&lt;/code&gt;, and assigned a confidence score.&lt;/p&gt;

&lt;p&gt;It is intentionally deterministic and transparent. This is not a production ATS, just a playful baseline for demo purposes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Project Teapot is dev complete. I set out to recreate and extend a specific experience, and this version delivers on that goal.&lt;/p&gt;

</description>
      <category>showcase</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Djazzy: Write Cleaner, Faster, Scalable Django Code</title>
      <dc:creator>Tristan Deane</dc:creator>
      <pubDate>Sun, 05 Jan 2025 02:36:27 +0000</pubDate>
      <link>https://dev.to/softwaretrizzey/djazzy-write-cleaner-faster-scalable-django-code-1be5</link>
      <guid>https://dev.to/softwaretrizzey/djazzy-write-cleaner-faster-scalable-django-code-1be5</guid>
      <description>&lt;blockquote&gt;
&lt;/blockquote&gt;

&lt;p&gt;⚠️ Update: Djazzy is now deprecated due to the advent of AI coding agents&lt;/p&gt;

&lt;p&gt;Source code: &lt;a href="https://github.com/software-trizzey/djazzy-vscode" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Djazzy?
&lt;/h2&gt;

&lt;p&gt;Djazzy is an IDE extension I built to help development teams maintain high-quality Django codebases. It automates the enforcement of Django best practices, runs security checks, and ensures consistent code conventions across projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Build It?
&lt;/h2&gt;

&lt;p&gt;While working on large Django applications, I noticed our team spending significant time on code reviews, catching the same issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inconsistent variable names and project structure&lt;/li&gt;
&lt;li&gt;Missing security configurations&lt;/li&gt;
&lt;li&gt;Non-optimal database queries&lt;/li&gt;
&lt;li&gt;Overlooked Django-specific best practices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than repeatedly documenting these issues, I created Djazzy to automate these checks and provide immediate feedback to developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automated Linting&lt;/strong&gt; : Custom Django-specific linting rules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Scanning&lt;/strong&gt; : Checks for common Django security misconfigurations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Analysis&lt;/strong&gt; : Identifies potential database query optimizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convention Enforcement&lt;/strong&gt; : Ensures consistent project structure and naming&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD Integration&lt;/strong&gt; : Seamlessly integrates with popular CI/CD pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supported IDEs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cursor.com/" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Impact
&lt;/h2&gt;

&lt;p&gt;While still in beta, Djazzy has significantly reduced our code review cycles and helped maintain consistent quality across our Django projects. It serves as both a learning tool for junior developers and a safety net for experienced ones.&lt;/p&gt;

</description>
      <category>django</category>
      <category>vscode</category>
      <category>cleancode</category>
      <category>cursor</category>
    </item>
  </channel>
</rss>
