<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[joegarcia.dev]]></title><description><![CDATA[joegarcia.dev]]></description><link>https://joegarcia.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 20:55:11 GMT</lastBuildDate><atom:link href="https://joegarcia.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[SAPA Executor: From Phase Briefs to Shipped Code]]></title><description><![CDATA[A few days ago I wrote about SAPA, which is basically a way to figure out how much planning you actually need before you start building something. The idea was to stop over-documenting throwaway projects and under-documenting the ones that matter.
It...]]></description><link>https://joegarcia.dev/sapa-executor-bridging-planning-and-building</link><guid isPermaLink="true">https://joegarcia.dev/sapa-executor-bridging-planning-and-building</guid><category><![CDATA[claude-code]]></category><category><![CDATA[sapa]]></category><category><![CDATA[#ai-tools]]></category><category><![CDATA[developer productivity]]></category><category><![CDATA[#PromptEngineering]]></category><category><![CDATA[prompting]]></category><dc:creator><![CDATA[Joe Garcia]]></dc:creator><pubDate>Mon, 26 Jan 2026 15:00:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769388125096/2722f29a-0263-4dc2-b29e-b550be850b09.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few days ago I wrote about SAPA, which is basically a way to figure out how much planning you actually need before you start building something. The idea was to stop over-documenting throwaway projects and under-documenting the ones that matter.</p>
<p>It worked pretty well for that. But I ran into a problem I didn't really anticipate.</p>
<h2 id="heading-the-gap-i-didnt-think-about">The Gap I Didn't Think About</h2>
<p>SAPA gets you to what I called Phase Briefs. They look something like this:</p>
<pre><code class="lang-markdown"><span class="hljs-section"># Phase Brief: Core Module</span>

<span class="hljs-section">## Context</span>
Greenfield - first phase after project setup

<span class="hljs-section">## Objective</span>
Implement the primary data processing pipeline

<span class="hljs-section">## Deliverables</span>
<span class="hljs-bullet">-</span> [ ] pipeline.rs module
<span class="hljs-bullet">-</span> [ ] CLI commands for processing
<span class="hljs-bullet">-</span> [ ] Configuration loader

<span class="hljs-section">## Acceptance Criteria</span>
<span class="hljs-bullet">-</span> Processes input files correctly
<span class="hljs-bullet">-</span> Handles errors gracefully
<span class="hljs-bullet">-</span> Works on Windows and macOS
</code></pre>
<p>And that's... fine? Like, a human reading that knows what to do. But I wasn't handing it to a human. I was handing it to Claude Code.</p>
<p>What I kept running into was Claude Code asking me clarifying questions. "What's the file structure look like?" "Which error handling crate should I use?" "Where does the config file go?"</p>
<p>All reasonable questions. But I was spending the first 20 minutes of every session just re-explaining context that probably should have been written down somewhere.</p>
<p>The brief told Claude Code what to build. It didn't tell it how.</p>
<h2 id="heading-what-i-started-doing-instead">What I Started Doing Instead</h2>
<p>So I started writing longer specs. Instead of bullet points, I'd include actual file paths, code scaffolds, validation steps, that kind of thing. More like a technical design doc than a brief.</p>
<p>The sessions got way more productive. Claude Code would just... go. For hours sometimes, without stopping to ask me things it should already know.</p>
<p>Eventually I realized I was doing the same expansion every time. Brief comes in, I flesh it out, Claude Code executes it. Same pattern over and over.</p>
<p>So I turned it into a skill.</p>
<h2 id="heading-what-the-skill-does">What the Skill Does</h2>
<p>I'm calling it SAPA Executor. It sits on top of the original SAPA framework and basically automates that expansion step.</p>
<p>The workflow ends up being:</p>
<ol>
<li><p>Plan in Claude Web using SAPA, which gives you a <code>PHASE_PLAN.md</code></p>
</li>
<li><p>Copy that file to your project</p>
</li>
<li><p>Tell Claude Code to generate the phases</p>
</li>
<li><p>Execute them one at a time</p>
</li>
</ol>
<p>The skill handles three things that SAPA didn't:</p>
<p><strong>Expansion</strong> is the main one. It takes those short briefs and turns them into detailed specs with file paths, scaffolds, implementation notes, test scenarios.</p>
<p><strong>Tracking</strong> was something I added after losing my place a few times. There's a <code>PHASE_INDEX.md</code> that keeps track of which phases are done, which session UUIDs go with which phase, and any notes or discoveries along the way.</p>
<p><strong>Validation</strong> is just making sure each phase actually works before moving on. Checklists, basically.</p>
<h2 id="heading-what-the-format-looks-like">What the Format Looks Like</h2>
<p>Here's a simplified version of what comes out of SAPA:</p>
<pre><code class="lang-markdown"><span class="hljs-section"># Phase Plan: [Project Name]</span>

