<?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" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Docs or it Didn't Happen]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://blog.jillshaheen.com/</link><image><url>https://blog.jillshaheen.com/favicon.png</url><title>Docs or it Didn&apos;t Happen</title><link>https://blog.jillshaheen.com/</link></image><generator>Ghost 5.88</generator><lastBuildDate>Fri, 24 Apr 2026 10:26:59 GMT</lastBuildDate><atom:link href="https://blog.jillshaheen.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Unwritten content rules that experienced writers follow]]></title><description><![CDATA[So much of a tech writer's knowledge lives in judgment calls, instinctive edits, and choices that you've developed over years of writing for people in real situations. This tacit knowledge is one of the most undervalued things that an experienced technical writer brings to their work.]]></description><link>https://blog.jillshaheen.com/unwritten-content-rules-that-tech-writers-know/</link><guid isPermaLink="false">69e61e43f2d2010e521ba888</guid><category><![CDATA[Per the docs]]></category><category><![CDATA[Technical Writing]]></category><dc:creator><![CDATA[Jill Shaheen]]></dc:creator><pubDate>Mon, 20 Apr 2026 17:42:21 GMT</pubDate><media:content url="https://blog.jillshaheen.com/content/images/2026/04/writer-wastebasket.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jillshaheen.com/content/images/2026/04/writer-wastebasket.png" alt="Unwritten content rules that experienced writers follow"><p><em>This post is part of the&#xA0;Per the Docs&#xA0;article series. Links to the rest of the series are at the end of this piece.</em></p>
<!--kg-card-begin: html-->
<ul>
  <li><a href="#the-oxford-comma-is-non-negotiable">The Oxford comma is non-negotiable</a></li>
    <li><a href="#the-strangler-fig-problem">The Strangler Fig problem</a></li>
  <li><a href="#sally-in-accounting">Sally in accounting</a></li>
  <li><a href="#unablei-cant">&quot;Unable&quot; - I can&apos;t</a></li>
  <li><a href="#theing-problem">The -ing problem</a></li>
  <li><a href="#what-happens-when-you-work-with-ai">What happens when you work with AI</a></li>
</ul>
<!--kg-card-end: html-->
<h3 id="the-oxford-comma-is-non-negotiable"><strong>The Oxford comma is non-negotiable</strong></h3><p>Experienced writers follow style guides, and they know when to break the rules. It&apos;s a skill of its own to understand the intent behind the rules well enough to recognize when following them works against the reader.</p><p>For example, I&apos;m currently required to apply the AP style guide in my work. The AP doesn&apos;t use the Oxford comma. But for technical content, I do... always.</p><p>The Oxford comma prevents ambiguity in lists, and ambiguity in technical documentation has consequences. &quot;Scope includes admin, read and write access.&quot; Is that three scopes, or two, where read/write is a paired permission level? The same ambiguity appears in &quot;The API removes the primary record, the secondary pointer and child objects.&quot;  Are we talking about secondary pointers and secondary child objects, or secondary pointers and all children? In access control and data deletion, that&apos;s not a question you want readers to answer for themselves.</p><p>I follow the spirit of a style guide: consistency, clarity, and respect for the reader. When a specific rule works against those goals, I make a conscious decision to override it and I&apos;m prepared to defend that decision. </p><h3 id="the-strangler-fig-problem"><strong>The Strangler Fig problem</strong></h3><p>One of the trickiest judgment calls in technical writing is knowing when to use the right term versus the useful term. Subject matter experts often want documentation to reflect their vocabulary. But experienced writers know that doesn&apos;t always align with the reader&apos;s vocabulary.</p><p>I recently rewrote the deployment instructions for a software system. The internal team had described the migration approach as a &quot;Strangler Fig pattern&quot; and used that phrase in the first rev of the docs. It&apos;s a legitimate software architecture concept where a new system gradually replaces an old one by wrapping around it. The term is technically accurate and completely correct, but entirely wrong for the audience.</p><p>The people reading the deployment guide need to understand how the migration works, but introducing this pattern name requires readers to first learn what a strangler fig tree is, understand why that metaphor applies to software architecture, and then finally arrive at the concept itself. That&apos;s two layers of context the reader has to climb before they reach information they can use. </p><p>Directly describe the behavior to get them there in one step: the system transitions gradually, and existing functionality remains available while new components are introduced. Easy peasy.</p><h3 id="sally-in-accounting"><strong>Sally in accounting</strong></h3><p>Read the room. It&apos;s an essential skill that a writer needs to have, and one of the hardest to teach. It&apos;s the ability to sense who&apos;s in the audience and write accordingly.</p><p>When I wrote documentation for SugarCRM, I developed an imaginary user I called Sally in accounting. Sally is intelligent, capable, and completely non-technical. She uses the CRM every day to do her job and has zero interest in how it works under the hood. She just needs it to work.</p><p>Nobody told me to think about Sally. No brief mentioned her. But I knew she was in the audience, and she shaped every word I wrote. I&apos;d ruthlessly eliminate jargon, lead with outcomes rather than mechanisms, and ask whether someone without technical context could successfully act on what I&apos;d written.</p><p>As writers, we need to sense who&apos;s in the audience, even when nobody tells us explicitly.</p><h3 id="unablei-cant"><strong>&quot;Unable&quot; - I can&apos;t</strong></h3><p>Some tacit knowledge shows up as a persistent editor reflex. It&apos;s something you fix automatically across every draft you touch, without ever having formalized it as a rule.</p><p>The word &quot;unable&quot; is one of mine. It&apos;s passive, slightly formal, and creates distance between the reader and the action. &quot;You are unable to proceed&quot; becomes &quot;you can&apos;t proceed.&quot; Just a tweak, but a massive difference in tone. I&apos;ve never written this down as a rule, but I fix it every time.</p><h3 id="theing-problem"><strong>The -ing problem</strong></h3><p>Two standard style guide rules operate together here:</p><p><strong>If a task has a qualifier, lead with it.</strong> The goal or condition belongs at the beginning of the sentence, not the end. The reader needs context before instruction.</p><p><strong>Use -ing words with care. </strong>A word that ends in -ing can be a verb, a noun, or an adjective, and this ambiguity creates risk. &quot;By doing this, you can do that&quot; breaks both rules at once. It buries the goal at the end and introduces an -ing word that could be read multiple ways. &quot;To do that, try this&quot; fixes both problems.</p><p>Both of these rules appear in the Google Developer Style Guide and the Microsoft Style Guide, but they&apos;re surprisingly overlooked by even experienced writers. I&apos;m pedantic enough about these that I run a Ctrl+F for &quot;ing&quot; on every page I touch (don&apos;t do that on this blog post please - I&apos;m referring to formal docs!). Gerund abuse and misplaced qualifiers tend to travel together. This thirty-second search is a standard part of my editing pass. </p><h3 id="what-happens-when-you-work-with-ai"><strong>What happens when you work with AI</strong></h3><p>I&apos;ve used AI tools heavily in my work for the past few years, and the collaboration has sharpened my understanding of tacit knowledge. AI will do what you ask. It follows the rules. Unlike humans, it&apos;s relentlessly consistent. This consistency means that it regularly produces output that a writer immediately knows is just plain wrong.</p><p>A few examples from my own workflow:</p><ul><li>I asked an AI to <strong>restructure an API reference for scannability</strong>. The result was technically well-organized. I rewrote it anyway, because the restructure had broken the logical progression a that developer needs to understand the underlying model before the reference makes sense.</li><li>I asked an AI to <strong>clean up passive voice throughout a set of procedures</strong>. It did. I put some of it back, because active voice in certain warning contexts implies user agency where there isn&apos;t any. &quot;This action can&apos;t be undone&quot; is more accurate than &quot;you can&apos;t undo this action&quot; when the system is the one that enforces the constraint, not the user&apos;s decision.</li><li>I reviewed <strong>microcopy for a deletion confirmation</strong> where AI-generated copy used the phrase &quot;you can&apos;t recover this item.&quot; True, but <strong>recover</strong> is ambiguous. It could mean the item can&apos;t be restored after deletion, or it could mean the item can&apos;t be recreated at all. Those are very different things. </li></ul><p>In each case, the fix came from my years of watching how people read, misread, and act on documentation.</p><p>LLMs are remarkably good at following explicit rules. Feed one your style guide and it will apply it more consistently than humans will. But tacit knowledge is different. It&apos;s knowing when a technically correct term will create unnecessary cognitive load, when a style guide rule works against clarity, who&apos;s reading and what they really need to know (and what they don&apos;t), and what&apos;s wrong with a sentence before you can articulate why.</p><p>The fact that a writer&apos;s knowledge resists codification is what makes it valuable. Style guides capture what can be taught. Experienced writers carry what can&apos;t. Our craft lives within this gap.</p><hr><p>This post is part of&#xA0;<a href="https://blog.jillshaheen.com/per-the-docs-2026-04-gaps/" rel="noreferrer"><strong>Per the docs</strong></a>, a monthly collaborative series where technical writers explore different aspects of our craft. Each month features a new topic with perspectives from writers across the community. Read more perspectives in the series:</p><p><strong>April 2026 topic: Mind the Gap</strong></p><ul><li><strong>Previous post:</strong> James Beach - <a href="https://open.substack.com/pub/anideasmith/p/find-it-to-mind-it?ref=blog.jillshaheen.com">Find it to Mind it: Taxonomies as Gap-Finders &#x2192;</a></li><li><strong>Next post:</strong> Nicholas Galinski - <a href="https://nicholasgalinski.com/blog/dont-turn-off-your-brain/?ref=blog.jillshaheen.com" rel="noreferrer">Don&apos;t turn off your brain &#x2192;</a></li></ul><p><a href="https://blog.jillshaheen.com/per-the-docs-2026-04-gaps/" rel="noreferrer">View all participants in this month&apos;s hop &#x2192;</a></p><blockquote><em>Disclaimer: Each article in this series is written and owned by its respective author. The views, opinions, and experiences shared belong solely to the individual writer and do not represent the perspectives of other participants or their employers (past or present).</em></blockquote>]]></content:encoded></item><item><title><![CDATA[Per the docs - April 2026]]></title><description><![CDATA[This month's topic brings together technical writers to share their insights on what isn't written - the missing context, the assumed knowledge, and the gaps that cost users the most.]]></description><link>https://blog.jillshaheen.com/per-the-docs-2026-04-gaps/</link><guid isPermaLink="false">69e3ea42f2d2010e521ba87b</guid><category><![CDATA[Per the docs]]></category><category><![CDATA[Technical Writing]]></category><dc:creator><![CDATA[Jill Shaheen]]></dc:creator><pubDate>Sat, 18 Apr 2026 20:34:07 GMT</pubDate><media:content url="https://blog.jillshaheen.com/content/images/2026/04/perthedocs_wide-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jillshaheen.com/content/images/2026/04/perthedocs_wide-1.png" alt="Per the docs - April 2026"><p>Per the docs is a monthly article series where technical writers explore various aspects of our craft. Each month, a different host curates a topic and brings together diverse voices to share insights, experiences, and practical advice.</p><p>Want to follow along or contribute to a future edition? Everything you need is at <a href="https://perthedocs.com/?ref=blog.jillshaheen.com">perthedocs.com</a>: past themes in the archive, contributor guidelines in the writer portal, and information about joining the community.</p><h2 id="april-2026-topic-mind-the-gap"><strong>April 2026 topic: Mind the gap</strong></h2><p>Where do the docs end and the user&apos;s assumption begin? this month, we&apos;re exploring what isn&apos;t written: missing context, assumed knowledge, and gaps that reduce time-to-success.</p>
<!--kg-card-begin: html-->
<style>
  .ptd-img {
    width: 200px;
    height: 200px;
    display: block;
    border-radius: 6px;
    box-shadow: 0 0 0 2px rgba(210,170,80,0.55);
    transition: box-shadow 0.3s ease;
  }
  .ptd-img:hover {
    box-shadow: 0 0 0 2px rgba(210,170,80,0.55), 0 0 18px 4px rgba(210,170,80,0.55);
  }
