<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Project Management · Jared Lynskey</title>
    <link>https://jared.lynskey.co.nz/en/tags/project-management/</link>
    <description>Short stories of value on software engineering and engineering leadership — performance reviews, hiring and scaling teams, CI/CD, DevOps monitoring and agentic AI. Written from Seoul.</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© 2026 Jared Lynskey</copyright>
    <lastBuildDate>Wed, 28 Oct 2026 00:00:00 +1300</lastBuildDate>
    <atom:link href="https://jared.lynskey.co.nz/en/tags/project-management/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Using GitHub Issues for Decisions and Project Management: Alan&#39;s Method, With a Template</title>
      <link>https://jared.lynskey.co.nz/en/posts/2024/2024-01-04-githubforprojectmanagement/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2024/2024-01-04-githubforprojectmanagement/</guid>
      <pubDate>Tue, 09 Apr 2024 00:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>GitHub</category>
      <category>GitHub Issues</category>
      <category>Project Management</category>
      <category>Decision Making</category>
      <category>Async Communication</category>
      <category>Remote Work</category>
      <category>Team</category>
      <description>How Alan replaces most meetings with written GitHub issues: when a decision earns an issue, the LOCI roles, the writing rules, an issue template you can drop into .github/ISSUE_TEMPLATE, and when to add a GitHub Project on top.</description>
      <content:encoded><![CDATA[<p>I keep coming back to <a href="https://alan.com/en/healthybusiness/media/a/asynchronous-decisions"  target="_blank" rel="noreferrer">this article</a> from Alan, the French health insurance company, about how they make decisions. The short version: instead of booking a meeting, they open a GitHub issue and argue it out in writing. Now that I&rsquo;m managing a team myself, I&rsquo;ve been taking proper notes. What follows is my digest of their system, with my own comments mixed in.</p>

<h2 class="relative group">Why they gave up on meetings
    <div id="why-they-gave-up-on-meetings" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-they-gave-up-on-meetings" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Their starting point will sound familiar. Nobody comes prepared, the meeting starts late, and the loudest voice wins whether it&rsquo;s right or not. An hour later you&rsquo;re more confused than when you walked in and wondering if there&rsquo;s any paracetamol left in the drawer.</p>
<p>Alan tried fixing meetings first — 15 minutes max, clear agenda, decision required. It didn&rsquo;t hold. Discussions drifted, nobody could remember what was said, and absent or remote people were simply out of luck. So they moved the whole thing into writing.</p>
<p>The claims they make for it ring true to me. Writing forces you to slow down and actually think, so the discussion gets more nuanced and better argued. Everything is documented instead of half-remembered. It stops being an eloquence contest. And because the forum is open to the whole company, anyone can contribute — not just whoever happened to be in the room.</p>

<h2 class="relative group">GitHub as the company forum
    <div id="github-as-the-company-forum" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#github-as-the-company-forum" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>The forum itself is GitHub, a platform built for code review that Alan cheerfully hijacked. The setup is almost embarrassingly simple:</p>
<ol>
<li>Create a GitHub account.</li>
<li>Create a private repo with no code in it (theirs is called &ldquo;Topics&rdquo;).</li>
<li>Add a labelling system to categorise conversations.</li>
<li>Use the Issues tab: open issues are live discussions, closed ones are decisions made.</li>
</ol>
<p>They&rsquo;ve passed 17,000 issues. That&rsquo;s a lot of meetings that never had to happen, and — the part I find most appealing — a searchable history of why every decision went the way it did. If you want to challenge an old decision, you can first read which arguments won last time.</p>

<h2 class="relative group">When to open an issue
    <div id="when-to-open-an-issue" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#when-to-open-an-issue" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Not every decision earns an issue. Their filter is four questions: who will be affected? how reversible is it? how urgent is it? do I need more context before deciding?</p>
<p><figure><span class="mc-img"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="image"
    width="1390"
    height="1213"
    src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/decisionchart_hu_9ca1837f8ecdf619.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/decisionchart_hu_9ca1837f8ecdf619.webp 800w, https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/decisionchart_hu_8ecbad24825e93ec.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/decisionchart_hu_c84e7ceb7d35c8e2.webp"></span></figure>
</p>
<p>Broadly, high-impact and hard-to-reverse decisions go to the forum; the rest can stay in Slack. They lean on the one-way vs two-way door distinction: a one-way decision (too expensive or painful to reverse — their example is a price increase) gets the full written treatment, while a two-way decision (cheap to undo, worst case you lose some energy) doesn&rsquo;t need the ceremony.</p>

<h2 class="relative group">LOCI: who does what
    <div id="loci-who-does-what" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#loci-who-does-what" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Every discussion assigns roles using the LOCI model — Lead, Owner, Consulted, Informed.</p>
<p>The Lead is accountable for the decision&rsquo;s success and makes sure the context is understood across the team. They say upfront how involved they want to be, then trust the Owner and take responsibility for what the team produces, speaking up only when they strongly disagree. One Lead per discussion.</p>
<p>The Owner makes the final call and drives the project. They keep contributors informed and contributing on time, investigate the problem, open and close the issue, and share the decision. If they hit a wall they can&rsquo;t get past, they go to the Lead. One Owner per decision.</p>
<p>Consulted people are the ones whose input genuinely matters to the trade-off. They&rsquo;re expected to contribute promptly — even if only to say &ldquo;nothing to add&rdquo; — and to raise the alarm (escalating to the Lead if needed) when they think the decision is badly wrong. Alan caps this group at about six, because more input starts costing schedule.</p>
<p>Informed people simply get told, usually once the decision is made. One-way communication, nothing expected back. The Owner decides who&rsquo;s affected enough to be notified.</p>

<h2 class="relative group">The anatomy of an issue
    <div id="the-anatomy-of-an-issue" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-anatomy-of-an-issue" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Every issue uses the same template, which both sharpens the thinking and quietly teaches junior people how to break a problem down:</p>
<ul>
<li>Scope — the &ldquo;why&rdquo; of the discussion, including the underrated line &ldquo;this issue is NOT about…&rdquo;</li>
<li>Context &amp; materials — links to prior discussions and documents</li>
<li>LOCI — who&rsquo;s Lead, Owner, Consulted, Informed</li>
<li>A deadline — when to contribute by, when the issue closes, when a solution is needed</li>
<li>A solution proposal — one suggested answer, or options to choose between</li>
<li>Questions — aimed at specific people to confirm or refute specific assumptions, so the issue isn&rsquo;t a message in a bottle</li>
</ul>
<p><figure><span class="mc-img"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="image"
    width="1390"
    height="715"
    src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/gitpreview_hu_154de40eb6124f02.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/gitpreview_hu_154de40eb6124f02.webp 800w, https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/gitpreview_hu_ab103b11817c0ef0.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/gitpreview_hu_aada79d3a582942a.webp"></span></figure>
</p>

<h2 class="relative group">Writing rules that keep things moving
    <div id="writing-rules-that-keep-things-moving" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#writing-rules-that-keep-things-moving" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>A written debate can drag just as badly as a spoken one, so they have rules. Be concise — they quote Boileau: &ldquo;What is well conceived is clearly stated.&rdquo; If you can&rsquo;t write it simply, you&rsquo;re not actually sure of it yet. Apply the &ldquo;So what?&rdquo; test to everything you write; if the implication of your comment isn&rsquo;t obvious, spell it out.</p>
<p>For the Owner, the follow-up matters as much as the opening. Keep the discussion pointed at the million-dollar question — the one sticking point that actually matters — rather than letting it dissolve into details. Recap regularly what&rsquo;s been agreed and what&rsquo;s still open. And treat Slack reminders as a last resort, reserved for overdue contributions or genuine urgency.</p>
<p><figure><span class="mc-img"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="image"
    width="1390"
    height="910"
    src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/slackmessage_hu_b208cd2844b5ba3a.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/slackmessage_hu_b208cd2844b5ba3a.webp 800w, https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/slackmessage_hu_f44bfed068b95993.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/2024/2024-01-04-githubforprojectmanagement/slackmessage_hu_3f37871d11c679c.webp"></span></figure>
</p>
<p>Owners also hide comments that don&rsquo;t move the conversation forward, and everyone is expected to know their way around GitHub&rsquo;s formatting — headings, footnotes, tables, keyboard shortcuts — because in writing, form carries almost as much as substance.</p>

<h2 class="relative group">No consensus, no spectators
    <div id="no-consensus-no-spectators" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#no-consensus-no-spectators" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>Two rules stop this from turning into decision-by-committee.</p>
<p>First, the Owner decides as what Alan calls an &ldquo;enlightened despot&rdquo;. They investigate ideas, measure risks, question peers — but they don&rsquo;t seek consensus and they don&rsquo;t have to implement everything they&rsquo;re told. Alan is blunt about not being a democracy: every employee is a shareholder, and the company&rsquo;s interest comes before the team&rsquo;s or the individual&rsquo;s. When the Owner is reasonably sure of the right bet, they decide, everyone tries it, and once the impact is visible they review whether it was the right call.</p>
<p>Second, contributor numbers are controlled. Jeff Bezos&rsquo; two-pizza rule applies to async work too: the more people on an issue, the less each one contributes. Past about six contributors, the spectator effect kicks in and participation quality drops. Notifications follow the same philosophy — Alan trusts everyone to have configured their own GitHub notifications (Settings, then tick &ldquo;Web and Mobile&rdquo; under both &ldquo;Participating&rdquo; and &ldquo;Watching&rdquo;), so direct tags in the Questions section are kept to a minimum.</p>

<h2 class="relative group">What I&rsquo;m taking from it
    <div id="what-im-taking-from-it" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-im-taking-from-it" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>You can never fully explain a meeting to someone who wasn&rsquo;t there, but anyone can read a decision. Alan doesn&rsquo;t claim this is the best or only system — just the one that fits them: fewer interruptions, less spectator effect, and decisions made with a step back and the facts written down. I&rsquo;m not about to move every decision my team makes into GitHub issues, but the template below is going straight into our repo.</p>

<h3 class="relative group">The template, as a GitHub issue template
    <div id="the-template-as-a-github-issue-template" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-template-as-a-github-issue-template" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>Save this as <code>.github/ISSUE_TEMPLATE/decision.md</code> in whichever repository you use as the forum, and GitHub offers it every time someone opens a new issue. The sections are Alan&rsquo;s; the LOCI lines and the label are my additions.</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Decision</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">about</span><span class="p">:</span><span class="w"> </span><span class="l">Propose a decision and collect input in writing</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;[Decision] &#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">labels</span><span class="p">:</span><span class="w"> </span><span class="l">decision</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Scope
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> The goal of this issue is ...
</span></span><span class="line"><span class="cl"><span class="k">-</span> This issue is NOT about ...
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Why I&#39;m opening this issue
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## LOCI
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> Lead:
</span></span><span class="line"><span class="cl"><span class="k">-</span> Owner:
</span></span><span class="line"><span class="cl"><span class="k">-</span> Consulted:
</span></span><span class="line"><span class="cl"><span class="k">-</span> Informed:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Timeline
</span></span></span><span class="line"><span class="cl"><span class="k">-</span> Contributions by:
</span></span><span class="line"><span class="cl"><span class="k">-</span> Decision by:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Context and materials
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">## Proposal
</span></span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">## Questions</span></span></code></pre></div></div>

<h2 class="relative group">GitHub Issues or GitHub Projects?
    <div id="github-issues-or-github-projects" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#github-issues-or-github-projects" aria-label="Anchor">#</a>
    </span>
    
</h2>
<p>If you&rsquo;re thinking about GitHub for project management more broadly, the two pieces do different jobs. Issues hold the discussion and, once closed, the decision. A GitHub Project is a board or table laid over issues from one or more repositories, with your own fields for status, owner or deadline. For a decision forum like Alan&rsquo;s, labels and the issue list are enough. Add a Project when you want every open decision on one screen, sorted by the date it has to be made, and when you start tracking delivery work in the same place, which is where most teams end up using both.</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2024/2024-01-04-githubforprojectmanagement/featured.jpg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>Git Graph in the Terminal and VS Code: Track Progress Without Micromanaging</title>
      <link>https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-progress-git-graph/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-progress-git-graph/</guid>
      <pubDate>Fri, 02 Jun 2023 11:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Git</category>
      <category>Git Graph</category>
      <category>VS Code</category>
      <category>Project Management</category>
      <category>Engineering Manager</category>
      <description>How to see a git graph: the git log --graph command and an alias for it, comparing two branches, and the graph views in VS Code. Then how I use it to follow progress without micromanaging.</description>
      <content:encoded><![CDATA[<p>The quickest way to see a git graph is in the terminal: <code>git log --graph --oneline --all --decorate</code> draws every branch as lines of text, one commit per line, with branch and tag names next to the commits they point at. In VS Code you can use the Source Control Graph that&rsquo;s built into the Source Control view, or install the Git Graph extension for a bigger, clickable version. Both are covered in more detail at the end of this post.</p>
<p>Nobody enjoys being asked &ldquo;how&rsquo;s it going?&rdquo; — and as the one leading a project at work, I still need to know how it&rsquo;s going. My compromise is the git graph: I look at it before I ask anyone anything, and most of the time it already has the answer. It shows commit activity, branching and merging at a glance, and nobody has to sit in a meeting for it.</p>

<h3 class="relative group">What the graph actually tells you
    <div id="what-the-graph-actually-tells-you" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-the-graph-actually-tells-you" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p><figure><span class="mc-img" style="--lqip:url('data:image/webp;base64,UklGRqoAAABXRUJQVlA4IJ4AAAAQBgCdASogABgAPw1yrE0mIyIhKAqoxiGJ5QC3uywCxQFpuHEPXSkTd6B0z2RWZa4T7Y8RfsruOsAA/vd8+2CpyheBOdEz3RjVNYlC9RtFoqjOvb/UUWB572vAmnOtzv/AnG5mtp9GYAzXQce5Jk69dXACVLuYiXixGTwngnNtwm/gJSEGWEDi7N2CT1vDSW68w98W/Qmb3QPw7xAAAA==')"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="Git Graphs"
    width="2560"
    height="1920"
    src="https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_4be8d7d2144dd617.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_4be8d7d2144dd617.webp 800w, https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_b6056380eece4a86.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/gitgraphs/image_hu_1c52b3c34db54258.webp"></span></figure>
</p>
<p>If you haven&rsquo;t looked at one closely: every node is a commit, every divergent path is a branch, and the whole thing reads as a timeline of the project. That layout carries a surprising amount of information:</p>
<ul>
<li>A glance shows how many branches are active and how often commits are landing.</li>
<li>A branch that suddenly goes quiet, or one that hasn&rsquo;t merged for weeks, usually means someone is stuck. That&rsquo;s an early warning worth having.</li>
<li>Merge frequency tells you how the team collaborates. Frequent merges mean work is actually being integrated; long-lived branches usually mean someone has drifted off into siloed work.</li>
</ul>

<h3 class="relative group">Fewer interruptions, better conversations
    <div id="fewer-interruptions-better-conversations" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#fewer-interruptions-better-conversations" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>The obvious win is that I don&rsquo;t have to interrupt anyone to know where things stand. The bigger win is what happens when a conversation <em>is</em> needed: it starts from the graph rather than from assumptions. &ldquo;This branch hasn&rsquo;t moved since Tuesday — anything blocking you?&rdquo; is a much better opener than &ldquo;any updates?&rdquo;</p>
<p>It also helps to make the routine explicit. Mine is a quick glance most mornings and a proper look once a week. The team knows that&rsquo;s the rhythm, so nobody gets surprised.</p>

<h3 class="relative group">Don&rsquo;t turn it into surveillance
    <div id="dont-turn-it-into-surveillance" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#dont-turn-it-into-surveillance" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>This is the part I have to keep reminding myself of. Commit count is not value — one thoughtful commit can beat fifty noisy ones. Seeing every commit doesn&rsquo;t entitle you to question every decision; trust the team and step in only when a pattern genuinely looks like trouble. And when you do bring the graph into a conversation, it&rsquo;s a starting point for feedback, not evidence for a prosecution.</p>

<h3 class="relative group">Viewing the graph in the terminal
    <div id="viewing-the-graph-in-the-terminal" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#viewing-the-graph-in-the-terminal" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>Nothing to install, just Git:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git log --graph --oneline --all --decorate</span></span></code></pre></div></div>
<p>What each flag does:</p>
<ul>
<li><code>--graph</code> draws the branch and merge lines down the left-hand side.</li>
<li><code>--oneline</code> puts each commit on one line: its short hash and the first line of its message.</li>
<li><code>--all</code> shows every branch and tag, remote ones included, instead of only the branch you&rsquo;re on.</li>
<li><code>--decorate</code> prints branch and tag names next to the commits they point at. Recent versions of Git already do this when the output goes to a terminal, but the flag keeps them when you pipe the output somewhere else.</li>
</ul>
<p>Nobody wants to type that every morning, so make it an alias:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git config --global alias.graph <span class="s2">&#34;log --graph --oneline --all --decorate&#34;</span>
</span></span><span class="line"><span class="cl">git graph</span></span></code></pre></div></div>
<p>On a long-lived repo the full graph scrolls forever. A few ways to cut it down:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git graph --since<span class="o">=</span><span class="s2">&#34;2 weeks ago&#34;</span>    <span class="c1"># only the last two weeks</span>
</span></span><span class="line"><span class="cl">git graph -20                      <span class="c1"># only the last 20 commits</span>
</span></span><span class="line"><span class="cl">git log --graph --oneline main..feature                <span class="c1"># on feature, not yet in main</span>
</span></span><span class="line"><span class="cl">git log --graph --oneline --left-right main...feature  <span class="c1"># both sides, marked &lt; and &gt;</span></span></span></code></pre></div></div>
<p>The last two compare two branches, and they use plain <code>git log</code> rather than the alias because <code>--all</code> would pull every other branch back in. Two dots shows what <code>feature</code> has that <code>main</code> doesn&rsquo;t. Three dots with <code>--left-right</code> shows what each side has that the other doesn&rsquo;t, which is a quick way to see how far a long-lived branch has drifted.</p>

<h3 class="relative group">Viewing the graph in VS Code
    <div id="viewing-the-graph-in-vs-code" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#viewing-the-graph-in-vs-code" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>VS Code has a graph built in. Open the Source Control view (Ctrl+Shift+G) and the Source Control Graph is one of the sections in that panel; it has been there since version 1.93 (August 2024). By default it follows the current branch and its remote, and the branch picker in the graph&rsquo;s title bar adds others. For a quick look, that&rsquo;s all you need.</p>
<p>For every branch at once, install the Git Graph extension by mhutchie (search for &ldquo;Git Graph&rdquo; in the Extensions view). Open it from the Git Graph item in the status bar, the Git Graph icon at the top of the Source Control view, or the Command Palette with <em>Git Graph: View Git Graph (git log)</em>. Click a commit to see the files it changed, or click one commit and Ctrl/Cmd-click another to compare the two. It hasn&rsquo;t had a release since 2021, which is one more reason the built-in graph is worth knowing about.</p>
<p>If the Git Graph button doesn&rsquo;t appear, the extension probably hasn&rsquo;t found a repository. By default it only checks the folders you opened, not their subfolders, so open the repository&rsquo;s own folder or raise <code>git-graph.maxDepthOfRepoSearch</code> in the settings.</p>

<h3 class="relative group">Other tools
    <div id="other-tools" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#other-tools" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>Most Git tools draw a graph somewhere. <code>gitk --all</code> is Git&rsquo;s own history browser. GitHub, GitLab and Bitbucket each have a &ldquo;network&rdquo; or &ldquo;graph&rdquo; view on the repository page. And the desktop clients, SourceTree (free, from Atlassian), GitKraken, Tower and TortoiseGit on Windows, all have one too.</p>
<p>Whichever you pick, the goal is the same: understand the progress, don&rsquo;t count the commits.</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-progress-git-graph/featured.jpeg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>Project Communication Plan: A Template and Example for Software Teams</title>
      <link>https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-frameworks-for-future-cto/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-frameworks-for-future-cto/</guid>
      <pubDate>Fri, 02 Jun 2023 11:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Project Management</category>
      <category>Communication Plan</category>
      <category>Communication</category>
      <category>Stakeholder Management</category>
      <category>Engineering Management</category>
      <category>Remote Work</category>
      <description>A project communication plan says who needs to know what, how often, through which channel, and who tells them. What goes in one, an example plan for a software project you can copy, and the habits that keep it working.</description>
      <content:encoded><![CDATA[<p>A project communication plan is a short table that says who needs to know what about a project, how often, through which channel, and who is responsible for telling them. Mine fits on one page, with one row per audience, from the dev team up to the CEO. Below is the one I&rsquo;d start a software project with, and the notes I&rsquo;ve been keeping on what makes project communication actually work.</p>
<p>Most of the project messes I&rsquo;ve been pulled into weren&rsquo;t caused by bad code. They were caused by the right information not reaching the right person until it was too late. Since stepping up as project lead at work, I&rsquo;ve been keeping notes on how I&rsquo;d want to run communication if I ever end up in the CTO seat. Here they are.</p>

<h4 class="relative group">Decide who needs to know what
    <div id="decide-who-needs-to-know-what" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#decide-who-needs-to-know-what" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>The unglamorous foundation is a communication plan: who needs to be informed, what they need, how often, and through which channel. I&rsquo;d push for one at the start of every project, with names attached — communication that&rsquo;s everyone&rsquo;s job ends up being no one&rsquo;s job. The same goes for stakeholders: work out who actually cares about the project, learn how each of them prefers to be updated, and don&rsquo;t send the CEO the same update you post in the dev channel. Finally, set a few explicit protocols — expected response times, what counts as urgent, which channel is for what. Most &ldquo;communication problems&rdquo; are really just unstated expectations.</p>

<h4 class="relative group">An example communication plan for a software project
    <div id="an-example-communication-plan-for-a-software-project" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#an-example-communication-plan-for-a-software-project" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>This is the plan I&rsquo;d start with and then adjust. Each row is an audience, not a meeting:</p>
<table>
	<thead>
			<tr>
					<th>Audience</th>
					<th>What they need to know</th>
					<th>How often</th>
					<th>Channel</th>
					<th>Who tells them</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Dev team</td>
					<td>What&rsquo;s in progress, what&rsquo;s blocked, decisions that change the code</td>
					<td>Daily</td>
					<td>Stand-up and the team&rsquo;s chat channel</td>
					<td>Tech lead</td>
			</tr>
			<tr>
					<td>Product owner</td>
					<td>Progress against the sprint goal, scope questions, new risks</td>
					<td>Twice a week, and whenever scope changes</td>
					<td>Short call or a chat thread</td>
					<td>Project lead</td>
			</tr>
			<tr>
					<td>Leadership</td>
					<td>One-line status, risks to the date or budget, decisions they need to make</td>
					<td>Weekly</td>
					<td>A written update of one paragraph</td>
					<td>Project lead</td>
			</tr>
			<tr>
					<td>Sales, support and ops</td>
					<td>What&rsquo;s shipping, when, and what changes for customers</td>
					<td>Every release</td>
					<td>Release notes</td>
					<td>Product owner</td>
			</tr>
			<tr>
					<td>Users or clients</td>
					<td>What&rsquo;s new and what&rsquo;s coming</td>
					<td>Every release</td>
					<td>Changelog or an in-app notice</td>
					<td>Product owner</td>
			</tr>
			<tr>
					<td>Everyone</td>
					<td>What was decided, and why</td>
					<td>When it&rsquo;s decided</td>
					<td>A decision log in the issue tracker or wiki</td>
					<td>Whoever made the decision</td>
			</tr>
	</tbody>
</table>
<p>Underneath the table go the protocols, written as plainly as possible: urgent means it blocks a release or a customer, so call rather than message; questions go in chat, decisions go in the tracker; replies within a working day. For the decision log I use <a href="https://jared.lynskey.co.nz/en/posts/2024/2024-12-03-decision-docs/" >decision documents</a>, kept as <a href="https://jared.lynskey.co.nz/en/posts/2024/2024-01-04-githubforprojectmanagement/" >GitHub Issues</a> so they sit next to the work.</p>
<p>Two things make a plan like this work. Every row has a name in the last column, and the leadership update is written rather than spoken, so it can be forwarded without losing anything.</p>

<h4 class="relative group">Tools and rhythms
    <div id="tools-and-rhythms" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#tools-and-rhythms" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>Tools matter less than people argue about them. Slack for chat, Trello for tasks, Zoom when a conversation needs faces — pick what fits the team and move on. Rhythm matters more: daily stand-ups if you&rsquo;re working agile, weekly updates on longer cycles, and actually holding to them. And write things down. Decisions, changes, action items — into Notion or Jira, as part of the process rather than an afterthought. Six months later, the doc is the only memory anyone has.</p>

<h4 class="relative group">The soft parts are the hard parts
    <div id="the-soft-parts-are-the-hard-parts" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-soft-parts-are-the-hard-parts" aria-label="Anchor">#</a>
    </span>
    
</h4>
<p>Everything above is mechanics. The harder work is asking the team whether the communication is actually working, and changing it when it isn&rsquo;t. It&rsquo;s training people up, too — teams come from varied backgrounds, and not everyone has seen a well-run project before. It&rsquo;s listening properly instead of waiting for your turn to talk, and dealing with conflict early, while it&rsquo;s still small. None of it stays solved, either: what worked last quarter quietly stops working, so keep checking.</p>

<h3 class="relative group">Working as a distributed/asynchronous development team
    <div id="working-as-a-distributedasynchronous-development-team" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#working-as-a-distributedasynchronous-development-team" aria-label="Anchor">#</a>
    </span>
    
</h3>
<p>This talk is worth your time if your team is remote or async-heavy:
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
			<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5lVijFaXaKs?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
		</div>
</p>
<p>I don&rsquo;t do all of this perfectly — nobody does. But every project that went smoothly for me had most of these in place, and every one that hurt was missing at least three.</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2023/2023-06-02-project-frameworks-for-future-cto/featured.jpeg" medium="image" type="image/jpeg" />
    </item>
  </channel>
</rss>