<span class="hljs-section">## Overview</span>
<span class="hljs-strong">**Project**</span>: [Name]
<span class="hljs-strong">**Type**</span>: [CLI / Desktop App / Library / etc.]
<span class="hljs-strong">**Stack**</span>: [Key technologies]

<span class="hljs-section">## Architecture Overview</span>
[Diagram or description]

<span class="hljs-section">## Phases</span>

<span class="hljs-section">### Phase 1: Project Setup</span>
<span class="hljs-strong">**Objective**</span>: Initialize project with proper structure
<span class="hljs-strong">**Deliverables**</span>: Config files, module stubs, build scripts
<span class="hljs-strong">**Acceptance**</span>: Project compiles and runs placeholder

<span class="hljs-section">### Phase 2: Core Module</span>
<span class="hljs-strong">**Objective**</span>: Implement primary functionality
<span class="hljs-strong">**Deliverables**</span>: Main module, types, error handling
<span class="hljs-strong">**Acceptance**</span>: Core feature works end-to-end
</code></pre>
<p>And here's what the skill expands Phase 2 into:</p>
<pre><code class="lang-markdown"><span class="hljs-section"># Phase 02: Core Module</span>

<span class="hljs-quote">&gt; <span class="hljs-strong">**Status**</span>: ⬜ Not Started</span>
<span class="hljs-quote">&gt; <span class="hljs-strong">**Estimated effort**</span>: 2-3 hours</span>
<span class="hljs-quote">&gt; <span class="hljs-strong">**Dependencies**</span>: Phase 01 (must be complete)</span>

<span class="hljs-section">## Context</span>

<span class="hljs-section">### What Exists</span>
<span class="hljs-bullet">-</span> Project scaffold from Phase 01
<span class="hljs-bullet">-</span> Configuration loader
<span class="hljs-bullet">-</span> Basic CLI structure

<span class="hljs-section">### What We're Building</span>
The primary data processing pipeline.

<span class="hljs-section">## Deliverables</span>

<span class="hljs-section">### 1. Pipeline Module</span>

<span class="hljs-strong">**File**</span>: <span class="hljs-code">`src/pipeline.rs`</span>

<span class="hljs-strong">**Purpose**</span>: Handles the core processing logic

<span class="hljs-strong">**Implementation**</span>:
<span class="hljs-bullet">-</span> Create <span class="hljs-code">`Pipeline`</span> struct with configuration
<span class="hljs-bullet">-</span> Implement <span class="hljs-code">`process()`</span> method
<span class="hljs-bullet">-</span> Add error types in <span class="hljs-code">`src/errors.rs`</span>

<span class="hljs-strong">**Scaffold**</span>:
<span class="hljs-code">```rust
pub struct Pipeline {
    config: Config,
}

impl Pipeline {
    pub fn new(config: Config) -&gt; Self { ... }
    pub fn process(&amp;self, input: &amp;Path) -&gt; Result&lt;Output&gt; { ... }
}
```</span>

<span class="hljs-strong">**Validation**</span>:
<span class="hljs-bullet">-</span> [ ] Compiles without warnings
<span class="hljs-bullet">-</span> [ ] Unit tests pass

<span class="hljs-section">### 2. CLI Commands</span>

<span class="hljs-strong">**File**</span>: <span class="hljs-code">`src/cli.rs`</span>