</style>
<div style="width: 100%;">
  <div style="display: flex; align-items: center; gap: 16px; padding: 14px 8px; border-bottom: 1px solid rgba(255,255,255,0.12);">
    <div style="flex: 1; min-width: 0;">
      <p style="margin: 0 0 6px;"><strong>Brandi Hopkins</strong></p>
      <p style="font-size: 14px; margin: 0 0 8px;">Brandi is a senior documentation strategist who builds scalable content systems, with expertise in docs-as-code workflows, AI-assisted documentation, and developer experience.</p>
      <p style="margin: 0 0 6px;"><strong>Read their post:</strong> <a href="https://brandihopkins.com/blog/content-gap-analysis?ref=blog.jillshaheen.com" target="_blank">Auditing the Gaps: A content analysis approach for inherited docs &#x2192;</a></p>
      <p style="margin: 0;"><a href="https://brandihopkins.com/?ref=blog.jillshaheen.com" target="_blank">brandihopkins.com</a> | <a href="https://www.linkedin.com/in/brandihopkins/?ref=blog.jillshaheen.com" target="_blank">LinkedIn</a></p>
    </div>
    <div style="flex: 0 0 200px;">
      <img src="https://blog.jillshaheen.com/content/images/2026/04/brandi-hopkins.png" class="ptd-img" alt="Per the docs - April 2026">
    </div>
  </div>
  <div style="display: flex; align-items: center; gap: 16px; padding: 14px 8px; border-bottom: 1px solid rgba(255,255,255,0.12);">
    <div style="flex: 1; min-width: 0;">
      <p style="margin: 0 0 6px;"><strong>James Beach</strong></p>
      <p style="font-size: 14px; margin: 0 0 8px;">James is a content strategist and technical writer with a knack for prompt engineering and AI-assisted workflows &#x2014; always finding new ways to bridge the gap between ideas and execution.</p>
      <p style="margin: 0 0 6px;"><strong>Read their post:</strong> <a href="https://open.substack.com/pub/anideasmith/p/find-it-to-mind-it?ref=blog.jillshaheen.com" target="_blank">Find it to Mind it: Taxonomies as Gap-Finders &#x2192;</a></p>
      <p style="margin: 0;"><a href="https://jamesmbeach.com/?ref=blog.jillshaheen.com" target="_blank">jamesmbeach.com</a> | <a href="https://www.linkedin.com/in/jamesbeachwriter/?ref=blog.jillshaheen.com" target="_blank">LinkedIn</a></p>
    </div>
    <div style="flex: 0 0 200px;">
      <img src="https://blog.jillshaheen.com/content/images/2026/04/james-beach-rev2.png" class="ptd-img" alt="Per the docs - April 2026">
    </div>
  </div>
  <div style="display: flex; align-items: center; gap: 16px; padding: 14px 8px; border-bottom: 1px solid rgba(255,255,255,0.12);">
    <div style="flex: 1; min-width: 0;">
      <p style="margin: 0 0 6px;"><strong>Jill Shaheen</strong></p>
      <p style="font-size: 14px; margin: 0 0 8px;">Jill is a documentation leader who&apos;s been building content systems, leading documentation teams, and figuring out where infrastructure breaks for nearly 20 years.</p>
      <p style="margin: 0 0 6px;"><strong>Read their post:</strong> <a href="https://blog.jillshaheen.com/unwritten-content-rules-that-tech-writers-know/" target="_blank">Unwritten rules that tech writers follow &#x2192;</a></p>
      <p style="margin: 0;"><a href="https://jillshaheen.com/?ref=blog.jillshaheen.com" target="_blank">jillshaheen.com</a> | <a href="https://www.linkedin.com/in/jillshaheen/?ref=blog.jillshaheen.com" target="_blank">LinkedIn</a></p>
    </div>
    <div style="flex: 0 0 200px;">
      <img src="https://blog.jillshaheen.com/content/images/2026/04/square-profile.png" class="ptd-img" alt="Per the docs - April 2026">
    </div>
  </div>
  <div style="display: flex; align-items: center; gap: 16px; padding: 14px 8px; border-bottom: 1px solid rgba(255,255,255,0.12);">
    <div style="flex: 1; min-width: 0;">
      <p style="margin: 0 0 6px;"><strong>Nicholas Galinski</strong></p>
      <p style="font-size: 14px; margin: 0 0 8px;">Nick is an M-shaped multidisciplinary writer, content designer, systems architect, and AI-fluid storyteller. Turning complex problems into elegant narratives while leading with empathy.</p>
      <p style="margin: 0 0 6px;"><strong>Read their post:</strong> <a href="https://nicholasgalinski.com/blog/dont-turn-off-your-brain/?ref=blog.jillshaheen.com" target="_blank">Don&apos;t turn off your brain &#x2192;</a></p>
      <p style="margin: 0;"><a href="https://nicholasgalinski.com/?ref=blog.jillshaheen.com" target="_blank">nicholasgalinski.com</a> | <a href="https://www.linkedin.com/in/nicholas-galinski/?ref=blog.jillshaheen.com" target="_blank">LinkedIn</a></p>
    </div>
    <div style="flex: 0 0 200px;">
      <img src="https://blog.jillshaheen.com/content/images/2026/04/nicholas-galinski.png" class="ptd-img" alt="Per the docs - April 2026">
    </div>
  </div>
  <div style="display: flex; align-items: center; gap: 16px; padding: 14px 8px;">
    <div style="flex: 1; min-width: 0;">
      <p style="margin: 0 0 6px;"><strong>Reem Sabawi</strong></p>
      <p style="font-size: 14px; margin: 0 0 8px;">Reem is a former AWS technical writer, founder of Reem The Writer, and builder of DocSentinel AI. She writes about documentation strategy and the knowledge layer that makes AI reliable.</p>
      <p style="margin: 0 0 6px;"><strong>Read their post:</strong> <a href="https://reemthewriter.substack.com/documentation-clarity-ai?ref=blog.jillshaheen.com" target="_blank">You are not the show &#x2192;</a></p>
      <p style="margin: 0;"><a href="https://reemthewriter.substack.com/?ref=blog.jillshaheen.com" target="_blank">reemthewriter.substack.com</a> | <a href="https://www.linkedin.com/in/reem-sab?ref=blog.jillshaheen.com" target="_blank">LinkedIn</a></p>
    </div>
    <div style="flex: 0 0 200px;">
      <img src="https://blog.jillshaheen.com/content/images/2026/04/reem-dark-EDIT.jpg" class="ptd-img" alt="Per the docs - April 2026">
    </div>
  </div>
