<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luke Jones</title>
    <description>The latest articles on DEV Community by Luke Jones (@luke_jones_a844cfe3e576ea).</description>
    <link>https://dev.to/luke_jones_a844cfe3e576ea</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4105490%2Fc0eb9da5-1cc9-402e-9d2f-c5b854843a58.png</url>
      <title>DEV Community: Luke Jones</title>
      <link>https://dev.to/luke_jones_a844cfe3e576ea</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luke_jones_a844cfe3e576ea"/>
    <language>en</language>
    <item>
      <title>Your backlog is a photograph. Time-lapse is the film.</title>
      <dc:creator>Luke Jones</dc:creator>
      <pubDate>Mon, 05 Oct 2026 13:20:34 +0000</pubDate>
      <link>https://dev.to/luke_jones_a844cfe3e576ea/your-backlog-is-a-photograph-time-lapse-is-the-film-l27</link>
      <guid>https://dev.to/luke_jones_a844cfe3e576ea/your-backlog-is-a-photograph-time-lapse-is-the-film-l27</guid>
      <description>&lt;p&gt;A Jira backlog shows you one thing: where everything stands &lt;em&gt;right now&lt;/em&gt;. What it can't show you is how it got there — which areas caught fire this quarter, where work piled up and sat, which corner quietly went green while you weren't looking.&lt;/p&gt;

&lt;p&gt;Teppe already turns a sprawling backlog into a single picture you can take in at a glance. &lt;strong&gt;Time-lapse&lt;/strong&gt; adds the missing dimension: time. Press play, and that picture comes to life — every issue moving through To&amp;nbsp;Do → In&amp;nbsp;Progress → Done, exactly as it really happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch a year of work in a few seconds
&lt;/h2&gt;

&lt;p&gt;Here's the full Apache Spark project — roughly 5,000 issues — replayed across a year of real history:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgr5guxwhdpccjvo3bvm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgr5guxwhdpccjvo3bvm.gif" alt="Apache Spark - 1 year" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The whole project, one year, played back from Jira's own status history.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each tile is a piece of work; each block of tiles is an area. The colour is the issue's status category, so the whole carpet breathes as the project moves: grey work turns blue as it's picked up, blue turns green as it ships. Watch it once and you can &lt;em&gt;see&lt;/em&gt; the rhythm of the project — the steady areas, the late-quarter surges, the parts that stalled.&lt;/p&gt;

&lt;p&gt;Nothing here is simulated. Time-lapse is reconstructed from the real status-change history already recorded against your issues — the same timeline you'd piece together by hand from each issue's activity log, except across the entire backlog at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drill into a single area of work
&lt;/h2&gt;

&lt;p&gt;The whole project is the headline, but the story usually lives in one corner of it. Time-lapse is scoped to whatever node you're looking at — so you can drill into one area and replay just that.&lt;/p&gt;

&lt;p&gt;Here's the &lt;strong&gt;Connect&lt;/strong&gt; area of Spark on its own:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvs429d6jfq170btdalzi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvs429d6jfq170btdalzi.gif" alt="Apache Spark - Connect - 1 year 2x" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;One area of work, same window — the detail you'd lose in the project-wide view.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the view for a retro or a team update: "here's how Connect actually went this quarter," shown rather than asserted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick the window that tells your story
&lt;/h2&gt;

&lt;p&gt;When you open Time-lapse, you choose the window first — before anything is built — so you never have to guess and re-run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;By sprint&lt;/strong&gt; — pick one sprint or a run of them, and the playback spans exactly that work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;By date&lt;/strong&gt; — any start and end date, for teams that don't run sprints or want a custom range.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then it's a simple transport: &lt;strong&gt;play / pause&lt;/strong&gt;, a &lt;strong&gt;scrubber&lt;/strong&gt; to jump to any moment, and a &lt;strong&gt;speed&lt;/strong&gt; control to slow down a busy stretch or skim a quiet one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Share it, don't describe it
&lt;/h2&gt;

&lt;p&gt;A time-lapse is worth more in a standup than in your own head. Every playback can be &lt;strong&gt;exported&lt;/strong&gt; — as an &lt;strong&gt;animated SVG&lt;/strong&gt; that stays crisp at any size and drops straight into a doc or a stakeholder update, or as a &lt;strong&gt;GIF&lt;/strong&gt; to paste into Slack or a retro board. The colours are baked in at export, so it looks right in light or dark, wherever it lands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest by design
&lt;/h2&gt;