<span class="hljs-strong">**Implementation**</span>:
<span class="hljs-bullet">-</span> Add <span class="hljs-code">`process`</span> subcommand
<span class="hljs-bullet">-</span> Wire to Pipeline module
<span class="hljs-bullet">-</span> Handle errors with user-friendly messages

<span class="hljs-section">## Validation Checklist</span>

Before marking this phase complete:

<span class="hljs-bullet">-</span> [ ] All deliverables implemented
<span class="hljs-bullet">-</span> [ ] Code compiles without warnings
<span class="hljs-bullet">-</span> [ ] <span class="hljs-code">`cargo test`</span> passes
<span class="hljs-bullet">-</span> [ ] Manual test: process sample input successfully
<span class="hljs-bullet">-</span> [ ] Works on target platform(s)

<span class="hljs-section">## Test Scenarios</span>

<span class="hljs-section">### Scenario 1: Happy Path</span>
<span class="hljs-bullet">1.</span> Run <span class="hljs-code">`app process input.txt`</span>
<span class="hljs-bullet">2.</span> <span class="hljs-strong">**Expected**</span>: Output file created, no errors

<span class="hljs-section">### Scenario 2: Missing Input</span>
<span class="hljs-bullet">1.</span> Run <span class="hljs-code">`app process nonexistent.txt`</span>
<span class="hljs-bullet">2.</span> <span class="hljs-strong">**Expected**</span>: Clear error message, exit code 1

<span class="hljs-section">## Handoff to Next Phase</span>

Phase 3 will add [next feature]. It assumes:
<span class="hljs-bullet">-</span> Pipeline module is stable
<span class="hljs-bullet">-</span> Error handling patterns are established
<span class="hljs-bullet">-</span> CLI structure supports additional commands
</code></pre>
<p>It's kind of verbose, but that's the point. Claude Code doesn't have to guess anything. It knows what files to create, what they should roughly look like, how to test them, and what the next phase expects.</p>
<h2 id="heading-the-tracking-thing">The Tracking Thing</h2>
<p>One problem I kept running into: phases don't always fit in one session.</p>
<p>I'd get halfway through something, close my laptop, come back the next day, and have no idea where I left off. Did I finish the error handling? Did I test on Windows yet? What was that weird edge case I found?</p>
<p>So the skill maintains an index file:</p>
<pre><code class="lang-markdown"><span class="hljs-section"># Phase Index: [Project Name]</span>

<span class="hljs-section">## Progress</span>