</div>
<!--kg-card-end: html-->
<blockquote><em>Disclaimer: Each article in this series is written and owned by its respective author. The views, opinions, and experiences shared belong solely to the individual writer and do not represent the perspectives of other participants or their employers (past or present).</em></blockquote>
<!--kg-card-begin: html-->
<a href="https://perthedocs.com/?ref=blog.jillshaheen.com"><img src="https://blog.jillshaheen.com/content/images/2026/04/perthedocs_darkbkgd.png" style="width: 285px; height: 145px;" alt="Per the docs - April 2026"></a>
<!--kg-card-end: html-->
]]></content:encoded></item><item><title><![CDATA[From prompter to builder: a tech writer's guide to MCP and agentic workflows]]></title><description><![CDATA[When I started using AI for technical writing processes, I thought of myself as someone who builds with AI. Turns out I was just a very enthusiastic prompter. Building real agentic processes changed how I think about what technical writers need to learn right now.]]></description><link>https://blog.jillshaheen.com/upskilling-from-ai-user-to-ai-builder/</link><guid isPermaLink="false">69968bfbf2d2010e521ba69f</guid><category><![CDATA[Career Development]]></category><category><![CDATA[Documentation Tools]]></category><category><![CDATA[Technical Writing]]></category><category><![CDATA[Per the docs]]></category><dc:creator><![CDATA[Jill Shaheen]]></dc:creator><pubDate>Wed, 04 Mar 2026 05:13:34 GMT</pubDate><media:content url="https://blog.jillshaheen.com/content/images/2026/02/Gemini_Generated_Image_xqjch2xqjch2xqjc.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jillshaheen.com/content/images/2026/02/Gemini_Generated_Image_xqjch2xqjch2xqjc.png" alt="From prompter to builder: a tech writer&apos;s guide to MCP and agentic workflows"><p><em>This post is part of the Per the Docs article series. Links to the rest of the series are at the end of this piece.</em></p><hr><p>Most technical writers are using AI tools. We have Copilot, Claude, and ChatGPT  in our daily workflows, helping us draft, edit, summarize, and brainstorm. But using AI tools and building AI workflows are two different things.</p><p>It&apos;s time to learn how to design systems that work without the writer in the loop. Not just how to use AI tools, but how to build workflows that make reliable decisions, retrieve the right context, and produce consistent outputs at scale. Then you&apos;ll be free to focus on strategy, stakeholder relationships, content architecture, and the judgment calls no agent can make.</p><p>When you&apos;re using AI tools within a workflow, you&apos;re the one orchestrating every step, evaluating every output, deciding what comes next. The AI waits on you between each task. </p><p>For example, you paste a support ticket into Claude and ask it to suggest a doc update. The AI handles that task and then waits for you. </p><p>In an agentic workflow, the AI orchestrates the steps itself. You give it a goal, and it plans a sequence of actions, decides which tools to call, evaluates its own outputs, and adjusts course based on what it gets back. Building agentic workflows requires you to design systems that make reliable decisions without a human at every step. </p><p>A big thing to unlearn is your assumption about stability. A document has a fixed audience and a stable context. An agentic workflow has variable inputs, multiple decision points, and behavior that shifts depending on what the model retrieves. If you&apos;re trying to treat an agentic workflow as something you can finalize,  it just doesn&apos;t work that way.</p><p><strong>How MCP changes the way we need to think</strong></p><p>MCP lets AI models connect to external tools, data sources, and services in a structured way. With MCP, an agent can reach outside itself to query a database, read a file, call an API, or trigger an action. Instead of a model working only from what&apos;s in its context window, MCP pulls in the right information at the right moment.</p><p>For writers, this matters because documentation is a data source. Knowledge bases, style guides, API references, and release notes all become something an AI agent can retrieve, reason over, and act on. It&apos;s a fundamentally different relationship between content and AI than &quot;paste this into ChatGPT and ask it to improve the tone.&quot; Once you understand that, you&apos;ll stop thinking about content as something<em> <strong>you produce</strong>, </em>but as something <em>a <strong>system consumes</strong></em>. </p><p><strong>In practice</strong></p><p>Let&apos;s imagine we&apos;re creating a release notes generator. You need an agent to monitor a GitHub repository for merged pull requests, retrieve ticket details from Jira, cross-reference your style guide, draft release notes in the proper voice, and then route the draft to a writer via Slack. </p><p>Here&apos;s how you might build it:</p><p>GitHub Actions or n8n detects the merged PR and kicks off the workflow. n8n calls Claude, which uses MCP to pull the PR details from GitHub and ticket context from Jira. Claude drafts the release notes. n8n routes the draft to Slack. </p><p><strong>Jot down a clear goal</strong> and define the inputs and outputs. What triggers the workflow? What does &quot;done&quot; look like? Keep it tight. <a href="https://docs.github.com/en/actions?ref=blog.jillshaheen.com" rel="noreferrer">GitHub Actions</a> can handle the trigger logic, and tools like <a href="https://n8n.io/?ref=blog.jillshaheen.com" rel="noreferrer">n8n</a> or <a href="https://www.make.com/en?ref=blog.jillshaheen.com" rel="noreferrer">Make</a> can help you map the full workflow on a visual canvas before you write out your instructions.</p><p>Next, <strong>identify the tools</strong> that the agent needs to connect to and wire them up. This is where MCP comes in. <a href="https://code.claude.com/docs/en/mcp?ref=blog.jillshaheen.com" rel="noreferrer">Claude with MCP servers</a> gives you structured, reliable connections to GitHub, Jira, your docs repository, and Slack without one-off integrations. </p><ol><li>Get started on<strong> Claude Desktop </strong>or<strong> Claude Code.</strong> Both support MCP server configuration through a JSON config file. You add server definitions for each tool you want to connect, provide API credentials, and Claude can then interact with those tools directly.</li><li><strong>Connect GitHub first</strong>. <a href="https://docs.github.com/en/copilot/how-tos/provide-context/use-mcp/set-up-the-github-mcp-server?ref=blog.jillshaheen.com">GitHub has an official MCP server</a> maintained by Anthropic. It&apos;s the most stable starting point and handles pull requests, issues, and repository operations. Test it with a real task. Ask Claude to list your open pull requests or summarize recent commits on a repo you own. If it works, you have a functioning MCP connection.</li><li><strong>Add Jira </strong>after GitHub is working. Jira has a couple options. The most popular community option is <a href="https://www.augmentcode.com/mcp/mcp-atlassian?ref=blog.jillshaheen.com">mcp-atlassian</a>, which covers both Jira and Confluence and uses your Atlassian URL and API token for authentication. The <a href="https://support.atlassian.com/atlassian-rovo-mcp-server/docs/getting-started-with-the-atlassian-remote-mcp-server/?ref=blog.jillshaheen.com">official Atlassian MCP server</a> also exists but has had some reported authentication stability issues.</li><li>Once you&apos;ve confirmed that Jira is set up, <strong>connect to </strong><a href="https://slack.com/help/articles/48855576908307-Guide-to-the-Slack-MCP-server?ref=blog.jillshaheen.com"><strong>Slack&apos;s official MCP server</strong></a>, available through the MCP servers registry.</li><li>For your <strong>docs repository</strong>, if it&apos;s on GitHub that&apos;s already covered. If it&apos;s Confluence, mcp-atlassian handles that too.</li><li>Finally, set up n8n or Make for automation. MCP handles the connections. n8n handles the orchestration. </li></ol><p>Now you can <strong>write the prompt strategy</strong>, or the instructions that tell the agent how to reason across the data it retrieves from each connected tool. Prompt strategies feel like writing. Define the tone, scope, what to include, what to skip, how to handle edge cases like incomplete tickets or features that touch multiple services. </p><p>What you might not know how to do yet is <strong>handle failure at the system level</strong>. A prompt that works perfectly in isolation breaks when an agent is chaining multiple steps. Context that seems obvious to a human reader is invisible to a model that only sees what you explicitly provide. Small ambiguities compound in ways they never do in a static document.</p><p>Understand that when the agent breaks, it&apos;s because you&apos;ve underspecified something. Treat prompts the way you treat documentation: <strong>validate against real conditions</strong>. Test against messy merged PRs, tickets with missing fields, and features that span multiple teams. Each break is a lesson in where your instructions are falling short.</p><p><strong>What I had to learn</strong></p><p>I assumed my existing skills would transfer cleanly to agentic workflows. And they partially did. The writing instincts that help me anticipate a reader&apos;s confusion translate well to designing prompts. I&apos;m still asking: what does this system need to know, in what order, and where will it go wrong if I leave something out?</p><p>The instinct to anticipate failure modes is already there. Technical writers spend years thinking about what a user will misread, skip, or misapply. We also know how to connect systems. We&apos;ve been building with APIs, webhooks, and automation tools forever. </p><p>But connecting systems for humans and designing systems for AI agents are different problems, so I had to learn to validate at the system level, not just the sentence level. I didn&apos;t fully appreciate that until I started working with MCP.</p><p><strong>What you need to do right now</strong></p><p>Based on my own path, a few things will make the biggest difference when you make the shift: </p><ul><li>Understand that an AI model can only work with what fits in its context window at one time, and that space fills up quickly when an agent is juggling multiple tools and steps.</li><li>Get hands-on with at least one agentic tool beyond a standard chatbot interface. </li><li>Build something small that solves a real problem. </li><li>Document what breaks. </li></ul><p>The writers who understand how AI systems actually work will be the ones who define how AI systems behave in production. You need to design in reliability, consistency, and usefulness from the start, then iterate as you go. It&apos;s a technical writing problem, and we&apos;re well-positioned to solve it. Now stop using and start building!</p><hr><p><em>This post is part of the </em><a href="https://brandihopkins.com/per-the-docs/2026-03-professional-development/?ref=blog.jillshaheen.com" rel="noreferrer"><strong><em>Per the docs</em></strong></a><em> article series, a monthly collaborative series where technical writers explore different aspects of our craft. Each month features a new topic with perspectives from writers across the community. </em></p><ul><li><strong>Previous article: </strong>Shelby White - <a href="https://swhite17.z13.web.core.windows.net/blogs.html?ref=blog.jillshaheen.com#github" rel="noreferrer">Getting started with Github</a></li><li><strong>Next article: </strong>Brandi Hopkins - <a href="https://brandihopkins.com/per-the-docs-professional-development?ref=blog.jillshaheen.com" rel="noreferrer">Professional Development for Technical Writers: What to invest in as your career evolves</a> </li></ul><p><a href="https://brandihopkins.com/per-the-docs/2026-03-professional-development/?ref=blog.jillshaheen.com" rel="noreferrer">See the full list of participants and articles &#x2192;</a></p><p><em><strong>Disclaimer:</strong> Each article in this series is written and owned by its respective author. The views, opinions, and experiences shared belong solely to the individual writer and do not represent the perspectives of other participants or their employers (past or present).</em></p>]]></content:encoded></item><item><title><![CDATA[Docs-as-code gotchas for technical writers]]></title><description><![CDATA[You've made the switch to docs-as-code. Git makes sense. Branches are fine. Then your build fails for no reason. These are the invisible problems that make you question whether you broke something critical, or just don't understand how any of this works.]]></description><link>https://blog.jillshaheen.com/git-gotchas/</link><guid isPermaLink="false">697d7ab6f2d2010e521ba5ac</guid><category><![CDATA[Git]]></category><category><![CDATA[Docs as Code]]></category><category><![CDATA[Documentation Tools]]></category><dc:creator><![CDATA[Jill Shaheen]]></dc:creator><pubDate>Sat, 31 Jan 2026 01:49:28 GMT</pubDate><media:content url="https://blog.jillshaheen.com/content/images/2026/01/git-gotchas.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jillshaheen.com/content/images/2026/01/git-gotchas.png" alt="Docs-as-code gotchas for technical writers"><p><strong>More in the docs-as-code series:</strong></p><ul><li><a href="https://blog.jillshaheen.com/git-hygiene/" rel="noreferrer">Git hygiene for technical writers</a>&#xA0;&#x2014; Best practices for a smooth start in Git-based documentation.</li><li><a href="https://blog.jillshaheen.com/git-transitioning-to-docs-as-code/" rel="noreferrer">What to expect when you&apos;re expecting docs-as-code</a>&#xA0;&#x2014; A field guide for writers new to Git-based workflows.</li></ul><hr><p>This article covers environment-specific and markup-specific gotchas. For fundamental Git workflow practices like branching strategy, commit messages, pulling frequently, and handling merge conflicts, see my companion post&#xA0;<a href="https://blog.jillshaheen.com/git-hygiene/" rel="noreferrer">Git hygiene for technical writers</a>.</p><h3 id="in-this-article">In this article:</h3><ul><li><a href="#gotcha-1-the-hidden-gitignore-file" rel="noreferrer">The hidden .gitignore file</a></li><li><a href="#gotcha-2-your-editor-config-matters" rel="noreferrer">Your editor config matters</a></li><li><a href="#gotcha-3-you-cant-delete-history-and-thats-good" rel="noreferrer">You can&apos;t delete history (and that&apos;s good)</a></li><li><a href="#gotcha-4-trailing-spaces-break-cross-references" rel="noreferrer">Trailing spaces break cross-references</a></li><li><a href="#gotcha-5-build-times-vary-wildly" rel="noreferrer">Build times vary wildly</a></li><li><a href="#gotcha-6-documentation-lives-with-code" rel="noreferrer">Documentation lives with code</a></li><li><a href="#gotcha-7-pull-request-review-isnt-universal" rel="noreferrer">Pull request review isn&apos;t universal</a></li><li><a href="#gotcha-8-platform-specific-features-dont-transfer" rel="noreferrer">Platform-specific features don&apos;t transfer</a></li></ul><h3 id="gotcha-1-the-hidden-gitignore-file">Gotcha #1: The hidden&#xA0;<code>.gitignore</code>&#xA0;file</h3><p><code>.gitignore</code>&#xA0;tells Git which files&#xA0;<strong>not to track or commit</strong>. In docs-as-code workflows, this usually includes generated build files, dependency folders, caches, logs, and local configuration files. These files are either machine-specific or automatically generated, so they don&#x2019;t belong in version control.</p><p><strong>Why it matters:</strong>&#xA0;If a file isn&#x2019;t showing up in&#xA0;<code>git status</code>, or a change seems to disappear, it might be intentionally ignored. This helps keep pull requests focused on real documentation changes and prevents accidental commits of noisy or sensitive files.</p><p><strong>Common examples in docs projects:</strong></p><ul><li>Build output folders like&#xA0;<code>/build</code>,&#xA0;<code>/site</code>, or&#xA0;<code>/public</code></li><li>Dependency folders like&#xA0;<code>node_modules</code></li><li>Temporary files, caches, and logs</li><li>Local environment files such as&#xA0;<code>.env</code></li></ul><h4 id="how-to-use-it">How to use it</h4><p>You usually don&#x2019;t need to create a&#xA0;<code>.gitignore</code>&#xA0;from scratch. Most repos include one already, tailored to the tools they use. As a tech writer, your job is to understand what it&#x2019;s doing.</p><ul><li>If a file isn&#x2019;t being tracked, check&#xA0;<code>.gitignore</code>&#xA0;before assuming Git is broken.</li><li>Don&#x2019;t remove ignore rules just to make Git &quot;see&quot; a file. Ask whether that file should really be committed.</li><li>When adding new tools (for example, a local preview server or build step), you might need to add new ignore rules for their generated files.</li></ul><p><strong>Learn more:</strong>&#xA0;<a href="https://git-scm.com/docs/gitignore?ref=blog.jillshaheen.com" rel="noopener noreferrer">Official Git documentation on&#xA0;<code>.gitignore</code>&#xA0;</a>and&#xA0;<a href="https://github.com/github/gitignore?ref=blog.jillshaheen.com" rel="noopener noreferrer">GitHub&#x2019;s collection of&#xA0;<code>.gitignore</code>&#xA0;templates&#xA0;</a>are excellent references when you&#x2019;re unsure what should (or shouldn&#x2019;t) be ignored.</p><h3 id="gotcha-2-your-editor-config-matters">Gotcha #2: Your editor config matters</h3><p>Different editors have different defaults for tabs vs. spaces, file encoding, and line endings.</p><p><strong>Fix:</strong>&#xA0;Create an&#xA0;<code>.editorconfig</code>&#xA0;file in your repository root:</p><pre><code>root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2</code></pre><p>This makes everyone&apos;s editor behave consistently.</p><h3 id="gotcha-3-you-cant-delete-history-and-thats-good">Gotcha #3: You can&apos;t delete history (and that&apos;s good)</h3><p>Once you commit something, it&apos;s in the Git history forever. Even if you delete it in the next commit.</p><p><strong>Implication:</strong>&#xA0;Don&apos;t commit passwords, API keys, or sensitive information. Ever.</p><p><strong>If you do:</strong>&#xA0;Tell your security team immediately. The repository needs special cleanup.</p><h3 id="gotcha-4-trailing-spaces-break-cross-references">Gotcha #4: Trailing spaces break cross-references</h3><p>Trailing whitespace inside attribute values can break cross-references and links. How much this matters depends on your markup language.</p><p><strong>XML/DocBook (strict):</strong>&#xA0;Parsers treat extra space as part of the unique identifier. The link&#xA0;<code>&lt;xref linkend=&quot;section-id&quot;/&gt;</code>&#xA0;fails to match the target&#xA0;<code>&lt;section id=&quot;section-id &quot;/&gt;</code>&#xA0;because &quot;section-id&quot; and &quot;section-id &quot; are different identifiers.</p><p><strong>Markdown (forgiving):</strong>&#xA0;Generally handles whitespace gracefully, though reference-style links can fail if the reference ID has trailing spaces.</p><p><strong>HTML (somewhat forgiving):</strong>&#xA0;Fragment links like&#xA0;<code>&lt;a href=&quot;#section-id &quot;&gt;</code>&#xA0;won&apos;t match&#xA0;<code>&lt;div id=&quot;section-id&quot;&gt;</code>, but HTML parsers are more lenient than XML parsers.</p><p><strong>The problem in XML (shown as example):</strong></p><pre><code>&lt;!-- Broken: space in the link reference --&gt;
&lt;xref linkend=&quot;section-id &quot;/&gt;

&lt;!-- Broken: space in the target ID --&gt;
&lt;section id=&quot;section-id &quot;&gt;

&lt;!-- Works: no trailing spaces --&gt;
&lt;xref linkend=&quot;section-id&quot;/&gt;
&lt;section id=&quot;section-id&quot;&gt;</code></pre><p><strong>Why it happens:</strong>&#xA0;XML parsers don&apos;t automatically trim whitespace from attribute values. An ID like&#xA0;<code>id=&quot;chapter1 &quot;</code>&#xA0;is treated as completely different from&#xA0;<code>id=&quot;chapter1&quot;</code>. The build system looks for an exact match and can&apos;t find it.</p><p><strong>Symptom:</strong>&#xA0;Links that look fine in your editor don&apos;t work in the built documentation. Cross-references render as plain text instead of hyperlinks. Build validation might report &quot;target not found&quot; errors even though you can see the target right there in the source.</p><p><strong>Prevention (works for all markup languages):</strong>&#xA0;Configure your editor to show whitespace characters and trim trailing spaces on save.</p><p>In VS Code:</p><pre><code>&quot;files.trimTrailingWhitespace&quot;: true,
&quot;editor.renderWhitespace&quot;: &quot;all&quot;</code></pre><p>In Oxygen XML Editor: Enable &quot;Show whitespace&quot; in preferences and set &quot;Remove trailing whitespace&quot; in formatting options.</p><p><strong>Advanced fixes for XML:</strong>&#xA0;If you&apos;re building XSLT transformations or XML processing pipelines, use&#xA0;<code>&lt;xsl:strip-space elements=&quot;*&quot;/&gt;</code>&#xA0;to remove unnecessary whitespace during transformation. For JSON-to-XML converters or other XML generators, configure them to trim leading and trailing whitespace from attribute values before output.</p><p><strong>My experience:</strong>&#xA0;This caused so many mysterious build failures for me. I&apos;d commit what looked like a perfect link, but the build would fail or the link wouldn&apos;t work. The space inside the quotes is nearly invisible but completely breaks ID matching. I learned to always enable whitespace visualization in Oxygen and to configure automatic trimming on save. The problem can be on either end of the reference&#x2014;in your&#xA0;<code>linkend</code>&#xA0;attribute or in the target&apos;s&#xA0;<code>id</code>&#xA0;attribute. Both need to be clean.</p><h3 id="gotcha-5-build-times-vary-wildly">Gotcha #5: Build times vary wildly</h3><p>If your docs-as-code system has a local build command, use it. But understand that local builds and production builds can be very different experiences.</p><p><strong>Why:</strong>&#xA0;You&apos;ll catch broken links, syntax errors, and formatting problems before they hit the repository. But local builds might complete in seconds while production builds take hours.</p><p><strong>My experience:</strong>&#xA0;Our local Oxygen builds were nearly instant. You could see your XML render immediately. But pushing to the internal Git farm triggered a custom build system that could take 2-4 hours to fully propagate changes to the public doc site. This created a workflow challenge. You couldn&apos;t quickly iterate on customer-facing changes. Every push needed to be carefully tested locally first.</p><p><strong>What to ask in interviews:</strong>&#xA0;&quot;How long does a typical build take from merge to live?&quot; and &quot;Can I preview changes before they go live?&quot; These answers will tell you a lot about your day-to-day experience.</p><p><strong>Typical commands:</strong></p><pre><code># Test the build locally
make build

# Or
npm run build

# Or whatever your system uses</code></pre><h3 id="gotcha-6-documentation-lives-with-code">Gotcha #6: Documentation lives with code</h3><p>In many docs-as-code setups, your documentation files live in the same repository as the actual product code.</p><p><strong>Implication:</strong></p><ul><li>You&apos;ll see code files you don&apos;t need to touch</li><li>Builds might include compiling actual software</li><li>You need read access to proprietary code</li></ul><p><strong>Navigation tip:</strong>&#xA0;Learn the repository structure early. Know where docs live vs. code.</p><h3 id="gotcha-7-pull-request-review-isnt-universal">Gotcha #7: Pull request review isn&apos;t universal</h3><p>Many docs-as-code guides assume every change goes through pull request review. This isn&apos;t always true.</p><p><strong>Why it matters:</strong>&#xA0;You might see job descriptions or tutorials that emphasize peer review workflows, but the actual practice varies widely by company and team.</p><p><strong>My experience:</strong>&#xA0;Our Git system supported Change Requests (CRs, basically pull requests), but most writers merged their own work without review. If you owned your docs package, you were trusted to maintain quality independently. Review workflows existed but were optional.</p><p><strong>What to ask in interviews:</strong>&#xA0;&quot;What&apos;s your review process for documentation changes?&quot; The answer tells you about trust levels, team size, and quality assurance practices.</p><h3 id="gotcha-8-platform-specific-features-dont-transfer">Gotcha #8: Platform-specific features don&apos;t transfer</h3><p>GitHub has features like Actions, Projects, and Discussions. GitLab has different features. Internal Git systems have their own custom tooling.</p><p><strong>Why it matters:</strong>&#xA0;When you switch companies or platforms, you&apos;re learning that platform&apos;s entire content ecosystem.</p><p><strong>My experience:</strong>&#xA0;I got very comfortable with our internal review system, build triggers, and preview tools. Now when I look at GitHub repositories, I&apos;m relearning how to set up Actions, understand Checks, and use Projects. The Git fundamentals (commit, branch, merge) are identical. The platform features are completely different.</p><p><strong>What this means:</strong>&#xA0;Don&apos;t assume your docs-as-code experience at one company will transfer perfectly to another. The core Git skills do transfer. The platform-specific workflows don&apos;t.</p><h3 id="you-got-this">You got this</h3><p>After years of managing writers in docs-as-code environments, I can tell you this: everyone hits these gotchas. Senior developers who&apos;ve used Git for a decade still Google how to fix merge conflicts. Experienced technical writers still lose time to trailing spaces in XML attributes.</p><p>The difference between a frustrating experience and a productive one is knowing these problems exist and having the fixes ready.</p><p>Most of these issues have straightforward solutions:</p><ul><li>Configure your editor once to show whitespace and trim trailing spaces</li><li>Learn your .gitignore and .editorconfig files</li><li>Pull frequently, push infrequently, delete merged branches immediately</li><li>Ask about platform-specific features in interviews</li></ul><p>You won&apos;t avoid all of these problems. But you&apos;ll spend minutes fixing them instead of hours wondering what&apos;s wrong.</p><p>The goal isn&apos;t Git expertise. The goal is comfortable productivity. Know where the invisible obstacles are, and docs-as-code becomes infrastructure you barely think about.</p>]]></content:encoded></item><item><title><![CDATA[What to expect when you're expecting docs-as-code]]></title><description><![CDATA[Docs-as-code. Version control. Git workflows. Pull requests. CI/CD pipelines. If those terms make your stomach flip, you're not alone. Here's what docs-as-code actually means in practice and what your day will look like as a technical writer.]]></description><link>https://blog.jillshaheen.com/git-transitioning-to-docs-as-code/</link><guid isPermaLink="false">697d7ab6f2d2010e521ba5ab</guid><category><![CDATA[Git]]></category><category><![CDATA[Career Development]]></category><category><![CDATA[Docs as Code]]></category><category><![CDATA[Documentation Tools]]></category><category><![CDATA[Technical Writing]]></category><dc:creator><![CDATA[Jill Shaheen]]></dc:creator><pubDate>Thu, 29 Jan 2026 01:44:00 GMT</pubDate><media:content url="https://blog.jillshaheen.com/content/images/2026/01/git-workflow.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jillshaheen.com/content/images/2026/01/git-workflow.png" alt="What to expect when you&apos;re expecting docs-as-code"><p><strong>More in the docs-as-code series:</strong></p><ul><li><a href="https://blog.jillshaheen.com/git-hygiene/" rel="noreferrer">Git hygiene for technical writers</a>&#xA0;&#x2014; Best practices for a smooth start in Git-based documentation.</li><li><a href="https://blog.jillshaheen.com/git-gotchas/" rel="noreferrer">Docs-as-code gotchas for technical writers</a>&#xA0;&#x2014; Avoid the most common pitfalls when working in docs-as-code environments.</li></ul><hr><h3 id="in-this-article">In this article:</h3><ul><li><a href="#what-docs-as-code-means" rel="noreferrer">What docs-as-code means</a></li><li><a href="#the-toolchain-what-you-need" rel="noreferrer">The toolchain: What you need</a></li><li><a href="#your-typical-day-actual-workflow" rel="noreferrer">Your typical day: Actual workflow</a></li><li><a href="#the-learning-curve-what-gets-easier" rel="noreferrer">The learning curve: What gets easier</a></li><li><a href="#working-with-other-writers-collaboration-patterns" rel="noreferrer">Working with other writers: Collaboration patterns</a></li><li><a href="#what-success-looks-like" rel="noreferrer">What success looks like</a></li><li><a href="#making-the-transition" rel="noreferrer">Making the transition</a></li><li><a href="#the-benefit-nobody-talks-about" rel="noreferrer">The benefit nobody talks about</a></li></ul><h3 id="what-docs-as-code-means">What docs-as-code means</h3><p>Docs-as-code means treating documentation like software developers treat code:</p><ul><li>Files live in version control (usually Git)</li><li>Changes go through review processes (pull requests)</li><li>Multiple people work on the same files simultaneously</li><li>Automated systems build and deploy your content</li></ul><p>That&apos;s it. You&apos;re learning developer workflows, not becoming a developer.</p><p>What you get:</p><ul><li>Complete change history (who changed what, when, and why)</li><li>The ability to work in parallel without stepping on each other</li><li>Automated checks before content goes live</li><li>Integration with the same systems engineers use</li></ul><h3 id="the-toolchain-what-you-need">The toolchain: What you need</h3><h4 id="required-tools">Required tools</h4><p><strong>Git</strong>&#xA0;- Version control system that tracks changes to your files</p><ul><li>Think of it as Track Changes on steroids</li><li>Works from command line or GUI tools</li><li>Stores complete history of every change</li></ul><p><strong>Text editor or IDE</strong>&#xA0;- Where you write</p><ul><li>VS Code is popular (free, extensions for everything)</li><li>Oxygen XML Editor (powerful but pricey)</li><li>Atom, Sublime, IntelliJ, or whatever you like</li><li>Key feature: integration with Git</li></ul><p><strong>My experience:</strong>&#xA0;I used Oxygen XML Editor at my job, which has built-in Git integration. You could commit, push, and pull right from the editor without touching the command line if you wanted to, but I enjoy the unbridled power of the CLI. Now that I&apos;m exploring other companies&apos; toolchains, I like to use VS Code with its built-in terminal. And the many available extensions give you functionality that&apos;s similar to Oxygen for free. </p><p><strong>Markdown or similar</strong>&#xA0;- Lightweight markup language</p><ul><li>Plain text with simple formatting codes</li><li><code>**bold**</code>&#xA0;becomes&#xA0;<strong>bold</strong></li><li><code># Heading</code>&#xA0;becomes a heading</li><li>Learn the basics in 30 minutes</li></ul><p><strong>XML (or similar structured markup)</strong>&#xA0;- More robust markup for complex documentation</p><ul><li>DocBook XML is common for technical documentation</li><li>DITA (Darwin Information Typing Architecture) for modular content</li><li>Custom XML schemas specific to your company</li><li>More verbose than Markdown but handles complex structure better</li></ul><p><strong>My experience:</strong>&#xA0;My team used a customized version of DocBook XML, which Oxygen XML Editor handled beautifully. The verbosity takes getting used to after Markdown, but XML schemas enforce consistency and enable sophisticated content reuse. Many companies are moving toward Markdown for simplicity, but XML is still prevalent in enterprise documentation.</p><h4 id="common-additional-tools">Common additional tools</h4><p><strong>GitHub/GitLab/Bitbucket</strong>&#xA0;- Web platforms for Git repositories</p><ul><li>Where your files live</li><li>Where you submit changes for review</li><li>Where you collaborate with team</li><li><strong>Note:</strong>&#xA0;Some companies use internal Git servers instead of public platforms</li></ul><p><strong>My experience:</strong>&#xA0;We had an internal Git farm (not GitHub), so everything lived behind the corporate firewall. The Git commands were identical, but the web interface was custom-built. Now I&apos;m relearning GitHub-specific features like Actions, Projects, and the slightly different pull request workflow. The core concepts transfer completely. It&apos;s just the UI that&apos;s different.</p><p><strong>Build tools</strong>&#xA0;- Systems that turn your source files into websites</p><ul><li>Hugo, Jekyll, Sphinx, or custom systems</li><li>Usually configured by someone else</li><li>You just need to know basic commands</li><li><strong>Critical reality check:</strong>&#xA0;Some builds are fast (seconds), some are slow (hours)</li></ul><p><strong>My experience:</strong>&#xA0;We had a custom build system that could take hours to fully propagate changes to the public docs site. You&apos;d push a change in the morning and check back after lunch to see if it appeared. This meant you couldn&apos;t iterate quickly. Every change required planning. Some companies have builds that complete in seconds. Ask about this in interviews. Build speed dramatically affects your workflow and stress levels.</p><p><strong>Static site generators</strong>&#xA0;- Create websites from your Markdown</p><ul><li>Convert your files to HTML</li><li>Apply styling automatically</li><li>Generate navigation and search</li></ul><h3 id="your-typical-day-actual-workflow">Your typical day: Actual workflow</h3><p>Here&apos;s what working in docs-as-code actually looks like:</p><h4 id="morning-sync-and-plan">Morning: Sync and plan</h4><pre><code># Update your local copy with latest changes
git pull origin main

# See what changed overnight
git log --oneline --since=&quot;yesterday&quot;</code></pre><p>You&apos;re checking what your teammates changed while you slept. No different from checking email or Slack. Takes 30 seconds.</p><h4 id="mid-morning-create-your-working-branch">Mid-morning: Create your working branch</h4><pre><code># Create a branch for your work
git checkout -b js-add-authentication-docs</code></pre><p>Branches let you work independently. You can make any changes you want without affecting anyone else. Your teammates do the same. When everyone&apos;s ready, you merge the changes together.</p><p><strong>Branch naming tip:</strong>&#xA0;Prefix with your initials and use descriptive names like&#xA0;<code>js-add-authentication-docs</code>&#xA0;or&#xA0;<code>js-DOC1234-authentication</code>. You&apos;ll be juggling multiple branches, and good names help you find the right one quickly.</p><h4 id="all-day-write-and-commit">All day: Write and commit</h4><pre><code>&lt;!-- You write in your text editor --&gt;
&lt;!-- In Markdown: --&gt;
# API Authentication

To authenticate requests, include your API key in the header:

`Authorization: Bearer YOUR_API_KEY`

&lt;!-- Or in DocBook XML: --&gt;
&lt;section xml:id=&quot;api-authentication&quot;&gt;
  &lt;title&gt;API Authentication&lt;/title&gt;
  &lt;para&gt;To authenticate requests, include your API key in the header:&lt;/para&gt;
  &lt;programlisting&gt;Authorization: Bearer YOUR_API_KEY&lt;/programlisting&gt;
&lt;/section&gt;</code></pre><pre><code># Save your changes periodically
git add .
git commit -m &quot;Add authentication section to API docs&quot;

# Pull from main frequently to stay current
git pull origin main</code></pre><p>Committing is like saving versions of your Word doc, except each version has a description of what changed. You can always go back to any previous version.</p><p><strong>Best practice:</strong>&#xA0;Commit often with small, meaningful changes. Pull from main throughout the day to avoid nasty merge conflicts later. The more frequently you pull and merge, the easier conflicts are to resolve.</p><h4 id="afternoon-get-feedback">Afternoon: Get feedback</h4><pre><code># Push your branch to the server
git push origin js-add-authentication-docs</code></pre><p>This is the stage where you seek feedback from technical reviewers, editors, or peer writers. The process is often iterative:</p><ol><li>Submit your changes for review (via pull request, change request, or shared branch).</li><li>Reviewers (tech leads, editors, or peers) provide comments, suggestions, or edits.</li><li>You incorporate their feedback, make revisions, and update your branch.</li><li>Repeat the review cycle as needed until all feedback is addressed and reviewers approve the changes.</li></ol><p>Depending on your team, this may involve multiple rounds of feedback, especially for complex or high-visibility documentation. Editors may create a separate branch for markup, or leave inline comments in your pull request. Peer review is common in larger teams, while solo writers may self-review or rely on editor feedback.</p><p><strong>Best practice:</strong>&#xA0;Treat feedback as a collaborative process. Ask clarifying questions, discuss suggestions, and make sure all technical and editorial concerns are resolved before merging.</p><p>Only after all feedback is incorporated and reviewers are satisfied should you proceed to merge and deploy your changes.</p><h4 id="end-of-day-merge-and-deploy">End of day: Merge and deploy</h4><p>Once your work is ready, you merge your branch. Your changes go live.</p><p>Automated systems:</p><ul><li>Run quality checks</li><li>Build the documentation site</li><li>Deploy to production</li></ul><p>You watch it happen. You don&apos;t make it happen.</p><p><strong>Important:</strong>&#xA0;Delete your branch immediately after merging, both locally and on the remote. Do it right then while you&apos;re thinking about it. Otherwise you&apos;ll accumulate dozens of stale branches cluttering your workspace.</p><pre><code># After merge, delete the branch
git branch -d js-add-authentication-docs
git push origin --delete js-add-authentication-docs</code></pre><h3 id="the-learning-curve-what-gets-easier">The learning curve: What gets easier</h3><p><strong>Week 1:</strong>&#xA0;Everything feels awkward</p><ul><li>You&apos;ll use cheat sheets constantly</li><li>Every command requires looking something up</li><li>You&apos;ll accidentally commit things you shouldn&apos;t</li></ul><p><strong>Month 1:</strong>&#xA0;Basic workflows become automatic</p><ul><li>Clone, branch, commit, push feels natural</li><li>You stop panicking about merge conflicts</li><li>You can help newer teammates</li></ul><p><strong>Month 3:</strong>&#xA0;You&apos;re spotting efficiency gains</p><ul><li>You know when to rebase vs. merge</li><li>You create aliases for common commands</li><li>You&apos;re suggesting workflow improvements</li></ul><p><strong>Month 6:</strong>&#xA0;You forget you were ever intimidated</p><ul><li>Git becomes invisible infrastructure</li><li>You focus on content, not tools</li><li>You wonder how you ever worked without it</li></ul><p><strong>Navigation tip:</strong>&#xA0;Learn the repository structure early. Know where docs live vs. code.</p><h3 id="working-with-other-writers-collaboration-patterns">Working with other writers: Collaboration patterns</h3>
<!--kg-card-begin: html-->
<table style="width: 720px !important; table-layout: fixed; white-space: normal !important;">
  <thead>
    <tr>
      <th style="width: 140px !important; word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Pattern</th>
      <th style="width: 200px !important; word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Description</th>
      <th style="width: 180px !important; word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Works well when</th>
      <th style="width: 200px !important; word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Watch out for</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">File-level ownership</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Each writer owns specific files. You rarely edit the same file simultaneously.</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Documentation is modular and clearly divided.</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Shared files like navigation or configuration.</td>
    </tr>
    <tr>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Topic branches</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Each feature or update gets its own branch. Multiple writers can work on different branches simultaneously.</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Changes are independent and don&apos;t overlap.</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Long-lived branches that diverge from main.</td>
    </tr>
    <tr>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Self-merge (trust model)</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Writers merge their own work without peer review. Common when writers are solo owners of their documentation packages.</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Writers are experienced, documentation is clearly divided, and quality is maintained through other means (style guides, automated checks).</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Errors that a second pair of eyes would catch. Consider occasional spot checks or retrospective reviews.</td>
    </tr>
    <tr>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Editor branch workflow</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">When an editor is involved, they pull down your working branch and create a new branch with their edits (like <code>edit-your-branch-name</code>).</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Your authoring tool supports editing markup (like Oxygen&apos;s track changes), and you want detailed editorial feedback.</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Branch proliferation. Clean up edit branches after merging.</td>
    </tr>
    <tr>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Review rotation</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Writers review each other&apos;s pull requests on rotation.</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Team size is 3-8 people and you want consistent peer accountability.</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Review bottlenecks. Set expectations for response time.</td>
    </tr>
    <tr>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Sync meetings</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Quick daily or weekly syncs where everyone says what they&apos;re working on.</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Prevents two people updating the same section without knowing.</td>
      <td style="word-wrap: break-word; overflow-wrap: break-word; white-space: normal !important;">Keep short: 15 minutes max. Just awareness, not detailed review.</td>
    </tr>
  </tbody>
</table>
<!--kg-card-end: html-->
<h3 id="what-success-looks-like">What success looks like</h3><p>After three months in docs-as-code, you should:</p><ul><li>Clone a repository without looking up commands</li><li>Create branches, commit changes, and push them confidently</li><li>Review pull requests and leave meaningful comments</li><li>Resolve simple merge conflicts independently</li><li>Know when to ask for help vs. Google it</li></ul><p>You won&apos;t know everything. Nobody does. Developers who&apos;ve used Git for years still Google commands.</p><p>The goal isn&apos;t Git expertise. The goal is comfortable productivity.</p><h3 id="making-the-transition">Making the transition</h3><h4 id="if-youre-just-starting">If you&apos;re just starting</h4><ol><li><strong>Install Git and a text editor</strong>&#xA0;(VS Code is fine)</li><li><strong>Take a GitHub Skills course</strong>&#xA0;(free, interactive, 30 minutes)</li><li><strong>Practice with a personal project</strong>&#xA0;before touching work files</li><li><strong>Ask teammates for their cheat sheets</strong>&#xA0;(everyone has them)</li><li><strong>Commit early and often</strong>&#xA0;(small commits are easier to understand)</li></ol><h4 id="if-youre-switching-platforms">If you&apos;re switching platforms</h4><p>Moving from one docs-as-code system to another? Here&apos;s what I&apos;m learning:</p><ol><li><strong>Core Git skills transfer perfectly</strong>&#xA0;- commit, branch, merge, pull, push work identically</li><li><strong>Platform features don&apos;t transfer</strong>&#xA0;- GitHub Actions &#x2260; my old internal build triggers</li><li><strong>Give yourself grace</strong>&#xA0;- You&apos;re not starting over, but you are learning new tools</li><li><strong>Your editor might change</strong>&#xA0;- Oxygen &#x2192; VS Code means relearning keyboard shortcuts</li><li><strong>Build times might shock you</strong>&#xA0;- Hours &#x2192; seconds feels magical; seconds &#x2192; hours feels painful</li></ol><p><strong>What I wish I&apos;d known:</strong>&#xA0;When I started interviewing, I undersold my Git experience because I&apos;d only used an internal system, not GitHub. That was a mistake. Git is Git. The commands are identical. I just needed to learn GitHub&apos;s UI, which took about a week.</p><p><strong>Questions to ask:</strong>&#xA0;When interviewing at new companies, ask about their review process. &quot;Do writers merge their own work or is peer review required?&quot; and &quot;How are edits handled?&quot; These answers reveal team culture, trust levels, and your actual day-to-day workflow.</p><h4 id="if-youre-struggling">If you&apos;re struggling</h4><ol><li><strong>You&apos;re not alone</strong>&#xA0;- Every writer goes through this</li><li><strong>GUI tools help</strong>&#xA0;- GitHub Desktop, Sourcetree, GitKraken make it visual</li><li><strong>Command line comes later</strong>&#xA0;- Start with GUI, graduate to terminal when ready</li><li><strong>Mistakes are recoverable</strong>&#xA0;- Almost nothing is permanent</li><li><strong>Your teammates want you to succeed</strong>&#xA0;- They&apos;ve been exactly where you are</li></ol><h4 id="resources-that-help">Resources that help</h4><p><strong>For Git basics:</strong></p><ul><li>GitHub Skills (interactive tutorials)</li><li>&quot;Git for Humans&quot; by David Demaree (book)</li><li>Oh Shit, Git!?! (ohshitgit.com) - fixes for common mistakes</li></ul><p><strong>For Markdown:</strong></p><ul><li>Markdown Guide (markdownguide.org)</li><li>Your first draft (just start writing, look up syntax as needed)</li></ul><p><strong>For XML/DocBook:</strong></p><ul><li>DocBook: The Definitive Guide (docbook.org)</li><li>Your company&apos;s schema documentation (every implementation is different)</li><li>Oxygen XML Editor tutorials (if you&apos;re using Oxygen)</li></ul><p><strong>For build tools:</strong></p><ul><li>Your team&apos;s documentation (every system is different)</li><li>README.md in your repository (usually has setup instructions)</li></ul><h3 id="the-benefit-nobody-talks-about">The benefit nobody talks about</h3><p>Docs-as-code gives you one thing that traditional tools don&apos;t:&#xA0;<strong>evidence of your work</strong>.</p><p>Your Git history becomes a portfolio. Every commit shows:</p><ul><li>What you changed</li><li>Why you changed it</li><li>How it improved the docs</li></ul><p>When performance review comes, you have metrics. When you apply for your next job, you can point to real contributions in public repositories.</p><p>Traditional docs tools hide this evidence. Docs-as-code makes it visible.</p><h3 id="youve-got-this">You&apos;ve got this</h3><p>Docs-as-code isn&apos;t about becoming a developer. It&apos;s about using developer tools to make collaboration easier and documentation better.</p><p>The learning curve is real. But it&apos;s not steep. And the payoff (better collaboration, clearer history, automated quality checks) makes the investment worth it.</p><p>Whether you&apos;re starting fresh, switching from traditional tools, or moving between docs-as-code platforms (like I am), the fundamentals stay the same. Git is Git. The platforms just wrap different features around it.</p><p>Start small. Be patient with yourself. Ask questions.</p><p>In six months, you&apos;ll wonder why anyone still uses anything else.</p><p><strong>A note on platform switching:</strong>&#xA0;If you&apos;re experienced with one docs-as-code system and worried about learning another, don&apos;t be. I spent years in an internal ecosystem with Oxygen and custom build tools. Now I&apos;m relearning GitHub. The Git commands are identical. I&apos;m just learning different UI buttons and platform features. Your docs-as-code experience absolutely transfers. You&apos;re just learning a new interface on skills you already have.</p>]]></content:encoded></item><item><title><![CDATA[Git hygiene for technical writers]]></title><description><![CDATA[A former colleague reached out: "Any tips for someone starting a job that does docs as code?" Here's what I learned through trial, error, and years of working with teams at AWS.]]></description><link>https://blog.jillshaheen.com/git-hygiene/</link><guid isPermaLink="false">697d7ab6f2d2010e521ba5aa</guid><category><![CDATA[Git]]></category><category><![CDATA[Docs as Code]]></category><category><![CDATA[Technical Writing]]></category><dc:creator><![CDATA[Jill Shaheen]]></dc:creator><pubDate>Wed, 21 Jan 2026 01:28:00 GMT</pubDate><media:content url="https://blog.jillshaheen.com/content/images/2026/01/git-stream.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jillshaheen.com/content/images/2026/01/git-stream.png" alt="Git hygiene for technical writers"><p><strong>More in the docs-as-code series:</strong></p><ul><li><a href="https://blog.jillshaheen.com/git-gotchas/" rel="noreferrer">Docs-as-code gotchas for technical writers</a>&#xA0;&#x2014; Avoid the most common pitfalls when working in docs-as-code environments.</li><li><a href="https://blog.jillshaheen.com/git-transitioning-to-docs-as-code/" rel="noreferrer">What to expect when you&apos;re expecting docs-as-code</a>&#xA0;&#x2014; A field guide for writers new to Git-based workflows.</li></ul><hr><p>That first week in a Git-based documentation environment can feel overwhelming. Branches everywhere, merge conflicts appearing out of nowhere, and that nagging feeling that you&apos;re about to break something important.</p><p>Here&apos;s your Day 1 survival guide.</p><h3 id="start-with-a-cheat-sheet-keep-it-forever">Start with a cheat sheet, keep it forever</h3><p>The single best thing you can do is maintain a personal Git cheat sheet. Not a generic one from the internet, but <em>your</em> cheat sheet with the exact commands you use in your specific environment.</p><p>Keep it open constantly. Update it every time you discover a better way to do something. You&apos;ll reference it daily at first, then weekly, then occasionally, but you&apos;ll never stop finding it useful.</p><p>Here&apos;s a starter template:</p><pre><code class="language-bash"># DAILY SETUP
cd ~/projects/docs
git fetch --all --prune
git pull origin main

# STARTING NEW WORK
git checkout main
git pull origin main
git checkout -b js-descriptive-name

# WORKING ON FEATURE BRANCH
git add .
git commit -m &quot;[TICKET-123] Brief description of change&quot;
git push origin js-branch-name

# SYNCING YOUR BRANCH WITH LATEST MAIN
git checkout js-your-branch
git fetch origin main
git merge origin/main
# resolve any conflicts, then:
git add .
git commit -m &quot;Merge main into feature branch&quot;

# AFTER PR IS MERGED
git checkout main
git pull origin main
git branch -d js-merged-branch
git push origin --delete js-merged-branch

# OH SHIT COMMANDS
git reflog                        # Find lost commits
git stash                         # Quick-save changes
git stash pop                     # Restore stashed changes
git reset --hard origin/main      # Nuclear option - start over
git log --oneline --graph         # Visualize history</code></pre><h3 id="automate-your-morning-routine">Automate your morning routine</h3><p>Identify the commands you type every single morning and put them in a script.</p><p>Mine looked like this:</p><pre><code>cd ~/cloud-desktop
bash daily.sh</code></pre><p>That script handled authentication, workspace sync, and pulling changes from remote. Five minutes of setup work that saved me from forgetting critical steps every morning.&#xA0;<a href="#sample-startup-script" rel="noreferrer">You can find a sample script here</a>.</p><h3 id="the-five-rules-of-git-hygiene">The five rules of Git hygiene</h3><p>These practices came from years of collective experience across our teams at AWS. Some learned from writers who&apos;d been doing docs-as-code for decades, others from painful mistakes we made along the way. We documented them on our team wiki as onboarding material. New hires could read them before their first commit. We reinforced them in team meetings and 1-on-1s. Eventually, they became part of org-wide standardization.</p><p>They also prevent disasters.</p><h4 id="1-never-commit-directly-to-main">1. Never commit directly to main</h4><p>Always work on feature branches. Main should only receive changes through merged pull requests that have been reviewed.</p><p>This single rule prevents most catastrophic mistakes. If you find yourself in this pickle, here&apos;s how to get out.</p><pre><code class="language-bash">## I committed to main instead of my feature branch (NOT pushed yet)

git branch js-feature-name        # While on main, make a copy of main with your commits
git reset --hard origin/main      # Reset main to match remote
git checkout js-feature-name      # Switch to your backed up branch
git push origin js-feature-name   # Push your new branch to remote and continue working

## I committed to main AND pushed to origin (don&apos;t panic!)

1. Alert your team immediately in Slack/chat
2. Check if anyone has pulled: ask in chat before doing anything
3. If NO ONE has pulled yet, you can safely undo:
   git checkout main
   git reset --hard HEAD~1        # Remove your commit locally
   git push origin main --force   # Update remote (ONLY if no one pulled!)
   git checkout -b js-feature-name
   git cherry-pick &lt;commit-hash&gt;  # Bring your work to the feature branch
   
4. If someone HAS pulled, use revert instead:
   git checkout main
   git revert HEAD                # Creates new commit that undoes changes
   git push origin main
   git checkout -b js-feature-name
   git cherry-pick &lt;commit-hash&gt;  # Bring your original work to feature branch

# Use `git log` or `git reflog` to find the commit hash you want</code></pre><h4 id="2-pull-frequently-push-infrequently">2. Pull frequently, push infrequently</h4><p>Always be pulling from remote and merging into your feature branches. Do this at least weekly for idle branches. Do it throughout the day for active work.</p><p>The more often you pull and merge, the less likely you are to face massive conflicts.</p><p><strong>Why this matters:</strong>&#xA0;I once worked with a writer who let branches go stale for weeks. When merge conflicts appeared, they&apos;d panic and blindly accept their changes over everyone else&apos;s. They deleted entire pages of content written by other team members. We worked extensively to build better habits, but when the same data loss happened again months later, we had to part ways.</p><h4 id="3-resolve-conflicts-carefully">3. Resolve conflicts carefully</h4><p>When you see conflict markers in your file, stop and think:</p><pre><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD (your changes)
Configure IAM roles before enabling encryption.
=======
Enable encryption first, then configure IAM roles.
&gt;&gt;&gt;&gt;&gt;&gt;&gt; main (their changes)</code></pre><p>Don&apos;t just delete one side. Ask yourself:</p><ul><li>What was I trying to accomplish?</li><li>What were they trying to accomplish?</li><li>Which version is technically correct?</li><li>Do both changes need to coexist somehow?</li></ul><p>When in doubt, talk to the other writer before resolving the conflict. Five minutes of conversation prevents hours of recovery work.</p><p>After resolving conflicts manually in your editor:</p><pre><code>git add .
git commit -m &quot;Resolve merge conflict in security-setup.md&quot;</code></pre><h4 id="4-follow-the-pull-request-workflow">4. Follow the pull request workflow</h4><p>The typical docs-as-code workflow looks like this:</p><p><strong>Create your feature branch:</strong></p><pre><code>git checkout main
git pull origin main
git checkout -b js-new-feature</code></pre><p><strong>Do your work, commit frequently:</strong></p><pre><code>git add .
git commit -m &quot;[DOC-1234] Add security configuration guide&quot;
git push origin js-new-feature</code></pre><p><strong>Open a pull request.</strong>&#xA0;If you&apos;re working with PRs, write a clear description of what changed and why.</p><p><strong>Address review feedback:</strong></p><pre><code># Make requested changes
git add .
git commit -m &quot;Address review feedback - clarify IAM setup&quot;
git push origin js-new-feature

# PR automatically updates with new commits</code></pre><p><strong>After approval, merge.</strong>&#xA0;Most teams use &quot;Squash and merge&quot; or &quot;Create a merge commit&quot; depending on their preferences.</p><p><strong>Clean up immediately:</strong></p><pre><code>git checkout main
git pull origin main
git branch -d js-new-feature
git push origin --delete js-new-feature</code></pre><h4 id="5-write-searchable-commit-messages">5. Write searchable commit messages</h4><p>You will need to find that update that you made six months ago. Someone will ask &quot;why did you make this change?&quot;</p><p>Be specific. Use words you can see yourself searching for later. Include ticket numbers.</p><p><strong>Good commit messages:</strong></p><ul><li><code>[DOC-1234] Add troubleshooting guide for encryption errors</code></li><li><code>Fix broken links in security setup guide</code></li><li><code>Update IAM role examples to use new policy format per security team review</code></li></ul><p><strong>Bad commit messages:</strong></p><ul><li><code>changes for Joe</code></li><li><code>fix stuff</code></li><li><code>Ready for review</code></li></ul><p><strong>This is why I never adopted rebase.</strong>&#xA0;The argument for rebase is cleaner history (linear commits instead of merge noise). But I&#xA0;<em>like</em>&#xA0;that merge noise. I want to see the minutiae of commit history. Why take the time to write meaningful commit messages if you&apos;re going to squash them into some sanitized version of what actually happened?</p><h3 id="small-commits-clear-names-quick-cleanup">Small commits, clear names, quick cleanup</h3><p><strong>Commit often.</strong>&#xA0;Finished a section? Reorganized a list? Commit. Small commits keep messages concise and meaningful. They reduce merge conflict probability.</p><p><strong>Name branches well.</strong>&#xA0;Prefix with your initials. Use consistent conventions:</p><ul><li>Ticket numbers:&#xA0;<code>js-DOC1234</code></li><li>Plain language:&#xA0;<code>js-security-access-control</code></li><li>Hybrid:&#xA0;<code>js-DOC1234-security-access-control</code></li></ul><p><strong>Delete merged branches immediately.</strong>&#xA0;Stale branches clutter your workspace, trick you into thinking work is still in progress, and cause you to accidentally branch from the wrong starting point.</p><h3 id="it-becomes-muscle-memory">It becomes muscle memory</h3><p>Once you get into a rhythm that works, these habits become automatic. They prevented data loss on my teams. They kept commit history complete. They made collaboration smoother.</p><p>The perfect workflow is the one you&apos;ll actually follow consistently.</p><h3 id="the-learning-curve-is-real">The learning curve is real</h3><p>This probably feels like a lot on day one. Save it somewhere. Re-read it periodically. It will keep making more sense.</p><p>The transition from a traditional CMS to docs-as-code requires a mindset shift. You&apos;re not just a writer anymore. Now you&apos;re managing version control, handling merge conflicts, thinking about how your change history will read six months from now. Your decisions affect everyone working in the same repository.</p><p>But once these habits become muscle memory, you&apos;ll wonder how you ever worked any other way.</p><p>Just don&apos;t let your branches go stale.</p><hr><h3 id="sample-startup-script">Sample startup script</h3><p>Save this as&#xA0;<code>~/daily-git-setup.sh</code>&#xA0;and run it each morning:</p><pre><code>#!/bin/bash
# Daily Git setup script for technical writers

GREEN=&apos;\033[0;32m&apos;
YELLOW=&apos;\033[1;33m&apos;
NC=&apos;\033[0m&apos;

echo -e &quot;${GREEN}Starting daily Git setup...${NC}\n&quot;

# Navigate to your docs repository
cd ~/projects/docs || exit 1

echo -e &quot;${YELLOW}Fetching latest changes...${NC}&quot;
git fetch --all --prune

echo -e &quot;${YELLOW}Current branch:${NC}&quot;
git branch --show-current

echo -e &quot;${YELLOW}Cleaning up merged branches...${NC}&quot;
git branch --merged main | grep -v &quot;main&quot; | xargs -r git branch -d

echo -e &quot;${YELLOW}Your active branches:${NC}&quot;
git branch | grep &quot;js-&quot; || echo &quot;No active branches found&quot;

echo -e &quot;\n${GREEN}Setup complete!${NC}&quot;</code></pre><p>Make it executable:&#xA0;<code>chmod +x ~/daily-git-setup.sh</code></p><p>Customize the&#xA0;<code>cd</code>&#xA0;path and the&#xA0;<code>grep &quot;js-&quot;</code>&#xA0;to match your initials.</p><p>(Optional) Create an alias in your shell config:</p><p>Add this line to your&#xA0;<code>~/.bashrc</code>&#xA0;or&#xA0;<code>~/.zshrc</code>:</p><pre><code>alias gitdaily=&quot;~/daily-git-setup.sh&quot;</code></pre><p>Then you can just type:</p><pre><code>gitdaily</code></pre><hr><p><em>Have Git hygiene practices that saved you? I&apos;d love to hear them. These are the habits that worked for me and my teams, but every environment teaches you something new.</em></p>]]></content:encoded></item><item><title><![CDATA[I built a job search tracker for you]]></title><description><![CDATA[Managing job applications is hard. I built a job search dashboard to organize my search, track applications, and improve my strategy. And you can use it too.]]></description><link>https://blog.jillshaheen.com/dashboard-app/</link><guid isPermaLink="false">697d7ab6f2d2010e521ba5a9</guid><category><![CDATA[Job Search]]></category><category><![CDATA[Vibe Coding]]></category><category><![CDATA[AI-Generated Apps]]></category><dc:creator><![CDATA[Jill Shaheen]]></dc:creator><pubDate>Sat, 17 Jan 2026 01:09:00 GMT</pubDate><media:content url="https://blog.jillshaheen.com/content/images/2026/01/vibe-coding.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jillshaheen.com/content/images/2026/01/vibe-coding.png" alt="I built a job search tracker for you"><p>Spreadsheets fall apart when you&apos;re tracking a million applications across different stages, each with its own requirements and contacts. I needed something better, so I built it. I used AI, iterative refinement, and a focus on what job seekers like me actually need.</p><p><strong>&#x26A0;&#xFE0F; Important:</strong>&#xA0;This app stores everything locally in your browser. The&#xA0;<strong>Back Up</strong>&#xA0;button lights up as a reminder. Use it regularly; if you clear your cache or switch browsers, your data disappears.</p><p>Try it now!&#xA0;<a href="https://jburgh.github.io/job-search-dashboard/?ref=blog.jillshaheen.com" rel="noopener noreferrer">https://jburgh.github.io/job-search-dashboard</a></p><p><em>Jump to&#xA0;</em><a href="#what-it-does" rel="noreferrer"><em>What it does</em></a><em>&#xA0;and&#xA0;</em><a href="#how-to-use-it" rel="noreferrer"><em>How to use it</em></a><em>.</em></p><figure class="kg-card kg-image-card"><img src="https://blog.jillshaheen.com/content/images/2026/01/dashboard-ui.png" class="kg-image" alt="I built a job search tracker for you" loading="lazy" width="2000" height="1422" srcset="https://blog.jillshaheen.com/content/images/size/w600/2026/01/dashboard-ui.png 600w, https://blog.jillshaheen.com/content/images/size/w1000/2026/01/dashboard-ui.png 1000w, https://blog.jillshaheen.com/content/images/size/w1600/2026/01/dashboard-ui.png 1600w, https://blog.jillshaheen.com/content/images/2026/01/dashboard-ui.png 2000w" sizes="(min-width: 720px) 720px"></figure><h3 id="why-i-built-it">Why I built it</h3><p>I was tracking applications across Gmail confirmations, Google Drive file creation dates, and LinkedIn&apos;s &quot;Applied&quot; indicator. It was chaos.</p><p>I&apos;d get rejection emails for jobs I couldn&apos;t remember applying to. I&apos;d get callbacks and scramble through Google Drive trying to figure out which resume version I&apos;d sent. I&apos;d accidentally apply twice to the same role because I had no central record.</p><p>I needed something that could:</p><ul><li>Track every application in one place</li><li>Show me which roles were still on the radar, which roles I&apos;m actively engaged with, and which ones I can forget about</li><li>Give me one-click access to careers pages</li><li>Bubble up the companies that I should be checking every day</li><li>Capture links to the resume, cover letter, and job URL</li><li>Show me how far I was getting with the roles where I broke through</li><li>Back up my data so I didn&apos;t lose everything</li><li>Be easy to update on the fly</li></ul><h3 id="how-i-built-it">How I built it</h3><p>I&apos;m a technical writer, not a software developer. I can read code and write scripts, but building production web apps isn&apos;t my specialty. AI changed that equation.</p><figure class="kg-card kg-image-card"><img src="https://blog.jillshaheen.com/content/images/2026/02/dashboard-diagram.png" class="kg-image" alt="I built a job search tracker for you" loading="lazy" width="2000" height="1116" srcset="https://blog.jillshaheen.com/content/images/size/w600/2026/02/dashboard-diagram.png 600w, https://blog.jillshaheen.com/content/images/size/w1000/2026/02/dashboard-diagram.png 1000w, https://blog.jillshaheen.com/content/images/size/w1600/2026/02/dashboard-diagram.png 1600w, https://blog.jillshaheen.com/content/images/2026/02/dashboard-diagram.png 2000w" sizes="(min-width: 720px) 720px"></figure><h4 id="phase-1-rapid-prototyping-with-claude">Phase 1: Rapid prototyping with Claude</h4><p>I started with a simple request: &quot;Create a job tracking system with target companies, application tracking, and localStorage persistence.&quot; Claude generated a working React application with companies and jobs tables with filtering and basic stats. It worked, but it was rough around the edges.</p><h4 id="phase-2-iterative-refinement">Phase 2: Iterative refinement</h4><p>I refined the prompt to add features like one-click Careers page access, application status tracking, and backup/restore functionality. Each time, I fed Claude the existing code and asked for specific improvements.</p><p>Each iteration took minutes. Describe the problem or specific need, get a solution, test it, refine. This is AI-assisted development. You need domain expertise, but not necessarily implementation expertise.</p><p>At this point, I ran a Google Takeout export of my Drive and email correspondence. I asked Claude to parse the data for cover letters or confirmations/rejections and use the date metadata to generate an importable JSON file of my job application history.</p><p>I started using the dashboard app daily, and it was already making a difference in my job search. Hosted on my local machine, I could make tweaks in real time when a new idea struck me. (It&apos;s also when I prompted Claude to make it pretty.)</p><h4 id="phase-3-production-hardening-with-github-copilot">Phase 3: Production hardening with GitHub Copilot</h4><p>So... success! Right? Well not quite. All the iterations had made for a pretty messy codebase. I needed to clean up, optimize, and ensure the app was robust enough for regular use.</p><p>I moved the code to VS Code and used GitHub Copilot to transform the prototype into production-ready code through multi-stage refinement:</p><ul><li><strong>Code Quality Audit:</strong>&#xA0;&quot;Act as a senior engineer reviewing this code. Identify code smells, duplication, and areas that violate DRY principles. Suggest refactoring strategies.&quot;</li><li><strong>Security Hardening:</strong>&#xA0;&quot;Act as a security engineer. Review this code for XSS vulnerabilities, injection risks, and unsafe practices. Implement proper input sanitization and validation.&quot;</li><li><strong>Performance Optimization:</strong>&#xA0;&quot;Act as a performance engineer. Identify bottlenecks, inefficient algorithms, and unnecessary re-renders. Optimize for scalability and responsiveness.&quot;</li><li><strong>Production Deployment:</strong>&#xA0;&quot;Generate deployment scripts and configuration for hosting this as a static site on GitHub Pages. Include build optimization and error handling.&quot;</li></ul><p>This multi-stage approach of rapid prototyping with conversational AI, then hardening with code-focused AI, transformed my modest tracker into a robust application.</p><h3 id="what-it-does">What it does</h3><h4 id="company-inventory">Company inventory</h4><p>This view is most useful for remembering which companies you should be checking for new roles to drop. In V1, I pre-loaded some companies with direct links to their job search pages. You can hide these from view if they&apos;re not useful in your search.</p><p>Click a company name to visit their careers site. Click the application count to filter your jobs view to that company. Add new companies manually or let them auto-generate when you add jobs.</p><figure class="kg-card kg-image-card"><img src="https://jillshaheen.com/blog/images/companies.png" class="kg-image" alt="I built a job search tracker for you" loading="lazy" width="2372" height="838"></figure><p><strong>&#x1F4A1; Pro tip!</strong>&#xA0;When you&apos;ve applied your preferred filters to a Careers page search, copy that URL into the tracker so that future visits take you directly to the results you need.</p><h4 id="application-tracking-jobs">Application tracking (jobs)</h4><p>This is the heart of the app. Here you track each job application from submission to response.</p><p>Core workflow:</p><ol><li>Browse Companies &#x2192; Click careers link &#x2192; Find role</li><li>Add Job &#x2192; Fill in company, title, date, URL fields</li><li>Update Status and Progression as you move through the pipeline</li><li>Close with appropriate reason and the closing date when done</li></ol><figure class="kg-card kg-image-card"><img src="https://jillshaheen.com/blog/images/jobs.png" class="kg-image" alt="I built a job search tracker for you" loading="lazy" width="2360" height="744"></figure><p>Data structure for job statuses:</p><ul><li><strong>Applied:</strong>&#xA0;Submitted, waiting for response</li><li><strong>In Progress:</strong>&#xA0;Active conversation<ul><li><strong>Progression:</strong>&#xA0;Recruiter Screen &#x2192; Partial Loop &#x2192; Full Loop &#x2192; Offer</li></ul></li><li><strong>Closed:</strong>&#xA0;This role is no longer active or you&apos;ve eliminated it<ul><li><strong>Close Reason:</strong>&#xA0;Rejected, Ghosted, Withdrew, Declined Offer</li></ul></li></ul><p>With this structure, we get some useful analytics. Response rate measures jobs that moved beyond &quot;Applied.&quot; Pipeline health shows distribution across interview stages. Closure patterns reveal whether you&apos;re getting rejected, ghosted, or withdrawing.</p><h4 id="data-management">Data management</h4><p>This is a critical feature: One-click JSON export for backups. The backup button turns red as a reminder to use it regularly. Since all your data is hosted locally, you don&apos;t want to risk losing it all when you clear your cache or switch browsers.</p><p>If you do blast away your data, simply import your latest backup to restore. Keep in mind that the app is intended for desktop use and you won&apos;t be able to see your inputs on another device (like your phone) pointing to the same URL.</p><figure class="kg-card kg-image-card"><img src="https://jillshaheen.com/blog/images/import.png" class="kg-image" alt="I built a job search tracker for you" loading="lazy" width="2384" height="1444"></figure><h3 id="how-to-use-it">How to use it</h3><p>The dashboard is live and ready for you to use at&#xA0;<a href="https://jburgh.github.io/job-search-dashboard/?ref=blog.jillshaheen.com" rel="noopener noreferrer">https://jburgh.github.io/job-search-dashboard</a>.</p><p><strong>&#x26A0;&#xFE0F; Important:</strong>&#xA0;Data is stored in your browser&apos;s localStorage. It will disappear if you clear your cache. The Backup button at the top turns red every day or so as a reminder. Use it to export your data to an importable JSON file.</p><h4 id="companies-tab">Companies Tab</h4><p>I&apos;ve preloaded some companies for convenience. You can hide any with the Hide button, or add your own.</p><ul><li>Select a company name to navigate to its career page</li><li>Select the application count to filter your jobs view to that company</li><li>Select &quot;Add Company&quot; to enter new companies manually</li></ul><h4 id="jobs-tab">Jobs Tab</h4><p>Select &quot;Add Job&quot; to log each application. When you add a job, the tracker looks for the company name and automatically relates the job to the company in the tracker. If the company isn&apos;t tracked yet, the app will create it for you. You&apos;ll want to update the company URL later, because it defaults to the job URL that you enter with the application.</p><p>As you progress:</p><ul><li>Set status to &quot;In Progress&quot; when a company reaches out (even just a recruiter screen)</li><li>Update&#xA0;<strong>Progression</strong>&#xA0;as you move through interview stages</li><li>Set status to &quot;Closed&quot; and choose a&#xA0;<strong>Close Reason</strong>&#xA0;when you get a rejection, withdraw, or are eliminated</li><li>Set the&#xA0;<strong>Follow-up date</strong>&#xA0;to the date you got rejected or withdrew</li></ul><h4 id="best-practices">Best Practices</h4><ul><li>Add jobs immediately after applying (before you forget details)</li><li>Capture contact names when recruiters reach out</li><li>Write notes after each interaction</li><li>Set priority tiers honestly (don&apos;t mark everything Tier 1)</li><li>Back up daily - seriously, make this a habit</li><li>Review analytics weekly to adjust your strategy</li></ul><h3 id="why-im-sharing-it">Why I&apos;m sharing it</h3><p>Job searching is hard enough without fighting your tools. You shouldn&apos;t need a CS degree to track applications effectively. You shouldn&apos;t have to choose between spreadsheets that are too simple and enterprise systems that are too complex or expensive.</p><p>So I built this. And now it&apos;s yours. Use it, share it, modify it.</p><p>If this helps even one person organize their search better or land a role faster, it was worth building (especially if that person is me!).</p><p>And seriously, back up your data. You&apos;ll thank me later.</p><hr><p>Try the dashboard:&#xA0;<a href="https://jburgh.github.io/job-search-dashboard/?ref=blog.jillshaheen.com" rel="noopener noreferrer">https://jburgh.github.io/job-search-dashboard</a></p><p><em>Built by a job seeker, for job seekers, shared freely.</em></p><p>Questions or suggestions? Find me on&#xA0;<a href="https://www.linkedin.com/in/jillshaheen/?ref=blog.jillshaheen.com" rel="noopener noreferrer">LinkedIn</a>&#xA0;or check out my&#xA0;<a href="https://jillshaheen.com/?ref=blog.jillshaheen.com" rel="noopener noreferrer">portfolio</a>.</p>]]></content:encoded></item><item><title><![CDATA[Your portfolio is pigeonholing you]]></title><description><![CDATA[Your portfolio might be working against you. Learn how to frame projects around problems you've solved rather than deliverables you've shipped.]]></description><link>https://blog.jillshaheen.com/your-portfolio-is-pigeonholing-you/</link><guid isPermaLink="false">697d7ab6f2d2010e521ba5a8</guid><category><![CDATA[Job Search]]></category><category><![CDATA[Content Strategy]]></category><category><![CDATA[Career Development]]></category><category><![CDATA[Per the docs]]></category><dc:creator><![CDATA[Jill Shaheen]]></dc:creator><pubDate>Fri, 16 Jan 2026 01:04:00 GMT</pubDate><media:content url="https://blog.jillshaheen.com/content/images/2026/01/pigeonholing.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.jillshaheen.com/content/images/2026/01/pigeonholing.png" alt="Your portfolio is pigeonholing you"><p>If your portfolio only shows writing samples without the&#xA0;<strong>So what?</strong>, you&apos;re positioning yourself as&#xA0;<em>just a writer</em>. The work you do has bigger impact than that. Let&apos;s make sure your portfolio shows it.</p><ul><li>Do your project titles describe the problems you solved?</li><li>Can someone outside your role understand why each project matters?</li><li>Do you reflect on the impact, outcomes, and tradeoffs for each project?</li><li>Do the same strengths show up consistently throughout the portfolio?</li><li>Could a reader imagine how your experiences might apply to any role?</li></ul><p>More than one No? Your portfolio might be working against you.</p><h4 id="the-portfolio-paradox">The portfolio paradox</h4><p>I&apos;ve rebuilt my portfolio three times in the past five years. Each time, I thought I was being thorough and professional. Each time, I was accidentally narrowing how hiring managers saw me. Like mine, most portfolios are built with good intentions. They document our experience and prove we&apos;ve done the work. And that creates the problem.</p><p>By focusing so carefully on what we have done (our past roles, titles, and responsibilities), we guide readers toward a single, overly specific version of us.</p><h4 id="what-pigeonholing-looks-like-and-why-it-happens">What pigeonholing looks like (and why it happens)</h4><p>You&apos;ve spent years building your career. You&apos;re&#xA0;<em>really good</em>&#xA0;at what you do. That experience shows up in your portfolio: the roles you&apos;ve held, the products you&apos;ve worked on, the skills you&apos;ve honed over time. But that clarity is why pigeonholing happens.</p><figure class="kg-card kg-image-card"><img src="https://jillshaheen.com/blog/images/pigeonholing-looks-like.png" class="kg-image" alt="Your portfolio is pigeonholing you" loading="lazy" width="1536" height="904"></figure><p>When you list &quot;Senior Technical Writer,&quot; &quot;API Documentation,&quot; and &quot;Developer Guides,&quot; people see one thing: a technical writer. They can&apos;t imagine you leading a content strategy initiative, reducing support case volume, or improving product design and direction.</p><p>When you&apos;re competing for roles during a tight job market, every application needs to work harder. A portfolio that positions you for exactly one type of role is a liability that you can&apos;t afford.</p><h3 id="reframing-your-portfolio-around-problems-not-positions">Reframing your portfolio around problems, not positions</h3><p>Most portfolios default to chronological order or group by deliverable type. Both organize around you, not around problems you solve. This limits how others imagine you&apos;d apply those skills in a new context. Start with a simple shift in perspective. Instead of thinking, &quot;Here&apos;s the role or project,&quot; think, &quot;Here&apos;s the problem that I helped solve.&quot;</p><p>Choose to organize your projects by user problems, business outcomes, complexity, scale, or maturity stage. Use summary-style titles that translate across roles.</p>
<!--kg-card-begin: html-->
<table style="box-sizing: border-box; width: 760px; border-collapse: collapse; margin: 2rem 0px; color: rgb(241, 245, 249); font-family: Inter, system-ui, -apple-system, sans-serif; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(15, 23, 42); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: border-box;"><tr style="box-sizing: border-box;"><th style="box-sizing: border-box; text-align: left; padding: 0.75rem; color: rgb(148, 163, 184); font-weight: 600; font-size: 0.95rem; border-bottom: 2px solid rgb(51, 65, 85);">Instead of...</th><th style="box-sizing: border-box; text-align: left; padding: 0.75rem; color: rgb(148, 163, 184); font-weight: 600; font-size: 0.95rem; border-bottom: 2px solid rgb(51, 65, 85);">try this:</th></tr></thead><tbody style="box-sizing: border-box;"><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 1rem 0.75rem; border-bottom: 1px solid rgba(255, 255, 255, 0.04); color: rgb(203, 213, 225);">Getting Started Documentation</td><td style="box-sizing: border-box; padding: 1rem 0.75rem; border-bottom: 1px solid rgba(255, 255, 255, 0.04); color: rgb(203, 213, 225);">Reducing time-to-first-success for new users</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 1rem 0.75rem; border-bottom: 1px solid rgba(255, 255, 255, 0.04); color: rgb(203, 213, 225);">SDK Documentation</td><td style="box-sizing: border-box; padding: 1rem 0.75rem; border-bottom: 1px solid rgba(255, 255, 255, 0.04); color: rgb(203, 213, 225);">Enabling faster integration for third-party developers</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 1rem 0.75rem; border-bottom: 1px solid rgba(255, 255, 255, 0.04); color: rgb(203, 213, 225);">Docs Site Migration</td><td style="box-sizing: border-box; padding: 1rem 0.75rem; border-bottom: 1px solid rgba(255, 255, 255, 0.04); color: rgb(203, 213, 225);">Major platform migration: Maintaining continuity and trust</td></tr><tr style="box-sizing: border-box;"><td style="box-sizing: border-box; padding: 1rem 0.75rem; border-bottom: 1px solid rgba(255, 255, 255, 0.04); color: rgb(203, 213, 225);">Documentation Team Lead</td><td style="box-sizing: border-box; padding: 1rem 0.75rem; border-bottom: 1px solid rgba(255, 255, 255, 0.04); color: rgb(203, 213, 225);">Establishing sustainable practices as Team Lead</td></tr></tbody></table>
<!--kg-card-end: html-->
<p>This framing immediately broadens the story. You&apos;re describing the same work, but the value becomes clearer to a wider audience. Engineering leaders, product managers, and platform teams all recognize onboarding friction as a real problem. Now you&apos;ve offered context rather than a headline. Judgment, decision-making, and impact carry across roles far more easily than a project name or job title.</p><h3 id="making-your-portfolio-flexible-without-making-it-vague">Making your portfolio flexible without making it vague</h3><p>I know what you&apos;re thinking. If you stop anchoring your portfolio to a single role, you&apos;re going to seem scattered or unfocused.</p><p>Trust me... clarity comes from repetition. When the same strengths pop up across different projects, readers recognize patterns. They see how you approach complexity, advocate for users, and help teams scale. You can accomplish this without risking ambiguity:</p><ul><li>Add short summaries at the top of each project that explain why the work mattered.</li><li>Emphasize outcomes, constraints, and tradeoffs.</li><li>Use consistent language to describe your strengths across projects.</li></ul><p>This approach also improves usability. Readers can skim, search, and focus on the work that feels most relevant to them, rather than trying to infer your range based on titles alone.</p><h3 id="using-ai-to-reframe-your-work">Using AI to reframe your work</h3><p>AI tools can be genuinely useful when you are revisiting how you frame your experience. They are particularly good at generating alternative perspectives. You can ask them to rewrite a project description for different audiences, surface transferable skills you may be underemphasizing, or suggest adjacent roles that your experience could map to. Used this way, AI helps you explore options and spot patterns.</p><p>I used Claude to reframe my own portfolio. I asked it to rewrite each project description for three different audiences: content strategists, technical program managers, and executive-level product managers. The exercise revealed patterns I&apos;d been too close to see. But Claude couldn&apos;t tell me which framing was most authentic to my actual strengths. Only I could make that call.</p><p>The important part is authorship. AI can assist with exploration, but the final framing still depends on your judgment, priorities, and voice.</p><h3 id="portfolios-as-living-systems">Portfolios as living systems</h3><p>Portfolios reflect how you want to be understood at a particular point in time. As your goals evolve, your portfolio should evolve alongside them. When you revisit your portfolio and the way you frame your work, it signals that your career is moving forward.</p><p>I&apos;m rebuilding mine right now. Not because I don&apos;t know what I&apos;ve done. I know that cold. But because I understand that what I&apos;ve done isn&apos;t the same as what I can do next.</p><p>Ask someone outside your role what they think you do after skimming your site for two minutes. If the answer is, &quot;You write documentation,&quot; then you might be presenting all you do too narrowly. A few small adjustments can turn your portfolio into a tool that creates more options for your future.</p><hr><p>This post is part of&#xA0;<a href="https://brandihopkins.com/per-the-docs?ref=blog.jillshaheen.com"><strong>Per the docs</strong></a>, a monthly collaborative series where technical writers explore different aspects of our craft. Each month features a new topic with perspectives from writers across the community. Read more perspectives in the series:</p><p><strong>January 2026 topic: Portfolios</strong></p><ul><li><a href="https://brandihopkins.com/modern-technical-writing-portfolio?ref=blog.jillshaheen.com">Brandi Hopkins - Story and Structure: Building a modern technical writing portfolio</a></li><li><a href="https://swhite17.z13.web.core.windows.net/blogs.html?ref=blog.jillshaheen.com#portfolio-refresh">Shelby White - Portfolio refresh</a></li></ul><p><a href="https://brandihopkins.com/per-the-docs/2026-01-portfolios/?ref=blog.jillshaheen.com">View all participants in this month&apos;s hop &#x2192;</a></p>]]></content:encoded></item><item><title><![CDATA[About content, tools, and careers]]></title><description><![CDATA[Thinking about content as infrastructure, not output. How documentation tools keep evolving, and how careers in content adapt alongside them. Exploring sustainable content systems and the real-world impact of AI-powered tools.]]></description><link>https://blog.jillshaheen.com/content-tools-careers/</link><guid isPermaLink="false">697d7ab6f2d2010e521ba5a7</guid><category><![CDATA[Content Strategy]]></category><category><![CDATA[Documentation Tools]]></category><category><![CDATA[Career Development]]></category><dc:creator><![CDATA[Jill Shaheen]]></dc:creator><pubDate>Fri, 09 Jan 2026 01:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1504805572947-34fad45aed93?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGNhcmVlcnxlbnwwfHx8fDE3Njk4MjI1OTh8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1504805572947-34fad45aed93?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGNhcmVlcnxlbnwwfHx8fDE3Njk4MjI1OTh8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="About content, tools, and careers"><p>I&apos;ve spent most of my career thinking about content as infrastructure. Not as output, but as the thing that supports systems at scale. How people learn, how teams onboard, how products get understood, and how organizations move faster (or don&apos;t!).</p><p><strong>When content works, it&apos;s invisible. When it doesn&apos;t, everything feels harder than it should.</strong></p><p>This blog explores that idea, along with two related threads: documentation tools keep evolving, and how careers in content evolve alongside them.</p><p>Tools matter. I&apos;ve worked with generations of doc platforms, each promising to make content easier to create and maintain. AI-powered tools are changing that landscape again, raising questions about authorship, quality, ownership, and trust. I&apos;m less interested in hype than in how the tools actually fit into sustainable content systems.</p><p>Careers matter too. Content roles are rarely linear. The way we frame our work shapes the opportunities available to us. I&apos;m interested in how people grow in this space, how they avoid narrow definitions, how they position experience as tools shift, and how they build careers that adapt.</p><p>If you work in documentation, content strategy, developer experience, or any role where clarity supports scale, I hope something here is useful, or at least helps you see familiar problems from a different angle.</p><p>Thanks for reading, and... docs, or it didn&apos;t happen!</p>]]></content:encoded></item></channel></rss>