&lt;p&gt;Time-lapse keeps the same promises the rest of Teppe makes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It never touches Jira.&lt;/strong&gt; Teppe reads your project; it never creates, edits, or moves a single issue. Time-lapse is a replay of history, not a change to it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your data never leaves Atlassian.&lt;/strong&gt; Teppe runs entirely on the Atlassian platform — no external services, no data egress. The history is read, rendered, and animated in place.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It respects reduced motion.&lt;/strong&gt; If your system asks for reduced motion, playback starts paused and every frame is legible on its own, so you're never forced into animation you didn't ask for.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Open any project in &lt;a href="https://jira.teppe.io/" rel="noopener noreferrer"&gt;Teppe for Jira&lt;/a&gt;, click &lt;strong&gt;Time-lapse&lt;/strong&gt;, pick a sprint or a date range, and press play. Start with the whole project, then drill into the one area you actually want to talk about — and export the clip that makes the point for you.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>software</category>
    </item>
    <item>
      <title>How Teppe for Jira works under the hood</title>
      <dc:creator>Luke Jones</dc:creator>
      <pubDate>Wed, 23 Sep 2026 15:16:56 +0000</pubDate>
      <link>https://dev.to/luke_jones_a844cfe3e576ea/how-teppe-for-jira-works-under-the-hood-4pmf</link>
      <guid>https://dev.to/luke_jones_a844cfe3e576ea/how-teppe-for-jira-works-under-the-hood-4pmf</guid>
      <description>&lt;p&gt;A few weeks ago I promised a technical write-up. Here it is.&lt;/p&gt;

&lt;p&gt;The two questions I get most are: &lt;em&gt;how do you render tens of thousands of Jira issues in under 10ms?&lt;/em&gt; And &lt;em&gt;how does the AI figure out how to group things?&lt;/em&gt; They're related, and the answer to both starts with the same principle — do less.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rendering problem
&lt;/h2&gt;

&lt;p&gt;Jira backlogs are large. A mature project might have 50,000 issues. Naively rendering 50,000 nodes in a browser canvas is slow, and no amount of JavaScript optimisation is going to change that.&lt;/p&gt;

&lt;p&gt;The insight is that you never need to render all of them.&lt;/p&gt;

&lt;p&gt;The Sierpiński carpet is a fractal — it's recursive by definition. At any given moment you're looking at one level of the hierarchy, with the levels above and below rendered at progressively lower fidelity. We cap this at &lt;code&gt;MAX_DEPTH + 2&lt;/code&gt; levels visible at once. The result: no matter how large your backlog, a single view renders at most 584 cells. We measured layout time at ~1.4ms for a 1,000-issue project and ~1.8ms for a 10,000-issue one. It's essentially flat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rust and WASM
&lt;/h2&gt;

&lt;p&gt;The geometry work — computing where every node goes, what size it should be, what fidelity level it gets — is pure arithmetic with tight loops. It's exactly the kind of work JavaScript is not well suited to, and exactly what Rust is.&lt;/p&gt;

&lt;p&gt;We compile the layout core to WebAssembly. It runs in the browser, but it runs at near-native speed. The Rust core produces a flat buffer of &lt;code&gt;RenderedNode&lt;/code&gt; structs — position, size, depth, status, fidelity — and the JavaScript layer is a dumb consumer of that buffer. It reads the numbers and draws rectangles. No logic lives in the rendering layer.&lt;/p&gt;

&lt;p&gt;The canvas itself is four stacked layers: geometry, state (colours and fill), focus (the working level highlight), and presence (collaborator indicators). Only the layers that need to change repaint. A status update on one issue repaints the state layer. Navigation repaints the focus layer. The geometry layer repaints only on resize.&lt;/p&gt;

&lt;p&gt;This separation is what keeps navigation instant. Drilling into a node is a WASM call and a canvas repaint, not a re-fetch or a DOM reconciliation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the AI groups your backlog
&lt;/h2&gt;

&lt;p&gt;The AI grouping was the part I was most nervous about — not technically, but economically. LLM calls cost money, and a Jira backlog with 5,000 issues could get expensive fast if you sent every issue to a model.&lt;/p&gt;

&lt;p&gt;The answer was &lt;strong&gt;deterministic first&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before we touch an LLM we build as much structure as we can from what Jira already knows: existing parent/child links, epics, components, fix versions, labels, issue type. For most backlogs this resolves the majority of issues at zero inference cost.&lt;/p&gt;