| Phase | Name | Status | Session UUID | Notes |
|-------|------|--------|--------------|-------|
| 01 | Project Setup | ✅ Complete | 7f3a8b2c-... | |
| 02 | Core Module | ✅ Complete | 9d2e1f4a-... | Added retry logic |
| 03 | Extensions | 🟡 In Progress | a1b2c3d4-... | Windows path handling needed |
| 04 | Polish | ⬜ Not Started | | |
</code></pre>
<p>When I start a new session, I just point Claude Code at the index and it picks up where we left off. The notes column is for stuff I discovered during execution that might matter later. Things that didn't fit the original plan but need to be remembered.</p>
<h2 id="heading-how-it-feels-to-use">How It Feels to Use</h2>
<p>The skill responds to natural language. The main things I end up saying:</p>
<ul>
<li><p>"generate phases from the phase plan"</p>
</li>
<li><p>"start phase 2"</p>
</li>
<li><p>"complete phase 2" (runs through the checklist)</p>
</li>
<li><p>"phase status"</p>
</li>
</ul>
<p>It's not really a CLI. More like a conversation where Claude Code knows what I mean by "start phase 2" because it has the context.</p>
<h2 id="heading-what-i-took-away-from-this">What I Took Away From This</h2>
<p>The thing I keep learning with AI tooling is that the information you need is different from the information the AI needs.</p>
<p>A Phase Brief makes sense to me because I can fill in the gaps. I know what "error handling" means in the context of this project. Claude Code doesn't, not unless I tell it.</p>
<p>SAPA was about figuring out how much planning you need. This is about figuring out how much detail Claude Code needs to execute without hand-holding.</p>
<p>They're kind of the same lesson applied at different points. Right-sizing the documentation for who's actually going to use it.</p>
<h2 id="heading-links">Links</h2>
<p>I added the skill to the <a target="_blank" href="https://gist.github.com/infamousjoeg/ff6f71327779eb95bec3a2b1453bdef4">original SAPA gist</a>:</p>
<ul>
<li><p><code>sapa-framework.md</code> - the planning methodology (unchanged)</p>
</li>
<li><p><code>sapa-quick-invoke.md</code> - quick invoke for Claude Web (unchanged)</p>
</li>
<li><p><code>sapa-executor-skill.md</code> - the execution skill for Claude Code</p>
</li>
<li><p><code>PHASE_INDEX_TEMPLATE.md</code> - the progress tracking template</p>
</li>
</ul>
<p>To install it:</p>
<pre><code class="lang-bash">mkdir -p ~/.claude/skills/sapa-executor
<span class="hljs-comment"># Copy sapa-executor-skill.md to ~/.claude/skills/sapa-executor/SKILL.md</span>
</code></pre>
<p>Or you can just drop the skill file into your project's <code>.claude/skills/</code> directory if you want it scoped to one project.</p>
<p>If you've been using SAPA and running into the same handoff friction I was, maybe give this a shot. That's what I built it for.</p>
]]></content:encoded></item><item><title><![CDATA[I Built a Framework for Getting Ideas Out of My Head and Into Code]]></title><description><![CDATA[I have a problem. I get ideas faster than I can build them.
Some of these ideas are genuinely good. Most are not. But here's what I noticed: I was spending the same amount of time "planning" the bad ideas as the good ones. I'd write a PRD for somethi...]]></description><link>https://joegarcia.dev/sapa-framework-idea-to-code</link><guid isPermaLink="true">https://joegarcia.dev/sapa-framework-idea-to-code</guid><category><![CDATA[Productivity]]></category><category><![CDATA[AI]]></category><category><![CDATA[development]]></category><category><![CDATA[planning]]></category><category><![CDATA[claude]]></category><category><![CDATA[side project]]></category><dc:creator><![CDATA[Joe Garcia]]></dc:creator><pubDate>Sat, 24 Jan 2026 17:50:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769277159576/e949c991-83cb-4dec-9119-42bf4f737205.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have a problem. I get ideas faster than I can build them.</p>
<p>Some of these ideas are genuinely good. Most are not. But here's what I noticed: I was spending the same amount of time "planning" the bad ideas as the good ones. I'd write a PRD for something that didn't need a PRD. I'd skip planning entirely for something that desperately needed structure. The result was a graveyard of half-started projects and a few over-documented ideas that never saw a single line of code.</p>
<p>So I built a framework. I call it SAPA.</p>
<h3 id="heading-what-sapa-actually-is">What SAPA Actually Is</h3>
<p>SAPA stands for Spectrum, Assessment, Prescription, Architecture. It's a methodology I use with Claude to take an idea from "I should build this" to "here are the exact steps to build this in phases."</p>
<p>The key insight: not every idea needs the same amount of planning. A weekend hack doesn't need a PRD. A product you're pitching to leadership doesn't need a napkin sketch. The problem is knowing which one you're dealing with.</p>
<p>SAPA forces me to figure that out before I start documenting.</p>
<h3 id="heading-the-four-steps">The Four Steps</h3>
<p><strong>Spectrum</strong> is about seeing all your options. Before you write anything, understand the full range of planning documents that exist:</p>
<ul>
<li><p>Napkin sketch (for solo weekend builds)</p>
</li>
<li><p>One-pager (for gut-checking with trusted people)</p>
</li>
<li><p>Lean Canvas (for validating the business model)</p>
</li>
<li><p>Product Brief (for aligning a small team)</p>
</li>
<li><p>PRD (for cross-functional coordination)</p>
</li>
<li><p>Technical Spec (for detailed implementation)</p>
</li>
</ul>
<p>Most people jump straight to "I need a PRD" because that's what they've seen in companies. But if you're building alone, a PRD is overhead. If you're pitching leadership, a napkin sketch won't cut it.</p>
<p><strong>Assessment</strong> is the interrogation. Before recommending a document, I ask myself:</p>
<ul>
<li><p>Is this idea validated? Have real users expressed interest?</p>
</li>
<li><p>Who is building this? Just me? A team?</p>
</li>
<li><p>What's the biggest risk? Technical feasibility? Market demand?</p>
</li>
<li><p>Is this exploration, validation, or committed execution?</p>
</li>
</ul>
<p>The answers determine the prescription.</p>
<p><strong>Prescription</strong> is the output. Based on the assessment, I produce only what's needed. Nothing more. If I'm solo and unvalidated, I get a one-pager and go straight to building. If I need buy-in from others, I get a proper Product Brief. The framework prevents over-engineering the planning phase.</p>
<p><strong>Architecture</strong> is where it gets interesting. Once I have the right planning doc, SAPA produces Phase Briefs. These are self-contained instructions for each development phase, formatted specifically for Claude Code.</p>
<p>Each Phase Brief contains:</p>
<ul>
<li><p>What exists from prior phases</p>
</li>
<li><p>What this phase accomplishes</p>
</li>
<li><p>Specific deliverables</p>
</li>
<li><p>Technical constraints</p>
</li>
<li><p>Acceptance criteria</p>
</li>
</ul>
<p>I can hand a Phase Brief to Claude Code and say "build this." No re-explaining context. No starting from scratch. Just execution.</p>
<h3 id="heading-why-phases-matter">Why Phases Matter</h3>
<p>Here's what I learned the hard way: if you try to build everything at once, you build nothing.</p>
<p>Phases force incremental progress. Each phase delivers something working. Something testable. Something you can show someone and get feedback on before you've invested 40 hours.</p>
<p>The phases are sized for a single Claude Code session. Roughly 1-4 hours of work each. Small enough to finish. Large enough to matter.</p>
<h3 id="heading-a-real-example">A Real Example</h3>
<p>I had an idea for a product called "Infinite Intern." The concept: AI agents that work like employees, not chatbots. You hire them, give them job descriptions, assign tasks, review their work, provide feedback. They learn over time.</p>
<p>Without SAPA, I would have either:</p>
<ol>
<li><p>Started coding immediately with no plan (and gotten lost in scope creep)</p>
</li>
<li><p>Written a 20-page PRD that took longer than actually building the thing</p>
</li>
</ol>
<p>With SAPA, I did an assessment. Solo builder. Unvalidated idea. Technical feasibility is low risk (I know the stack). Market demand is the real question.</p>
<p>Prescription: Product Brief + Phase Plan. Skip the PRD. Skip the Lean Canvas. Get just enough structure to start building, then validate with real users.</p>
<p>The output was 8 phases:</p>
<ol>
<li><p>Foundation (infrastructure, basic agent structure)</p>
</li>
<li><p>Intern Execution (actually performing tasks)</p>
</li>
<li><p>Review and Feedback (human-in-the-loop)</p>
</li>
<li><p>Frontend: Bullpen Dashboard</p>
</li>
<li><p>Frontend: Hiring Flow</p>
</li>
<li><p>Frontend: Review Queue</p>
</li>
<li><p>Additional Intern Types</p>
</li>
<li><p>Polish and Scheduling</p>
</li>
</ol>
<p>Each phase has a brief. Each brief is ready for Claude Code. I can work through them sequentially, shipping something functional after each one.</p>
<h3 id="heading-the-meta-point">The Meta Point</h3>
<p>SAPA is a framework for working with AI. But it's really a framework for working with yourself.</p>
<p>The AI doesn't care if you write a PRD or a napkin sketch. The AI will happily help you over-plan or under-plan. The value of SAPA is that it forces you to stop and think about what you actually need before you start producing artifacts.</p>
<p>I've been using it for a few months now. The graveyard of half-started projects is smaller. The ratio of ideas-to-shipped-code is higher. That's the only metric that matters.</p>
<h3 id="heading-get-the-framework">Get the Framework</h3>
<p>I've packaged <a target="_blank" href="https://gist.github.com/infamousjoeg/ff6f71327779eb95bec3a2b1453bdef4">SAPA into a document</a> you can drop into any Claude conversation. It includes:</p>
<ul>
<li><p>The full methodology</p>
</li>
<li><p>Templates for every artifact type</p>
</li>
<li><p>Instructions for producing Phase Plans and Phase Briefs</p>
</li>
<li><p>An example showing the complete output</p>
</li>
</ul>
<p>You can <a target="_blank" href="https://gist.github.com/infamousjoeg/ff6f71327779eb95bec3a2b1453bdef4#file-sapa-quick-invoke-md">use the quick invoke version</a> (just paste it with your idea) or the full framework (for understanding the methodology).</p>
<p>The framework is designed for Claude, by someone who uses Claude. It's opinionated. It's practical. It works.</p>
<p>If you're drowning in ideas and starving for shipped projects, give it a shot. The worst case is you spend 10 minutes thinking about your idea before you start. The best case is you actually finish something.</p>
<p>That's the whole pitch. Go build something.</p>
<hr />
<p><em>Have questions about SAPA or want to share how you're using it? Find me on</em> <a target="_blank" href="https://linkedin.com/in/infamousjoeg"><em>LinkedIn</em></a> <em>or</em> <a target="_blank" href="https://github.com/infamousjoeg"><em>GitHub</em></a><em>.</em></p>
]]></content:encoded></item><item><title><![CDATA[Why Workload Identity Is Hard to Explain (And How I Tried to Fix It)]]></title><description><![CDATA[I've spent a lot of time explaining workload identity to people. Like, a lot. And I've watched a lot of eyes glaze over.
It's not that people aren't smart. It's that when you explain something they already know, like a database or a container or what...]]></description><link>https://joegarcia.dev/why-workload-identity-is-hard-to-explain-and-how-i-tried-to-fix-it</link><guid isPermaLink="true">https://joegarcia.dev/why-workload-identity-is-hard-to-explain-and-how-i-tried-to-fix-it</guid><category><![CDATA[Security]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[spiffe]]></category><category><![CDATA[workload-identity]]></category><dc:creator><![CDATA[Joe Garcia]]></dc:creator><pubDate>Wed, 10 Dec 2025 21:56:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1765403548336/cb115e05-ecb8-47a7-be15-290eda7e6cee.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I've spent a lot of time explaining workload identity to people. Like, a lot. And I've watched a lot of eyes glaze over.</p>
<p>It's not that people aren't smart. It's that when you explain something they already know, like a database or a container or whatever, they can picture it in their head. They've got something to attach your words to.</p>
<p>But when you're explaining an emerging standard like SPIFFE? There's nothing there. You're basically asking their brain to build something out of thin air.</p>
<p>So I figured maybe I should just... build the picture for them.</p>
<h2 id="heading-the-passport-thing-doesnt-work">The Passport Thing Doesn't Work</h2>
<p>People in the SPIFFE community like to use a passport analogy. Your SPIFFE ID is like your passport number, your SVID is like the physical passport, it expires and gets renewed, etc.</p>
<p>It's fine. But it kind of assumes everyone travels internationally.</p>
<p>Here's what I actually know for sure: pretty much everyone has worked at a company with a badge system.</p>
<p>You get hired. Security takes your picture and gives you a badge. Badge expires eventually. You get a new one. You tap it to get into the building. You show it to prove you work there.</p>
<p>That's SPIFFE. Same thing. But for software instead of people.</p>
<h2 id="heading-so-i-built-this-thing">So I Built This Thing</h2>
<p>It's called <a target="_blank" href="https://thesecretlivesofidentity.com">The Secret Lives of Identity</a>. It's an interactive visualization that walks through SPIFFE and SPIRE from scratch. No assumed knowledge.</p>
<p>The name comes from <a target="_blank" href="http://thesecretlivesofdata.com/">The Secret Lives of Data</a> by Ben Johnson, which is this really well done visualization of the Raft consensus algorithm. That project kind of showed me what's possible when you stop trying to explain something with words and just show it.</p>
<p>The badge metaphor runs through the whole thing:</p>
<ul>
<li><p>Your <strong>SPIFFE ID</strong> is like your employee ID number. It's permanent, doesn't change.</p>
</li>
<li><p>Your <strong>SVID</strong> is your actual badge. Expires, gets renewed automatically.</p>
</li>
<li><p>The <strong>SPIRE Server</strong> is corporate HQ. Issues badges, keeps track of everyone.</p>
</li>
<li><p>The <strong>SPIRE Agent</strong> is the security desk on your floor. Verifies you locally, hands out badges.</p>
</li>
<li><p><strong>Attestation</strong> is proving you actually work here before anyone gives you a badge.</p>
</li>
<li><p><strong>mTLS</strong> is two employees showing each other their badges before they'll share anything.</p>
</li>
</ul>
<p>Once you frame it that way, people get it. The metaphor does most of the work.</p>
<h2 id="heading-it-was-too-long">It Was Too Long</h2>
<p>First version had like 90 frames. Everything. Attestation details, selectors, rotation, federation, trust bundles, all of it.</p>
<p>I showed it to some people at AWS re:Invent who'd never touched SPIFFE before. They actually understood it, which was great. But I kept hearing the same thing:</p>
<p>"It's kind of long."</p>
<p>Yeah. Fair.</p>
<p>Not everyone has 30 minutes. Some people just need to know what SPIFFE is so they can decide if they care. They don't need the deep dive yet.</p>
<p>So I split it into three tracks:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Track</td><td>Time</td><td>What you get</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Bronze</strong></td><td>~5 min</td><td>Core concepts, the problem it solves</td></tr>
<tr>
<td><strong>Silver</strong></td><td>~15 min</td><td>How SPIRE works, attestation flow</td></tr>
<tr>
<td><strong>Gold</strong></td><td>~25 min</td><td>Everything, including lifecycle and federation</td></tr>
</tbody>
</table>
</div><p>Each one tells a complete story. Bronze isn't a teaser for Silver. It's its own thing. You walk away understanding SPIFFE even if you never click Silver.</p>
<h2 id="heading-workloads-arent-people">Workloads Aren't People</h2>
<p>One thing I went back and forth on: how do you actually show a workload?</p>
<p>First instinct was a person icon. Fits the badge metaphor, employees have badges, makes sense.</p>
<p>But then... SPIFFE is about non-human identity. That's the whole point. If the workload looks like a person, people are gonna think "oh so like logging in" and that's not it at all.</p>
<p>Ended up going with a circuit chip thing. Like a processor with traces coming out of it. Reads as "machine" without looking like a server rack. The center of the chip is where the identity lives. When it's attested, it glows gold. When it's not, it's gray with a question mark.</p>
<p>Small thing but it actually makes a difference in how the whole thing feels.</p>
<h2 id="heading-what-i-took-away-from-this">What I Took Away From This</h2>
<p>Building this kind of reinforced something I already sort of knew: education is a design problem.</p>
<p>Being accurate isn't enough. You have to be clear. And clear doesn't mean dumbed down. It means finding the right abstraction. Right metaphor. Right order to show things.</p>
<p>SPIFFE is a solid standard. SPIRE works. But adoption depends on people actually understanding it, and that depends on someone taking the time to bridge the gap between what it technically is and what it feels like.</p>
<p>That's what I was trying to do anyway.</p>
<h2 id="heading-links">Links</h2>
<p><strong>The site:</strong> <a target="_blank" href="http://thesecretlivesofidentity.com">thesecretlivesofidentity.com</a></p>
<p><strong>The code:</strong> <a target="_blank" href="http://github.com/infamousjoeg/thesecretlivesofidentity">github.com/infamousjoeg/thesecretlivesofidentity</a></p>
<p>It's open source, Apache 2.0. If something's wrong, open an issue. If you want to improve it, PRs welcome.</p>
<p>And if you know someone who keeps struggling to explain workload identity to their team or their leadership or whoever... maybe send this their way. That's who I built it for.</p>
]]></content:encoded></item></channel></rss>