&lt;p&gt;Only then do we look at what's left — the overflow buckets where a parent has more than 8 children, and the &lt;code&gt;Unsorted&lt;/code&gt; pile of issues that don't fit anywhere. Those go to the model, &lt;strong&gt;batched per bucket&lt;/strong&gt;, not per issue. One call covers an entire overflow group. The model receives the issue keys and summaries, and returns a named partition — at most 8 thematic groups with a one-line rationale for each.&lt;/p&gt;

&lt;p&gt;If a returned group still has more than 8 members, we recurse. The constraint is enforced all the way down.&lt;/p&gt;

&lt;p&gt;We measured this at around &lt;strong&gt;$0.24 per 1,000 LLM-resolved issues&lt;/strong&gt;, which sounds small and is small — the cost is dominated by the fixed overhead of the prompt and tool schema per call, not by the number of issues. It scales with the number of overflow buckets, not the size of the backlog, which rewards the deterministic-first approach.&lt;/p&gt;

&lt;p&gt;One more thing worth knowing: any group you rename, move or adjust is marked as yours. A rebuild will work around your edits, never overwrite them.&lt;/p&gt;




&lt;p&gt;The combination — a WASM geometry core that never renders more than it needs to, and an AI layer that only runs where deterministic logic falls short — is what makes Teppe feel fast and cheap to operate at the same time.&lt;/p&gt;

&lt;p&gt;If any of this is interesting and you want to go deeper, feel free to reach out.&lt;/p&gt;

&lt;p&gt;Email: &lt;a href="mailto:info@teppe.io"&gt;info@teppe.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luke&lt;/p&gt;

</description>
      <category>rust</category>
      <category>webassembly</category>
      <category>ai</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Jira backlog hierarchy</title>
      <dc:creator>Luke Jones</dc:creator>
      <pubDate>Wed, 02 Sep 2026 05:53:21 +0000</pubDate>
      <link>https://dev.to/luke_jones_a844cfe3e576ea/jira-backlog-hierarchy-ol3</link>
      <guid>https://dev.to/luke_jones_a844cfe3e576ea/jira-backlog-hierarchy-ol3</guid>
      <description>&lt;p&gt;&lt;strong&gt;The List is dead. Long live the Fractal.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Small lists are great, large lists are not. Why? Because &lt;em&gt;you&lt;/em&gt; - the reader - give a small list &lt;strong&gt;context&lt;/strong&gt; and we simply cannot do the same for a 1500 item long list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two" rel="noopener noreferrer"&gt;Miller's Law&lt;/a&gt; tells us humans hold around 7±2 items in working memory at once.&lt;/p&gt;

&lt;p&gt;With this in mind I took a snapshot of Apache Spark's public Jira backlog and produced a fractal view of the latest 5000 issues with their statuses mapped to the defaults.&lt;/p&gt;

&lt;p&gt;Diving into one section of the fractal view we can see at a glance the great progress the Spark team continues to make - good job Apache!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F334xi11zccxzeagepqra.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F334xi11zccxzeagepqra.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The beauty of this view is you could be looking at 500 issues or 5 billion - all contained in a simple 3x3 square. Conceptually there is no limit.&lt;/p&gt;

&lt;p&gt;Finally, &lt;strong&gt;infinity &lt;em&gt;with&lt;/em&gt; context.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We can create a &lt;a href="https://en.wikipedia.org/wiki/Sierpi%C5%84ski_carpet" rel="noopener noreferrer"&gt;Sierpiński carpet&lt;/a&gt; we call &lt;em&gt;Teppe&lt;/em&gt;&amp;nbsp;(/TEP-uh/), where you can see and navigate through your entire backlog and intuitively see what’s related to what and whether it's been done.&lt;/p&gt;

&lt;p&gt;This is all available &lt;a href="https://marketplace.atlassian.com/apps/550848104" rel="noopener noreferrer"&gt;free on the Atlassian Marketplace&lt;/a&gt;. No data leaves Atlassian.&lt;/p&gt;

&lt;p&gt;If you would like to see how Teppe for Jira can visualise your backlog please give it a try - it only takes a couple of minutes.&lt;/p&gt;

&lt;p&gt;We would really appreciate any feedback to help us improve and inform what direction we take the tool next.&lt;/p&gt;

&lt;p&gt;Please do not hesitate to ask any questions.&lt;/p&gt;

&lt;p&gt;I will shortly be doing a technical write up of how it's made and how we're able to render and navigate around tens of thousands issues in &amp;lt;10ms.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

&lt;p&gt;Email: &lt;a href="mailto:info@teppe.io"&gt;info@teppe.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luke&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>management</category>
      <category>rust</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
