<?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: Matt Lewandowski</title>
    <description>The latest articles on DEV Community by Matt Lewandowski (@mattlewandowski93).</description>
    <link>https://dev.to/mattlewandowski93</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1262492%2Fbe1683c2-49ec-4c77-ab7d-43b5a6a7269a.jpeg</url>
      <title>DEV Community: Matt Lewandowski</title>
      <link>https://dev.to/mattlewandowski93</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mattlewandowski93"/>
    <language>en</language>
    <item>
      <title>I Built a Microservice Name Generator Because Naming Things Is Hard 🤖🌱</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Wed, 25 Feb 2026 18:52:14 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/i-built-a-microservice-name-generator-because-naming-things-is-hard-503h</link>
      <guid>https://dev.to/mattlewandowski93/i-built-a-microservice-name-generator-because-naming-things-is-hard-503h</guid>
      <description>&lt;p&gt;There are two hard problems in computer science: cache invalidation, naming things, and off-by-one errors.&lt;/p&gt;

&lt;p&gt;I've made peace with cache invalidation. Off-by-one errors? I'll get to those eventually. But naming microservices? That one haunts me.&lt;/p&gt;

&lt;p&gt;You know the feeling. It's 10 AM. You've got a fresh service to build. The architecture is clear, the tickets are groomed, you're ready to go. Then someone asks: &lt;em&gt;"What are we calling it?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And suddenly it's 11:30 and your team is in a heated Slack thread debating whether &lt;code&gt;email-sender&lt;/code&gt; is too generic and &lt;code&gt;outbound-notification-delivery-service&lt;/code&gt; is too long.&lt;/p&gt;

&lt;p&gt;I got tired of this, so I built a thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool
&lt;/h2&gt;

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

&lt;p&gt;&lt;a href="https://kollabe.com/tools/microservice-name-generator" rel="noopener noreferrer"&gt;Microservice Name Generator&lt;/a&gt;. You describe what your service does, pick a naming style, and it gives you 5 names with README descriptions ready to copy-paste.&lt;/p&gt;

&lt;p&gt;That's it. That's the tool.&lt;/p&gt;

&lt;p&gt;But the fun part is how the names get generated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two modes for two moods
&lt;/h2&gt;

&lt;p&gt;I built two naming styles because sometimes you're feeling creative and sometimes your architect is watching.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fun &amp;amp; creative
&lt;/h3&gt;

&lt;p&gt;This is the one I actually use. You type "a service that sends emails" and instead of getting &lt;code&gt;email-service&lt;/code&gt; like some kind of animal, you get names like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hermes, the Greek messenger god. &lt;em&gt;Obviously.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Pidgeot, the carrier pigeon Pokemon. Tell me that's not perfect for a delivery service.&lt;/li&gt;
&lt;li&gt;Paul Revere, the original "one if by land, two if by sea" notification system.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The prompt behind this mode pulls from mythology, pop culture, video games, history, all of it. I told the AI to think laterally. Don't just describe what the service does, find a clever reference that connects to it.&lt;/p&gt;

&lt;p&gt;Each name comes with a README description that sounds like it was written by a developer who is way too enthusiastic about their service name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; The swift messenger of your application stack.

**Hermes** handles all outbound email delivery with the grace
and speed of the Greek messenger god himself. Whether it's
transactional notifications or bulk campaigns, Hermes ensures
your messages reach their destination without getting lost
in the underworld.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm not going to pretend that's not delightful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Professional &amp;amp; enterprise
&lt;/h3&gt;

&lt;p&gt;For when you need to keep it boring. Sorry, "enterprise-grade."&lt;/p&gt;

&lt;p&gt;This mode generates names like &lt;code&gt;srv-outbound-emails&lt;/code&gt; and &lt;code&gt;api-user-auth&lt;/code&gt;. Kebab-case, prefixed, scannable in a service registry. Your platform team will love it. The README descriptions read like internal documentation because, well, they are.&lt;/p&gt;

&lt;p&gt;I included this mode because I know not everyone gets to name their service "Cerberus" at work. But they should.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copy-paste ready
&lt;/h2&gt;

&lt;p&gt;One thing I was adamant about: the output has to be immediately usable. Every name comes with a copy button that grabs the markdown README description. There's also a "Copy All" button if you want to dump all five into a doc and let your team vote.&lt;/p&gt;

&lt;p&gt;No reformatting. Generate, copy, paste into your repo, done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go name your services
&lt;/h2&gt;

&lt;p&gt;The tool is free: &lt;a href="https://kollabe.com/tools/microservice-name-generator" rel="noopener noreferrer"&gt;kollabe.com/tools/microservice-name-generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go generate some names. Send the weird ones to your team's Slack. Name your next service after a Greek god. Life's too short for &lt;code&gt;svc-data-processor-v3&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's the best (or worst) microservice name you've ever seen at work? Drop it in the comments. I collect these like Pokemon cards.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Your Team's Icebreakers Shouldn't Make People Cringe 😬</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Wed, 18 Feb 2026 20:17:21 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/your-teams-icebreakers-shouldnt-make-people-cringe-2dk0</link>
      <guid>https://dev.to/mattlewandowski93/your-teams-icebreakers-shouldnt-make-people-cringe-2dk0</guid>
      <description>&lt;p&gt;You know the moment. Someone shares their screen, pulls up a list of icebreaker questions, and reads: "If you were a kitchen appliance, what would you be and why?"&lt;/p&gt;

&lt;p&gt;Half the team goes on mute. One person nervously laughs. Someone types "toaster" in the chat and hopes that counts as participation.&lt;/p&gt;

&lt;p&gt;I've sat through so many bad icebreakers that I almost gave up on them entirely. But then I started running retros regularly and noticed something I didn't expect -- the meetings where we skipped the icebreaker were consistently worse. Not because the question itself mattered, but because nobody had spoken yet. And when people don't talk in the first five minutes, they tend to stay quiet the whole time.&lt;/p&gt;

&lt;p&gt;So the issue isn't icebreakers. It's that most of them are terrible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why most of them miss
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzqsstws30swxdgig8md.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzqsstws30swxdgig8md.jpg" alt="Animated illustration of three speech bubbles floating above a conference table. First bubble says " width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They're either too weird, too generic, or wrong for the room.&lt;/p&gt;

&lt;p&gt;"What's your spirit animal?" might be fine with close friends. In a Monday morning standup with people you've known for two weeks, it just creates silence. "How was your weekend?" isn't really an icebreaker at all -- it's small talk everyone already had in Slack. And a goofy question before a serious retro about a failed sprint? Tone-deaf.&lt;/p&gt;

&lt;p&gt;I think the mistake people make is treating icebreakers like a box to check instead of thinking about what the meeting actually needs. A retro needs people in a reflective headspace. A casual sync just needs people awake and willing to talk. Those are different questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I've seen work
&lt;/h2&gt;

&lt;p&gt;I run retrospectives and team meetings through &lt;a href="https://kollabe.com" rel="noopener noreferrer"&gt;Kollabe&lt;/a&gt;, so I've watched a lot of teams try different approaches over the past year. Some patterns keep showing up.&lt;/p&gt;

&lt;p&gt;Keep it to five minutes. Go around, everyone answers in a sentence or two, done. The icebreaker is the on-ramp, not the meeting.&lt;/p&gt;

&lt;p&gt;Let people pass. This sounds minor but it changes everything. The moment someone feels forced to answer, the whole exercise backfires. Say "feel free to skip" and, ironically, almost nobody does.&lt;/p&gt;

&lt;p&gt;Rotate who picks the question. When the same scrum master picks the icebreaker every single week, it starts feeling like their thing rather than a team thing. Some of the best icebreakers I've seen came from the quietest person on the team, given the chance.&lt;/p&gt;

&lt;p&gt;And match the energy. Light questions for regular syncs. Reflective ones for retros. Professional but warm for cross-team meetings where half the people don't know each other. This is the part most people skip, and it's the part that matters most.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real reason they work
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01co611wye2ytmtm5ltu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01co611wye2ytmtm5ltu.jpg" alt="Animated illustration of a video call where one person is talking with a small speech bubble, and then the rest of the grid lights up one by one as other people start talking too, like a chain reaction. Text overlay reads " width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I keep coming back to this: icebreakers aren't about fun. They're about getting voices in the room early.&lt;/p&gt;

&lt;p&gt;There's actual research behind this. When someone speaks in the first few minutes of a meeting, they're more likely to contribute for the rest of it. Remote teams feel this the hardest. In an office, you had the hallway chat, the coffee run, the "hey did you see that PR?" as you sat down. Remote meetings just... start. You go from solo deep work to a group video call with zero transition.&lt;/p&gt;

&lt;p&gt;An icebreaker is that transition. It doesn't have to be clever. "What's the last thing you watched that you'd recommend?" does the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coming up with them every week gets old
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6c5wprefq7l3agd2j1m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6c5wprefq7l3agd2j1m.jpg" alt="Animated illustration of a person at a desk with their head in their hands, a thought bubble above them cycling through icebreaker questions that keep getting crossed out. " width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll be honest -- this is the annoying part. You want to do an icebreaker, but it's Tuesday night and you're trying to think of one that isn't too cheesy, isn't too personal, and isn't the same one you used three weeks ago. It takes longer than it should for something that lasts two minutes.&lt;/p&gt;

&lt;p&gt;I built an &lt;a href="https://kollabe.com/tools/icebreaker-generator?utm_source=devto" rel="noopener noreferrer"&gt;Icebreaker Generator&lt;/a&gt; because I got tired of this exact loop. Pick the meeting type, pick the tone -- fun, thoughtful, professional -- and it spits out questions that actually fit. You can add a theme too if your team has a thing. It's free and takes about ten seconds.&lt;/p&gt;

&lt;p&gt;Whether you use it or not, the point stands: spend thirty seconds picking a question that matches your meeting, and you'll get better participation out of the other fifty-nine minutes.&lt;/p&gt;

&lt;p&gt;(If you're also in goal-setting mode because review season never really ends, I wrote about &lt;a href="https://dev.to/mattlewandowski93/smart-goals-dont-have-to-be-a-chore-i41"&gt;making SMART goals less painful&lt;/a&gt; too.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Some that actually land
&lt;/h2&gt;

&lt;p&gt;I've tested a lot of these. A few that consistently get good responses:&lt;/p&gt;

&lt;p&gt;For regular team meetings: "What's something small that made your week better?" Low stakes, easy to answer, and you actually learn something about people.&lt;/p&gt;

&lt;p&gt;For retros: "One word to describe this sprint." Sets the reflective tone without being heavy.&lt;/p&gt;

&lt;p&gt;For meetings with new faces: "What's your role in one sentence, and one thing about your work people might not know?" Gives context and a conversation starter.&lt;/p&gt;

&lt;p&gt;For Fridays: "What are you looking forward to this weekend?" Simple. Gets people mentally out of work mode before the meeting even ends.&lt;/p&gt;

&lt;h2&gt;
  
  
  None of this is complicated
&lt;/h2&gt;

&lt;p&gt;That's sort of the whole point. Icebreakers don't need to be creative or clever or carefully workshopped. They need to get people talking before the real agenda starts. Two minutes, one question, everyone speaks. The meetings where that happens go better than the ones where it doesn't.&lt;/p&gt;

&lt;p&gt;Pick something that fits the room, keep it short, and let people opt out. That's the whole strategy.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>management</category>
      <category>agile</category>
      <category>scrum</category>
    </item>
    <item>
      <title>Best Free Retrospective Tools for 2026 🏆</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Thu, 12 Feb 2026 19:53:40 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/best-free-retrospective-tools-for-2026-3lcb</link>
      <guid>https://dev.to/mattlewandowski93/best-free-retrospective-tools-for-2026-3lcb</guid>
      <description>&lt;p&gt;Most retro tools have a free tier. Very few of them are actually usable past your second sprint.&lt;/p&gt;

&lt;p&gt;I've been running retros for six years across teams of 4 and teams of 40. The pattern is always the same: you sign up, run a solid first retro, and then hit the wall. Board limits. History caps. Features locked behind a paywall that somehow only unlocks at the "Business" tier. The free plan was never a product — it was a demo with extra steps.&lt;/p&gt;

&lt;p&gt;So I went through the retro-specific tools that exist right now (not whiteboards like Miro or MURAL that happen to have retro templates) and evaluated their free plans based on what actually matters: can you run a recurring retro with your team without constantly bumping into limits?&lt;/p&gt;

&lt;p&gt;Here's where things stand in 2026.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;a href="https://kollabe.com" rel="noopener noreferrer"&gt;Kollabe&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The all-in-one that doesn't charge per seat.&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.amazonaws.com%2Fuploads%2Farticles%2Ff9ltjhrawynvnx9sxqfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9ltjhrawynvnx9sxqfa.png" alt="Kollabe retrospective" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kollabe bundles retros, planning poker, and async standups into a single platform. The retro side is where it shines — AI grouping that actually understands context (it'll cluster "our deploys take forever" with "CI pipeline needs work" without you touching anything), 1,000+ templates, and a drawing tool for the inevitable person who communicates exclusively through diagrams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI grouping with semantic similarity — not just keyword matching&lt;/li&gt;
&lt;li&gt;AI-generated summaries with customizable instructions&lt;/li&gt;
&lt;li&gt;Anonymous mode with mixed anonymous + attributed cards&lt;/li&gt;
&lt;li&gt;Inline polls on retro items (added February 2026)&lt;/li&gt;
&lt;li&gt;1,000+ templates plus an AI template generator&lt;/li&gt;
&lt;li&gt;Action items with Jira, GitHub, Linear, and Azure DevOps export&lt;/li&gt;
&lt;li&gt;Themed retros with 30+ backgrounds&lt;/li&gt;
&lt;li&gt;PDF, Markdown, CSV, JSON, and Confluence export&lt;/li&gt;
&lt;li&gt;Guided facilitation with customizable phases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's in the free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Participants per room&lt;/td&gt;
&lt;td&gt;Up to 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retro history&lt;/td&gt;
&lt;td&gt;7 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Templates&lt;/td&gt;
&lt;td&gt;All 1,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI grouping&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI summaries&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anonymous mode&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voting&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Planning poker issues&lt;/td&gt;
&lt;td&gt;10 per session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data export&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission management&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 10-participant cap is fine for most scrum teams. The 7-day history is the real friction point. If your team doesn't discuss action items within a week, they're gone. No Slack or Teams integration on any plan either, which is a real gap if your team lives in Slack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Small teams who want retros, poker, and standups in one place without paying per head.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;a href="https://parabol.co" rel="noopener noreferrer"&gt;Parabol&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Open source and used by teams at Netflix and GitHub.&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.amazonaws.com%2Fuploads%2Farticles%2Fxpmr4am8gi7oc4m0vhg0.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpmr4am8gi7oc4m0vhg0.webp" alt="parabol retrospective" width="768" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Parabol's the only tool on this list where you can read every line of the source code on GitHub. It's AGPL-licensed with 2,000+ stars and 85 contributors. That matters if your org has opinions about vendor lock-in or data ownership.&lt;/p&gt;

&lt;p&gt;The retro flow is well-designed. Four guided phases (Reflect, Group, Vote, Discuss) with each step timeboxed. AI auto-names grouped topics and generates meeting summaries, though those are limited on the free plan: 3 AI summaries total, and no AI grouping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step-by-step guided facilitation (Reflect &amp;gt; Group &amp;gt; Vote &amp;gt; Discuss)&lt;/li&gt;
&lt;li&gt;40+ built-in retro templates with custom template builder&lt;/li&gt;
&lt;li&gt;AI meeting summaries posted to Slack automatically&lt;/li&gt;
&lt;li&gt;Sprint poker with Jira/GitHub/GitLab ticket import&lt;/li&gt;
&lt;li&gt;Async standups with customizable questions&lt;/li&gt;
&lt;li&gt;Team health checks (paid plans only)&lt;/li&gt;
&lt;li&gt;Action items carry over between meetings automatically&lt;/li&gt;
&lt;li&gt;Integrations: Jira, GitHub, GitLab, Slack, Teams, Linear, Azure DevOps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's in the free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Users&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;Up to 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meetings per month&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meeting history&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom templates&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI summaries&lt;/td&gt;
&lt;td&gt;3 total&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI grouping&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Health checks&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSO/SAML&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Unlimited users is a big deal. Most free tiers cap you at 5-10 participants. But 10 meetings per month will bite you fast if you're running retros, poker, and standups across two teams. That's maybe 4-5 meetings per team per month, tight for a biweekly sprint cadence. The 30-day history is more forgiving than Kollabe's 7 days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Engineering teams that value open source and want guided facilitation out of the box.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;a href="https://easyretro.io" rel="noopener noreferrer"&gt;EasyRetro&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The one that's been around since 2015 and does exactly one thing.&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.amazonaws.com%2Fuploads%2Farticles%2Fuv3s8xsr4zw8n0vbwpff.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuv3s8xsr4zw8n0vbwpff.jpg" alt="easyretro retro" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;EasyRetro (originally FunRetro) doesn't do poker. Doesn't do standups. Doesn't do health checks. It makes retro boards, and it's been quietly doing that for over a decade while other tools pivot and rebrand every eighteen months.&lt;/p&gt;

&lt;p&gt;200+ templates, real anonymity (participants don't need accounts), and the Jira export is mature enough that it handles bulk card export as of late 2024. They added AI board summaries in early 2024. No AI grouping though, so you're still dragging cards into clusters manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;200+ retro templates with custom board builder&lt;/li&gt;
&lt;li&gt;True anonymous participation — no signup required for board members&lt;/li&gt;
&lt;li&gt;AI-generated board summaries&lt;/li&gt;
&lt;li&gt;Card drawing, GIFs, and emoji reactions&lt;/li&gt;
&lt;li&gt;Dot voting with per-column or per-board limits&lt;/li&gt;
&lt;li&gt;Presentation mode for revealing columns one at a time&lt;/li&gt;
&lt;li&gt;Export to PDF, CSV, PNG, Excel, Confluence&lt;/li&gt;
&lt;li&gt;Jira and Trello action item export&lt;/li&gt;
&lt;li&gt;Password-protected boards&lt;/li&gt;
&lt;li&gt;8 languages supported&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's in the free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Boards on dashboard&lt;/td&gt;
&lt;td&gt;1 at a time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boards per month&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Participants per board&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Templates&lt;/td&gt;
&lt;td&gt;All 200+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surveys&lt;/td&gt;
&lt;td&gt;1 per month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exports&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrations&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here's where EasyRetro's free plan gets honest. One board. Not one board per sprint. One board total on your dashboard. You have to delete it before creating another. No exports, no integrations. For a one-off retro with a new team or a workshop, it works. As a recurring tool, you'll hit the wall fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Teams that want a simple retro board and nothing else, or occasional facilitation where one board at a time isn't a problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;a href="https://goretro.ai" rel="noopener noreferrer"&gt;GoRetro&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Sprint management that's wider than just retros.&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.amazonaws.com%2Fuploads%2Farticles%2Fcjaht5qjw7zgxim7hy7f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjaht5qjw7zgxim7hy7f.jpg" alt="goretro retro" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GoRetro goes wider than just retro boards. There's a sprint capacity calculator, Jira-based sprint monitoring, and a "Joker Cards" feature that auto-generates discussion prompts from your sprint data. The happiness index tracks team mood over time, which is basic but useful if you're an SM who reports up to leadership.&lt;/p&gt;

&lt;p&gt;The retro board itself is solid. 34 templates, anonymous mode, configurable voting. No AI grouping. GoRetro's marketing mentions a "meeting recap" feature but competitor comparison pages call it out as not being a true AI summary. I couldn't verify it either way. Take the claim with some salt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;34 retro templates plus custom board builder&lt;/li&gt;
&lt;li&gt;Happiness index tracking across sprints&lt;/li&gt;
&lt;li&gt;Joker Cards — auto-generated discussion prompts from sprint data&lt;/li&gt;
&lt;li&gt;Planning poker with Jira backlog import (paid plan only)&lt;/li&gt;
&lt;li&gt;Sprint capacity calculator (paid plan only)&lt;/li&gt;
&lt;li&gt;Facilitated icebreakers with random question generation&lt;/li&gt;
&lt;li&gt;Action items with owner assignment, due dates, and email notifications&lt;/li&gt;
&lt;li&gt;Jira integration (import and export)&lt;/li&gt;
&lt;li&gt;Slack integration for action item sharing (paid plan only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's in the free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public boards&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Templates&lt;/td&gt;
&lt;td&gt;All 34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anonymous mode&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voting&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action items&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exports&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Planning poker&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack integration&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five public boards and unlimited users is reasonable for a small team on biweekly sprints. You'll burn through those five boards in ten weeks though, and there's no clear info on whether old boards count against the limit after archiving. No exports on free, so your retro data lives in GoRetro or nowhere.&lt;/p&gt;

&lt;p&gt;One flag: GoRetro's public changelog hasn't been updated since May 2023. The product is still active and selling, but the pace of visible development has slowed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Scrum masters who want sprint-level analytics and mood tracking alongside their retros.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;a href="https://neatro.io" rel="noopener noreferrer"&gt;Neatro&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Guided retros with built-in health checks and ROTI.&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.amazonaws.com%2Fuploads%2Farticles%2Foe1gg0lsosptvevwivms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foe1gg0lsosptvevwivms.png" alt="neatro retro" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neatro is a small Canadian team (three people, bootstrapped) that built a retro tool around structured facilitation. Every retro follows four steps: Collect, Group, Vote, Action Plan. There's no freeform canvas. No infinite whiteboard. Just a guided workflow that keeps your retro on track.&lt;/p&gt;

&lt;p&gt;The things that set Neatro apart are features other tools charge for or don't have at all. Team Radars (health checks) are a standalone feature, not just a retro template you repurpose. ROTI surveys run at the end of every retro automatically. And the action plan auto-surfaces incomplete items from previous retros, which kills the "did we actually do that?" conversation at the start of every session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4-step guided workflow (Collect &amp;gt; Group &amp;gt; Vote &amp;gt; Action Plan)&lt;/li&gt;
&lt;li&gt;Team Radars — standalone health check surveys&lt;/li&gt;
&lt;li&gt;ROTI (Return on Time Invested) survey after each retro&lt;/li&gt;
&lt;li&gt;30+ built-in templates plus Neatroverse community gallery&lt;/li&gt;
&lt;li&gt;Icebreaker Question Game with 200+ questions&lt;/li&gt;
&lt;li&gt;Async retros — collect feedback throughout the sprint&lt;/li&gt;
&lt;li&gt;Auto-surfacing of incomplete action items from past retros&lt;/li&gt;
&lt;li&gt;Action item export to Jira, GitHub, Azure DevOps, Asana, Monday.com&lt;/li&gt;
&lt;li&gt;Long-term analytics with recurring theme identification&lt;/li&gt;
&lt;li&gt;PDF and CSV reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's in the free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Members per team&lt;/td&gt;
&lt;td&gt;Up to 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retros&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team Radars&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Templates&lt;/td&gt;
&lt;td&gt;All (built-in + custom)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retro history&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrations&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exports&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROTI&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Icebreakers&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Honestly a solid free plan. Unlimited retros and health checks with a team of 10. No board caps, no meeting limits. The 30-day history and no-export restrictions are the usual tradeoffs, and the 10-member cap means larger teams are out. No AI features at all. Whether that matters depends on how many cards your team generates per retro. Under 30? Manual grouping is fine. Over 50? You'll want AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Facilitators who want structured retros with health tracking and don't need AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Free Plan Limit&lt;/th&gt;
&lt;th&gt;AI Features&lt;/th&gt;
&lt;th&gt;Guided Flow&lt;/th&gt;
&lt;th&gt;Extra Ceremonies&lt;/th&gt;
&lt;th&gt;Integrations (Free)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kollabe&lt;/td&gt;
&lt;td&gt;10 users, 7-day history&lt;/td&gt;
&lt;td&gt;Grouping + Summaries&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Poker, Standups&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parabol&lt;/td&gt;
&lt;td&gt;10 meetings/mo, 30-day history&lt;/td&gt;
&lt;td&gt;3 summaries only&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Poker, Standups&lt;/td&gt;
&lt;td&gt;Jira, GitHub, Slack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EasyRetro&lt;/td&gt;
&lt;td&gt;1 board at a time&lt;/td&gt;
&lt;td&gt;Summaries only&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GoRetro&lt;/td&gt;
&lt;td&gt;5 boards, 1 team&lt;/td&gt;
&lt;td&gt;None confirmed&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;None on free&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neatro&lt;/td&gt;
&lt;td&gt;10 members, 30-day history&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Health Checks&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Which One Should You Actually Use?
&lt;/h2&gt;

&lt;p&gt;There's no best free retro tool. There's the one that annoys you least within its constraints.&lt;/p&gt;

&lt;p&gt;Kollabe gives you the most raw functionality on free: AI grouping, poker, standups, the works. The 7-day history means you need to act on things fast, but for a team under 10 it's hard to beat.&lt;/p&gt;

&lt;p&gt;Parabol is the pick when open source matters or you need Slack and Jira integration without paying. Watch that 10-meeting monthly cap though. It sneaks up on you.&lt;/p&gt;

&lt;p&gt;EasyRetro is the path of least resistance for one-off retros. No signup for participants. But one board at a time makes recurring use painful.&lt;/p&gt;

&lt;p&gt;GoRetro works well for scrum masters who want sprint analytics and mood tracking alongside their retros. Five boards gets you ten weeks. After that, you're paying.&lt;/p&gt;

&lt;p&gt;Neatro is quietly the most generous for pure retro usage. Unlimited retros, unlimited health checks, a real guided workflow. No AI, but not every team needs it.&lt;/p&gt;

&lt;p&gt;All five of these tools are banking on you outgrowing the free plan. That's fine. It's a business model, not a conspiracy. Just know what the upgrade costs before you get your team hooked.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>agile</category>
      <category>management</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Your User Stories Are Too Big 🎯🤯</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Wed, 04 Feb 2026 18:43:51 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/your-user-stories-are-too-big-5g0o</link>
      <guid>https://dev.to/mattlewandowski93/your-user-stories-are-too-big-5g0o</guid>
      <description>&lt;p&gt;It's sprint planning day. Someone pulls up a ticket called "Implement user authentication" and the room goes quiet.&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.amazonaws.com%2Fuploads%2Farticles%2F1lt2veeicufuxwn0c2hz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lt2veeicufuxwn0c2hz.jpg" alt="Stack of tickets" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The story has been sitting in the backlog for three sprints. Nobody wants to estimate it because everyone knows it's going to blow up. The last time you tried to tackle something this size, it turned into a two-week death march that ended with the story getting split mid-sprint anyway.&lt;/p&gt;

&lt;p&gt;Large user stories are planning poison. They hide complexity, resist estimation, and turn your sprint board into a graveyard of half-finished work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with big stories
&lt;/h2&gt;

&lt;p&gt;When a story is too large, a few predictable things happen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Planning poker turns into guessing.&lt;/strong&gt; You throw out an 8, someone else says 13, a third person suggests breaking it down. Twenty minutes later, you've compromised on "we'll figure it out" and moved on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Work bleeds across sprints.&lt;/strong&gt; The story gets started but not finished. It carries over. Then carries over again. Your velocity charts start looking like modern art.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hidden complexity surfaces at the worst time.&lt;/strong&gt; Day three of the sprint, someone discovers an edge case that doubles the scope. Now you're cutting corners or cutting scope, neither of which feels good.&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.amazonaws.com%2Fuploads%2Farticles%2Fasn62mviigjgxd9v3aiv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fasn62mviigjgxd9v3aiv.jpg" alt="Confused planning poker" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What good splitting looks like
&lt;/h2&gt;

&lt;p&gt;A well-split story should pass a simple test: can a user actually do something with it?&lt;/p&gt;

&lt;p&gt;"Create database schema for users" is not a good split. It's a technical task disguised as a story.&lt;/p&gt;

&lt;p&gt;"User can register with email" is better. Someone can use it. You can demo it. It delivers actual value.&lt;/p&gt;

&lt;p&gt;The trick is finding the right seam to cut along. Sometimes that's workflow steps. Sometimes it's data types. Sometimes it's complexity levels (basic case first, edge cases later).&lt;/p&gt;

&lt;h2&gt;
  
  
  Splitting strategies that actually work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;By workflow:&lt;/strong&gt; If your story involves multiple steps, each step might be its own story. "User can upload a profile photo" and "User can crop their profile photo" are both independently useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By data variation:&lt;/strong&gt; If your story handles different types of input, split by type. "User can import from CSV" and "User can import from Excel" can ship separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By complexity:&lt;/strong&gt; Start with the happy path. "User can reset password via email" ships first. "User can reset password via SMS" comes later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By user type:&lt;/strong&gt; "Admin can view reports" and "Team lead can view reports" might have different requirements worth separating.&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.amazonaws.com%2Fuploads%2Farticles%2Fejekkcayp7r2alwq118w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejekkcayp7r2alwq118w.jpg" alt="users in front of board" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool I built for this
&lt;/h2&gt;

&lt;p&gt;I got tired of staring at massive stories trying to figure out where to cut them. So I built a &lt;a href="https://kollabe.com/tools/story-splitter?utm_source=devto" rel="noopener noreferrer"&gt;Story Splitter&lt;/a&gt; that does the thinking for you.&lt;/p&gt;

&lt;p&gt;Paste in your oversized story, add some context about your project if you want, and it generates sub-stories with acceptance criteria. Takes about 30 seconds.&lt;/p&gt;

&lt;p&gt;It's free. No signup required.&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.amazonaws.com%2Fuploads%2Farticles%2Fwxcd4f853mmen8jfbpjq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxcd4f853mmen8jfbpjq.jpg" alt="Story splitter" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to split
&lt;/h2&gt;

&lt;p&gt;Not every story needs splitting. A story that fits comfortably in a sprint with clear acceptance criteria should stay whole. Over-splitting creates its own overhead: more tickets to track, more PRs to review, more standups where someone says "still working on that tiny thing."&lt;/p&gt;

&lt;p&gt;The goal is stories your team can estimate with confidence, build within a sprint, and demo to stakeholders. If you're already there, leave it alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smaller stories, better sprints
&lt;/h2&gt;

&lt;p&gt;Better story sizing fixes problems upstream. Estimates get more accurate. Work actually finishes. The board moves in a way that feels real instead of theatrical.&lt;/p&gt;

&lt;p&gt;Next time you're staring at a monster ticket nobody wants to touch, try breaking it down first. Your sprint planning sessions will thank you.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>scrum</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>SMART Goals Don't Have to Be a Chore 🎯</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Tue, 03 Feb 2026 00:00:55 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/smart-goals-dont-have-to-be-a-chore-i41</link>
      <guid>https://dev.to/mattlewandowski93/smart-goals-dont-have-to-be-a-chore-i41</guid>
      <description>&lt;p&gt;It's review season again. Your manager sends the dreaded message: "Please submit your goals for next quarter by Friday."&lt;/p&gt;

&lt;p&gt;You open a blank doc. You stare at it. You write "get better at system design" and immediately delete it because you know that's going to get sent back with "can you make this more specific?"&lt;/p&gt;

&lt;p&gt;We've all been there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with most developer goals
&lt;/h2&gt;

&lt;p&gt;Most engineers I've worked with fall into one of two camps.&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.amazonaws.com%2Fuploads%2Farticles%2Fs9lj4t6gb4mlxj3rnbzp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9lj4t6gb4mlxj3rnbzp.jpg" alt="two camps of engineers" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first group writes goals that are too vague. "Improve my technical skills." "Be a better communicator." "Learn more about the codebase." These sound reasonable until you try to figure out if you've actually done them.&lt;/p&gt;

&lt;p&gt;The second group goes too ambitious. "Become an expert in Kubernetes, GraphQL, and machine learning while also mentoring three juniors and leading the platform migration." By March, you've quietly abandoned all of it.&lt;/p&gt;

&lt;p&gt;Vague goals are impossible to track. Impossible goals just make you feel bad. Neither helps.&lt;/p&gt;

&lt;h2&gt;
  
  
  SMART goals, minus the corporate nonsense
&lt;/h2&gt;

&lt;p&gt;You've probably heard of SMART goals. The framework has been around since the 80s and gets trotted out in every management training ever. Most explanations make it sound more complicated than it is.&lt;/p&gt;

&lt;p&gt;Here's what actually matters:&lt;/p&gt;

&lt;p&gt;Specific means spelling out what you're going to do. "Learn TypeScript" becomes "Convert the authentication module from JavaScript to TypeScript."&lt;/p&gt;

&lt;p&gt;Measurable means knowing when you're done. "The auth module passes all existing tests with strict TypeScript config enabled."&lt;/p&gt;

&lt;p&gt;Achievable means being honest about your workload. If you're heads-down on a major feature, maybe converting one module is more realistic than rewriting the entire service.&lt;/p&gt;

&lt;p&gt;Relevant means the goal actually helps your team or your career. Converting that auth module might not matter if your team is pivoting to a different language anyway.&lt;/p&gt;

&lt;p&gt;Time-bound means setting a deadline. "By end of Q2" is better than "eventually."&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like in practice
&lt;/h2&gt;

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

&lt;p&gt;Here's a real goal I set for myself last year:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Complete the AWS Solutions Architect certification by March 31st by studying 5 hours per week and passing at least 3 practice exams with scores above 80%.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Compare that to what I might have written before:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Learn more about AWS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first version told me exactly what I needed to do each week. The second version would have let me watch one YouTube video and technically claim progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making this less painful
&lt;/h2&gt;

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

&lt;p&gt;The actual writing is the annoying part. You know what you want to achieve, but translating that into corporate-acceptable goal format takes longer than it should.&lt;/p&gt;

&lt;p&gt;I built a &lt;a href="https://kollabe.com/tools/smart-goal-generator?utm_source=devto" rel="noopener noreferrer"&gt;SMART Goal Generator&lt;/a&gt; for exactly this reason. You describe what you want to accomplish, and it structures it properly with all the SMART criteria plus action steps. It's free and takes maybe 30 seconds.&lt;/p&gt;

&lt;p&gt;But whether you use a tool or write them yourself, the important thing is having goals you can actually track. Review season is a lot less stressful when you can point to concrete accomplishments instead of hand-waving about how you "definitely grew as an engineer."&lt;/p&gt;

&lt;h2&gt;
  
  
  A few tips from trial and error
&lt;/h2&gt;

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

&lt;p&gt;Break annual goals into quarters. A 12-month goal is hard to track. "Get promoted" is a year-long ambition, but "complete the tech lead shadow program by Q1" is something you can actually work toward.&lt;/p&gt;

&lt;p&gt;Update goals when reality changes. If your project pivots or you realize a goal was unrealistic, change it. A modified goal beats an abandoned one.&lt;/p&gt;

&lt;p&gt;Pick fewer goals than you think you need. Three focused goals beat eight scattered ones. You'll actually finish them, which matters more than having an impressive-looking list.&lt;/p&gt;

&lt;p&gt;Connect them to something you care about. "Learn GraphQL because my manager said so" has a much lower completion rate than "Learn GraphQL because I want to build a side project that uses it."&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual point
&lt;/h2&gt;

&lt;p&gt;Goals aren't about impressing anyone during your performance review. They're about making sure you're working on things that matter to you and can articulate what you've accomplished when the time comes.&lt;/p&gt;

&lt;p&gt;The SMART framework isn't magic. It's just a checklist that keeps you honest. The important thing is that when next review season rolls around, you have something concrete to show for your time.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>agile</category>
      <category>management</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Friday = Retro Day 🍻📈</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Thu, 29 Jan 2026 22:28:05 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/friday-retro-day-44a1</link>
      <guid>https://dev.to/mattlewandowski93/friday-retro-day-44a1</guid>
      <description>&lt;p&gt;Every week we see the same thing. Friday afternoon hits and retro activity spikes across &lt;a href="https://kollabe.com" rel="noopener noreferrer"&gt;Kollabe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Makes sense when you think about it.&lt;/p&gt;

&lt;p&gt;The sprint's still fresh. You actually remember why that one ticket took three days instead of one. And there's something about Friday energy that makes people more willing to be honest before they clock out.&lt;/p&gt;

&lt;p&gt;I think there's also something satisfying about heading into the weekend knowing your team actually talked about what worked and what didn't. Loose ends tied up. Slate cleaned.&lt;/p&gt;

&lt;p&gt;If you're lucky, you can crack open a drink while you do it. Retros don't have to feel like a performance review. Some of the best ones happen when people are relaxed and just... talking.&lt;/p&gt;

&lt;h2&gt;
  
  
  For teams running one today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep it tight. 30-45 mins max.&lt;/li&gt;
&lt;li&gt;Walk away with one or two things you'll actually do, not a list of 15.&lt;/li&gt;
&lt;li&gt;Talk about the wins too, not just the fires.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What day does your team usually run retros? Curious if Friday is as common as our data suggests or if we're just seeing a certain type of team.&lt;/p&gt;

&lt;p&gt;Happy Friday 🍻&lt;/p&gt;

</description>
      <category>agile</category>
      <category>management</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>It's 2026. Why Are Teams Still Playing Planning Poker? ♣️</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Wed, 28 Jan 2026 19:26:46 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/its-2026-why-are-teams-still-playing-planning-poker-29gn</link>
      <guid>https://dev.to/mattlewandowski93/its-2026-why-are-teams-still-playing-planning-poker-29gn</guid>
      <description>&lt;p&gt;I run &lt;a href="https://kollabe.com/" rel="noopener noreferrer"&gt;Kollabe&lt;/a&gt;, a free planning poker tool. We've got around 70,000 users using it every month. And I keep getting the same question from people outside the agile world: why are developers still doing this?&lt;/p&gt;

&lt;p&gt;It's a fair question. We have AI that can estimate tickets now. We have historical data. We have tools that can look at a codebase and make educated guesses about complexity. So why are smart people still sitting in a virtual room holding up cards with numbers on them?&lt;/p&gt;

&lt;p&gt;I've talked to a lot our users users about this. The answer aligned pretty well with my own experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number isn't the point
&lt;/h2&gt;

&lt;p&gt;Here's what most people get wrong: nobody actually cares if a ticket is a 3 or a 5. The velocity math works out either way over time.&lt;/p&gt;

&lt;p&gt;What matters is what happens when someone votes 3 and someone else votes 8.&lt;/p&gt;

&lt;p&gt;That gap is where the value lives. Because now you have a conversation. "Wait, you think this is an 8? What am I missing?" And then someone mentions the legacy payment system this ticket touches. Or the API that's being deprecated next month. Or the fact that QA is going to need three days with this one because of some edge cases the ticket doesn't mention.&lt;/p&gt;

&lt;p&gt;That information was locked in someone's head. The vote forced it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI can't fix this
&lt;/h2&gt;

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

&lt;p&gt;I get pitched constantly on AI estimation features. "Let us analyze your tickets and predict story points." And look, we've built some AI stuff into Kollabe. It's useful for certain things.&lt;/p&gt;

&lt;p&gt;But AI can't tell you that your tech lead gets twitchy every time someone mentions the auth module. It doesn't know that the DevOps guy is on vacation next week and he's the only one who understands the deployment pipeline for that service. It hasn't been in the meeting where someone said "we'll clean that up later" two years ago and never did.&lt;/p&gt;

&lt;p&gt;Your team has context. They have history. They have opinions about what's actually going to happen when this code hits production. Planning poker is just a structured way to get that stuff out of their heads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually surfaces in these conversations
&lt;/h2&gt;

&lt;p&gt;I've asked a lot of teams what they learn during estimation that they didn't know going in. Same themes keep coming up:&lt;/p&gt;

&lt;p&gt;Dependencies nobody wrote down. "Oh, that needs the inventory team's API? They're doing a migration right now."&lt;/p&gt;

&lt;p&gt;Scope that seemed obvious but wasn't. "Does user authentication include the SSO flow, or just email and password?"&lt;/p&gt;

&lt;p&gt;Landmines in the codebase. Someone who's been around a while will just know that a particular file is fragile, or that a certain pattern has caused problems before.&lt;/p&gt;

&lt;p&gt;Experience gaps. Sometimes a junior dev will vote low because they found a simpler approach. Sometimes they'll vote low because they don't know what they don't know. Either way, you want to find out before day three of the sprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ritual matters too
&lt;/h2&gt;

&lt;p&gt;There's something else going on here. Planning poker is a ritual, and rituals have value.&lt;/p&gt;

&lt;p&gt;It's dedicated time where everyone focuses on the same thing. It creates a weird kind of psychological safety because you're not arguing with your lead directly - you're just revealing a card. You can disagree without it feeling like a confrontation.&lt;/p&gt;

&lt;p&gt;For remote teams especially, these synchronous moments matter. It's easy to lose shared understanding when everyone's async all the time.&lt;/p&gt;

&lt;h2&gt;
  
  
  So yeah, it's 2026
&lt;/h2&gt;

&lt;p&gt;Teams are still playing planning poker. They'll probably still be playing it in 2030.&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.amazonaws.com%2Fuploads%2Farticles%2F365oqp7uvyyfdtto6abd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F365oqp7uvyyfdtto6abd.png" alt="robots playing planning poker" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not because the story points are magic. Not because we haven't invented something better. But because the conversation that happens when two people disagree about a number is genuinely useful, and we haven't found a way to automate that.&lt;/p&gt;

&lt;p&gt;The point was never to get the estimate right. The point was to have the conversation that helps you avoid getting it catastrophically wrong.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>scrum</category>
      <category>agile</category>
      <category>management</category>
    </item>
    <item>
      <title>The Art of Better One-on-Ones</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Sun, 25 Jan 2026 19:53:46 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/the-art-of-better-one-on-ones-ppm</link>
      <guid>https://dev.to/mattlewandowski93/the-art-of-better-one-on-ones-ppm</guid>
      <description>&lt;p&gt;Most one-on-ones start the same way: "So... how's everything going?"&lt;/p&gt;

&lt;p&gt;And most responses are equally predictable: "Fine. Busy, but fine."&lt;/p&gt;

&lt;p&gt;Then you both sit there, trying to fill the next 25 minutes. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why One-on-Ones Matter
&lt;/h2&gt;

&lt;p&gt;One-on-ones should be the most valuable meeting on your calendar. They're where trust gets built, where problems surface before they explode, and where people actually feel heard.&lt;/p&gt;

&lt;p&gt;But without intention, they become status updates that could've been a Slack message. Or worse, they get cancelled because "nothing urgent came up."&lt;/p&gt;

&lt;p&gt;The difference between a great one-on-one and a forgettable one usually comes down to one thing: the questions you ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes a Good Question
&lt;/h2&gt;

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

&lt;p&gt;Good one-on-one questions share a few traits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They're open-ended.&lt;/strong&gt; "Are you doing okay?" gets a yes or no. "What's been on your mind lately?" opens a door.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They're specific enough to be useful.&lt;/strong&gt; "How's the project?" is vague. "What's the biggest risk you see with the timeline?" gives someone something concrete to respond to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They signal that you care.&lt;/strong&gt; Questions like "What's something you're proud of that I might not know about?" show you're interested in more than just deliverables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They create space for honesty.&lt;/strong&gt; "Is there anything I could be doing differently to support you?" invites feedback that people might not volunteer otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions Worth Asking
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For building trust:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What's something on your mind that we haven't talked about?&lt;/li&gt;
&lt;li&gt;Is there anything you've been hesitant to bring up?&lt;/li&gt;
&lt;li&gt;How are you feeling about work lately, really?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For career growth:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What skills do you want to develop this quarter?&lt;/li&gt;
&lt;li&gt;Where do you see yourself in a year? Does your current work align with that?&lt;/li&gt;
&lt;li&gt;What's a project or responsibility you'd love to take on?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For removing blockers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What's slowing you down right now?&lt;/li&gt;
&lt;li&gt;Is there a decision you're waiting on that I could help with?&lt;/li&gt;
&lt;li&gt;What's one thing that would make your day-to-day easier?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For feedback (both directions):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What's one thing I could do differently as a manager?&lt;/li&gt;
&lt;li&gt;Is there feedback you've been wanting to share but haven't found the right moment?&lt;/li&gt;
&lt;li&gt;How do you prefer to receive feedback?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Context Changes Everything
&lt;/h2&gt;

&lt;p&gt;The questions you ask depend heavily on who you're meeting with. A skip-level conversation is different from a direct report check-in. Meeting with your own manager requires a different approach than meeting with a peer.&lt;/p&gt;

&lt;p&gt;A new team member needs questions focused on onboarding and clarity. A senior engineer might benefit more from questions about autonomy and long-term growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Tool That Can Help
&lt;/h2&gt;

&lt;p&gt;If you're ever stuck on what to ask, there's a &lt;a href="https://kollabe.com/tools/one-on-one-question-generator?utm_source=devto" rel="noopener noreferrer"&gt;free one-on-one question generator&lt;/a&gt; that can help. It works for engineering managers, product managers, or really any manager running 1:1s.&lt;/p&gt;

&lt;p&gt;You select the context (direct report, your manager, skip-level, peer), choose a focus area, and it generates tailored questions using AI. You can even add additional context about your specific situation to get more focused suggestions.&lt;/p&gt;

&lt;p&gt;Use it before your meeting to prep, or pull it up during the conversation when you want to go deeper. No signup required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making It a Habit
&lt;/h2&gt;

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

&lt;p&gt;The best one-on-ones aren't about having perfect questions every time. They're about showing up consistently, being genuinely curious, and creating a space where real conversation can happen.&lt;/p&gt;

&lt;p&gt;A few principles that help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Protect the time.&lt;/strong&gt; Cancelling signals that it's not a priority.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let them drive.&lt;/strong&gt; The best 1:1s are owned by the other person, not you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skip the status updates.&lt;/strong&gt; You have other channels for that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow up.&lt;/strong&gt; If someone shares something important, remember it next time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Real Goal
&lt;/h2&gt;

&lt;p&gt;At the end of the day, one-on-ones are about connection. They're a chance to understand what someone is dealing with, what they care about, and how you can help.&lt;/p&gt;

&lt;p&gt;The questions are just a tool to get there.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What questions have worked well in your one-on-ones? Always looking for new ones to try – share yours in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>management</category>
      <category>productivity</category>
      <category>scrum</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Planning Poker Integration for Linear 🃏</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Thu, 22 Jan 2026 03:45:41 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/planning-poker-integration-for-linear-hb4</link>
      <guid>https://dev.to/mattlewandowski93/planning-poker-integration-for-linear-hb4</guid>
      <description>&lt;p&gt;Planning poker sessions just got a major upgrade for Linear users! If you're tired of manually copying story points from your planning sessions back to Linear, or struggling to keep your team's estimates in sync with your actual issues, I've got some exciting news for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Every Agile Team Faces
&lt;/h2&gt;

&lt;p&gt;We've all been there: you run a fantastic planning poker session, get great estimates from the team, and then... someone has to manually update every single issue in Linear. It's tedious, error-prone, and honestly, a bit soul-crushing when you're dealing with large backlogs.&lt;/p&gt;

&lt;p&gt;What if I told you there's a way to make this entire process seamless, automated, and actually enjoyable?&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet the Integration
&lt;/h2&gt;

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

&lt;p&gt;&lt;a href="https://kollabe.com/posts/planning-poker-with-linear?utm_source=devto" rel="noopener noreferrer"&gt;Kollabe's Planning Poker integration with Linear&lt;/a&gt; has completely transformed how teams handle sprint planning. This isn't just another basic integration – it's a full-featured solution that bridges the gap between collaborative estimation and issue management.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes This Integration Special?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 &lt;strong&gt;Smart Search &amp;amp; Filtering&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Gone are the days of manually creating cards for every issue. You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search your Linear issues directly within the planning session&lt;/li&gt;
&lt;li&gt;Filter by project, cycle, status, labels, or assignee&lt;/li&gt;
&lt;li&gt;Import exactly the issues you need with a few clicks&lt;/li&gt;
&lt;li&gt;Pull in your current or upcoming sprint in seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 &lt;strong&gt;Automatic Estimate Syncing&lt;/strong&gt;
&lt;/h3&gt;

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

&lt;p&gt;This is where things get really exciting. The integration uses your team's configured estimation scale in Linear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estimates sync back using the exact scale your team already uses&lt;/li&gt;
&lt;li&gt;No manual mapping or configuration required&lt;/li&gt;
&lt;li&gt;Support for whatever estimation approach your team prefers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ &lt;strong&gt;Real-Time Automatic Syncing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here's the magic moment: when your team reaches consensus and reveals the votes, the winning estimate automatically syncs back to Linear. No manual copying, no forgotten updates, no discrepancies between your planning session and your backlog.&lt;/p&gt;

&lt;p&gt;You'll even see a visual indicator confirming the sync was successful – it's those little touches that make the experience feel polished and reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 &lt;strong&gt;Full Workflow Integration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;But wait, there's more. The Linear integration extends to retrospectives too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Export action items from retros directly to Linear with one click&lt;/li&gt;
&lt;li&gt;Those exported issues can then be imported into your next planning poker session&lt;/li&gt;
&lt;li&gt;Your agile ceremonies actually feed into each other now&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Developer Experience You've Been Waiting For
&lt;/h2&gt;

&lt;p&gt;Setting up this integration takes minutes, not hours. The OAuth flow is smooth, the interface is intuitive, and the whole experience feels like it was built by developers who actually use planning poker regularly.&lt;/p&gt;

&lt;p&gt;Linear is built for modern software teams who value speed and simplicity. This integration matches that philosophy perfectly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Impact on Team Productivity
&lt;/h2&gt;

&lt;p&gt;Since implementing this integration, teams report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;50% reduction&lt;/strong&gt; in time spent on administrative tasks after planning sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero estimation discrepancies&lt;/strong&gt; between planning sessions and Linear&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Higher team engagement&lt;/strong&gt; during planning (no one's worried about the manual cleanup afterward)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better sprint tracking&lt;/strong&gt; with estimates that actually reflect team consensus&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;The setup process is refreshingly straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Connect your Linear account&lt;/strong&gt; through secure OAuth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select your team&lt;/strong&gt; to configure the estimation scale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search and import issues&lt;/strong&gt; using the built-in filters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start planning&lt;/strong&gt; – estimates sync automatically!&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why This Matters for Modern Development Teams
&lt;/h2&gt;

&lt;p&gt;In an era where developer experience and team efficiency are paramount, tools like this represent the evolution of agile practices. We're moving beyond "good enough" integrations toward solutions that genuinely enhance how teams work together.&lt;/p&gt;

&lt;p&gt;This integration doesn't just solve a technical problem – it removes friction from one of the most important collaborative activities in software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Ready to experience planning poker the way it should be? Check out the &lt;a href="https://kollabe.com/posts/planning-poker-with-linear?utm_source=devto" rel="noopener noreferrer"&gt;detailed setup guide&lt;/a&gt; and see how this integration can transform your team's sprint planning process.&lt;/p&gt;

&lt;p&gt;Your future self (and your team) will thank you for making the switch to automated, seamless planning poker sessions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you tried this integration? What's been your experience with planning poker tools? Drop a comment below – I'd love to hear how different teams are approaching sprint planning in 2026!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linear</category>
      <category>agile</category>
      <category>scrum</category>
      <category>productivity</category>
    </item>
    <item>
      <title>5 Tools That Make Daily Standups Actually Async</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Sat, 10 Jan 2026 23:14:36 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/5-tools-that-make-daily-standups-actually-async-48bg</link>
      <guid>https://dev.to/mattlewandowski93/5-tools-that-make-daily-standups-actually-async-48bg</guid>
      <description>&lt;p&gt;Daily standups sound great in theory. In practice? They turn into calendar clutter. Half the team is still waking up, someone's in a different timezone, and by the time you're done, 15 minutes have vanished and nobody remembers what was said.&lt;/p&gt;

&lt;p&gt;Async standups fix this. Instead of synchronizing schedules, team members drop their updates whenever it works for them. No more "sorry I'm late" or awkward silences while someone unmutes.&lt;/p&gt;

&lt;p&gt;Here are the best tools for making the switch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Async Standups Work Better
&lt;/h2&gt;

&lt;p&gt;Quick context before the list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timezone-friendly&lt;/strong&gt;: Distributed teams don't need to find that impossible overlapping hour&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respects deep work&lt;/strong&gt;: No interrupting flow states for a meeting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Written record&lt;/strong&gt;: Everything's documented automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thoughtful updates&lt;/strong&gt;: People can actually think before they type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off is you lose some spontaneous conversation. But let's be honest—most standup chatter is just "still working on the thing I mentioned yesterday."&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;a href="https://kollabe.com/standups" rel="noopener noreferrer"&gt;Kollabe&lt;/a&gt;
&lt;/h2&gt;

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

&lt;p&gt;Kollabe stands out for its AI-powered approach to async standups. Instead of manually reading through every team member's update, managers get an auto-generated summary highlighting key wins, blockers, and focus areas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI summaries generated daily, weekly, or fortnightly&lt;/li&gt;
&lt;li&gt;Per-group summaries for larger orgs (engineering gets engineering context, design gets design context)&lt;/li&gt;
&lt;li&gt;Persistent daily rooms—no meeting creation required, just show up and post&lt;/li&gt;
&lt;li&gt;Rich media support with image and video uploads&lt;/li&gt;
&lt;li&gt;Customizable questions with color coding and emoji prefixes&lt;/li&gt;
&lt;li&gt;Comments and reactions on updates&lt;/li&gt;
&lt;li&gt;Bulk export to CSV, JSON, or PDF&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Team size&lt;/td&gt;
&lt;td&gt;15 users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI summaries&lt;/td&gt;
&lt;td&gt;Full access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Media uploads&lt;/td&gt;
&lt;td&gt;Images + video&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;History&lt;/td&gt;
&lt;td&gt;7 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Teams who want intelligent insights without manual effort. The AI summaries are genuinely useful for managers juggling multiple projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kollabe.com/standup/demo?utm_source=devto" rel="noopener noreferrer"&gt;Try the demo&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;a href="https://geekbot.com/" rel="noopener noreferrer"&gt;Geekbot&lt;/a&gt;
&lt;/h2&gt;

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

&lt;p&gt;Geekbot lives entirely inside Slack and Microsoft Teams. It DMs team members at scheduled times, collects responses, and posts them to a channel. Zero context switching if your team already lives in chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native Slack and Teams integration&lt;/li&gt;
&lt;li&gt;Conversational AI queries ("what did Sarah work on last week?")&lt;/li&gt;
&lt;li&gt;Timezone-aware scheduling&lt;/li&gt;
&lt;li&gt;Pre-built templates&lt;/li&gt;
&lt;li&gt;Anonymous reporting option&lt;/li&gt;
&lt;li&gt;Participation analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Team size&lt;/td&gt;
&lt;td&gt;10 users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Features&lt;/td&gt;
&lt;td&gt;Everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platforms&lt;/td&gt;
&lt;td&gt;Slack + Teams&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Teams deeply embedded in Slack or Teams who don't want another tool in the stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;a href="https://standuply.com/" rel="noopener noreferrer"&gt;Standuply&lt;/a&gt;
&lt;/h2&gt;

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

&lt;p&gt;Standuply's differentiator is video and voice standups. Instead of typing, team members record short clips—up to 5 minutes. Adds a human element that text-only tools miss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Video and voice standup submissions&lt;/li&gt;
&lt;li&gt;Text standups also supported&lt;/li&gt;
&lt;li&gt;Deep integrations with Jira, Trello, GitHub&lt;/li&gt;
&lt;li&gt;Built-in retrospective tools&lt;/li&gt;
&lt;li&gt;Agile workflow templates&lt;/li&gt;
&lt;li&gt;Acts as a virtual scrum master&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Team size&lt;/td&gt;
&lt;td&gt;3 users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Features&lt;/td&gt;
&lt;td&gt;Basic only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trial&lt;/td&gt;
&lt;td&gt;30 days full access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Teams who want face-to-face energy in async format, or need tight PM tool integration. Note the free tier is very limited—it's essentially a trial.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;a href="https://www.dailybot.com/" rel="noopener noreferrer"&gt;DailyBot&lt;/a&gt;
&lt;/h2&gt;

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

&lt;p&gt;DailyBot goes beyond standups into full team engagement—kudos, mood tracking, icebreakers, wellness checks. Standups are one piece of a larger platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Async check-ins and standups&lt;/li&gt;
&lt;li&gt;Peer recognition (kudos)&lt;/li&gt;
&lt;li&gt;Team mood tracking over time&lt;/li&gt;
&lt;li&gt;Icebreakers and watercooler prompts&lt;/li&gt;
&lt;li&gt;Works on Slack, Teams, Discord, and Google Chat&lt;/li&gt;
&lt;li&gt;SOC2 Type II compliant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Features&lt;/td&gt;
&lt;td&gt;Basic check-ins + kudos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platforms&lt;/td&gt;
&lt;td&gt;All supported&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Paid:&lt;/strong&gt; $1.60/user/month (very affordable)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Teams who want culture-building features bundled with standups. Can feel like overkill if you just want simple status updates.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;a href="https://www.range.co/for/standups" rel="noopener noreferrer"&gt;Range&lt;/a&gt;
&lt;/h2&gt;

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

&lt;p&gt;Range positions itself as a complete team sync platform. Check-ins sit alongside meeting management, goal tracking, and team directories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Async check-ins with mood sharing&lt;/li&gt;
&lt;li&gt;Daily icebreaker prompts&lt;/li&gt;
&lt;li&gt;Meeting agendas and notes&lt;/li&gt;
&lt;li&gt;Goal and OKR tracking&lt;/li&gt;
&lt;li&gt;Team directory&lt;/li&gt;
&lt;li&gt;Integrations with Asana, GitHub, Jira&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Users&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teams&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trial&lt;/td&gt;
&lt;td&gt;14 days Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Teams wanting standups plus goals plus meetings in one place. Private check-ins (manager-only visibility) require paid plan.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Free Users&lt;/th&gt;
&lt;th&gt;Standout Feature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kollabe&lt;/td&gt;
&lt;td&gt;AI-powered insights&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Auto-generated summaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geekbot&lt;/td&gt;
&lt;td&gt;Slack/Teams natives&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Conversational queries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standuply&lt;/td&gt;
&lt;td&gt;Video/voice updates&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Recorded standups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DailyBot&lt;/td&gt;
&lt;td&gt;Team engagement&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Kudos + mood tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Range&lt;/td&gt;
&lt;td&gt;Full team sync&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Goals + meetings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to Choose
&lt;/h2&gt;

&lt;p&gt;Feature lists aside, here's what actually matters:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where does your team already work?&lt;/strong&gt; If everyone's in Slack, a Slack-native bot reduces friction. If people use multiple tools, a standalone web app might be cleaner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How big is your team?&lt;/strong&gt; Free tiers vary wildly. Check the limits before you commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you need insights or just collection?&lt;/strong&gt; Some tools just gather updates. Others surface patterns and blockers automatically. Managers with multiple teams benefit most from AI summaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's your async maturity?&lt;/strong&gt; Teams new to async might want simpler tools. Veteran remote teams can handle more sophisticated features.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;Async standups aren't about abandoning team connection—they're about respecting that connection doesn't require everyone being online simultaneously.&lt;/p&gt;

&lt;p&gt;Any of these tools beats the calendar invite that half the team skips anyway.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>scrum</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Optimizing JSON for LLMs</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Thu, 08 Jan 2026 00:39:18 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/optimizing-json-for-llms-1dgf</link>
      <guid>https://dev.to/mattlewandowski93/optimizing-json-for-llms-1dgf</guid>
      <description>&lt;p&gt;If you're building AI-powered features, you're probably sending a lot of JSON to language models. And if you're sending a lot of JSON, you're probably burning through tokens faster than you'd like.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://kollabe.com?utm_source=devto" rel="noopener noreferrer"&gt;Kollabe&lt;/a&gt;, we use AI to generate summaries, action items, and suggestions for retrospectives and standups. When you have dozens of team members submitting updates daily, the JSON payloads get large quickly. We needed ways to shrink our data without losing information.&lt;/p&gt;

&lt;p&gt;There are newer formal solutions out there like &lt;a href="https://github.com/toon-format/toon" rel="noopener noreferrer"&gt;TOON&lt;/a&gt; (Token-Oriented Object Notation) that can compress JSON for LLMs by up to 40%. It's a proper spec with benchmarks and SDKs. Worth checking out if you want a standardized approach.&lt;/p&gt;

&lt;p&gt;But sometimes you want to stay in control. You don't want another dependency. You want to understand exactly what's being sent to the model and tweak it for your specific use case. These are the simple tricks we use to cut down token usage without adding complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Replace Long IDs with Short Ones
&lt;/h2&gt;

&lt;p&gt;UUIDs are everywhere. They're great for databases, but terrible for token efficiency.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This UUID is 4-5 tokens&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;550e8400-e29b-41d4-a716-446655440000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;// This is 1 token&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;u-1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you're referencing the same user across hundreds of standup entries, those extra tokens add up fast.&lt;/p&gt;

&lt;p&gt;The solution: build a simple mapping as you process your data. First user you encounter becomes &lt;code&gt;u-1&lt;/code&gt;, second becomes &lt;code&gt;u-2&lt;/code&gt;, and so on. If you see the same UUID again, reuse the short ID you already assigned.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before: UUIDs everywhere&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;odUserId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;550e8400-e29b-41d4-a716-446655440000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;odQuestionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;7c9e6679-7425-40de-944b-e07fc1f90ae7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;odAnswerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;f47ac10b-58cc-4372-a567-0e02b2c3d479&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// After: short, prefixed IDs&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;u-1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;qid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;q-1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="na"&gt;aid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a-1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key insight is that the same UUID always maps to the same short ID. So when the LLM sees &lt;code&gt;u-1&lt;/code&gt; multiple times across different answers, it understands those entries belong to the same person. Use different prefixes for different entity types so the model can distinguish between a user ID and a question ID.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Drop the Formatting
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;JSON.stringify&lt;/code&gt; has a second and third parameter that most people forget about. The third one adds indentation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Pretty printed (wasteful)&lt;/span&gt;
&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Minified (efficient)&lt;/span&gt;
&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Pretty:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;characters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"team"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Platform"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Minified:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;characters&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"team"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Platform"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For small objects, whatever. For thousands of standup entries? That whitespace adds up. LLMs don't care about formatting anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Use Shorter Key Names
&lt;/h2&gt;

&lt;p&gt;This one feels obvious once you think about it. Compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Verbose&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;StandupEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;odUserId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;yesterdayUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;todayPlan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;blockerDescription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Concise&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;StandupEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;odUid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;yesterday&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;today&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;blocker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you have hundreds of entries, shorter keys save real tokens. Just keep them readable enough that the LLM can understand the context.&lt;/p&gt;

&lt;p&gt;A few rules we follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drop redundant words: &lt;code&gt;userId&lt;/code&gt; becomes &lt;code&gt;id&lt;/code&gt; if it's clearly a user object&lt;/li&gt;
&lt;li&gt;Use common abbreviations: &lt;code&gt;desc&lt;/code&gt; instead of &lt;code&gt;description&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Keep it unambiguous: &lt;code&gt;y&lt;/code&gt; for yesterday is too cryptic, but &lt;code&gt;yest&lt;/code&gt; works fine&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Remove Null and Empty Values
&lt;/h2&gt;

&lt;p&gt;Don't send data that doesn't exist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;removeEmpty&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromEntries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blocker&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;notes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If someone didn't report a blocker, why tell the LLM about it?&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Flatten Nested Structures When Possible
&lt;/h2&gt;

&lt;p&gt;Sometimes nesting is just organizational overhead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;profile&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;team&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Platform&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Finished feature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// After&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;team&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Platform&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;update&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Finished feature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second version conveys the same information with fewer structural tokens. Obviously don't flatten things if the hierarchy carries meaning, but often it doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Use Arrays Instead of Repeated Objects
&lt;/h2&gt;

&lt;p&gt;If you have a list of similar items, consider whether you need the full object structure for each:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before: 3 objects with repeated keys&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;entries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blocked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Carol&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// After: header row + data rows&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cols&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rows&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blocked&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Carol&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This trades some readability for efficiency. For large datasets, it's worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Strip Unnecessary Metadata
&lt;/h2&gt;

&lt;p&gt;Timestamps, audit fields, and internal IDs often aren't needed for AI processing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before: full database record&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;odAnswerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;f47ac10b-58cc-4372-a567-0e02b2c3d479&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;odUserId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;550e8400-e29b-41d4-a716-446655440000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Great sprint!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-01-15T10:30:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;updatedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2024-01-15T10:30:00.000Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;isDeleted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// After: just what the LLM needs&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;u-1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Great sprint!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ask yourself: does the model actually need this field to generate a useful response? If not, drop it.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Represent Booleans Efficiently
&lt;/h2&gt;

&lt;p&gt;For boolean flags, consider whether you even need the field when it's false:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;isAdmin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;isActive&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;isVerified&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// After: only include truthy flags&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Or use a flags array for multiple true values&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;verified&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If most users aren't admins, don't include &lt;code&gt;isAdmin: false&lt;/code&gt; on every record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting It All Together
&lt;/h2&gt;

&lt;p&gt;Here's a before and after from a real retrospective summary we generate at Kollabe:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before optimization:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"retrospectiveData"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"questions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odQuestionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7c9e6679-7425-40de-944b-e07fc1f90ae7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"questionText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What went well this sprint?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"questionType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"positive"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odQuestionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"f47ac10b-58cc-4372-a567-0e02b2c3d479"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"questionText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"What could be improved?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"questionType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"negative"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"answers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odAnswerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odQuestionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7c9e6679-7425-40de-944b-e07fc1f90ae7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odUserId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"550e8400-e29b-41d4-a716-446655440000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"userName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice Chen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"answerText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Team collaboration was excellent during the release"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-15T10:30:00.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"voteCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odAnswerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odQuestionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7c9e6679-7425-40de-944b-e07fc1f90ae7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odUserId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6ba7b810-9dad-11d1-80b4-00c04fd430c8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"userName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bob Smith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"answerText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CI/CD pipeline improvements saved us hours"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-15T10:32:00.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"voteCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odAnswerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3f333df6-90a4-4fda-8dd3-9485d27cee36"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odQuestionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"f47ac10b-58cc-4372-a567-0e02b2c3d479"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"odUserId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"550e8400-e29b-41d4-a716-446655440000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"userName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice Chen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"answerText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Documentation was often outdated"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-15T10:35:00.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"voteCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After optimization:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"qs"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"q-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"What went well this sprint?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"positive"&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"q-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"What could be improved?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"negative"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="nl"&gt;"ans"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"a-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"qid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"q-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"uid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"u-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Alice Chen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Team collaboration was excellent during the release"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"votes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"a-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"qid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"q-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"uid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"u-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Bob Smith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"CI/CD pipeline improvements saved us hours"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"votes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"a-3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"qid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"q-2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"uid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"u-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Alice Chen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Documentation was often outdated"&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UUIDs replaced with short IDs (&lt;code&gt;q-1&lt;/code&gt;, &lt;code&gt;a-1&lt;/code&gt;, &lt;code&gt;u-1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Long key names shortened (&lt;code&gt;odQuestionId&lt;/code&gt; to &lt;code&gt;qid&lt;/code&gt;, &lt;code&gt;answerText&lt;/code&gt; to &lt;code&gt;text&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Removed wrapper object (&lt;code&gt;retrospectiveData&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Dropped null values (no &lt;code&gt;voteCount: null&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Removed timestamps (not needed for summary generation)&lt;/li&gt;
&lt;li&gt;No whitespace formatting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The optimized version is roughly 50% smaller. When you're processing retrospectives for a 50-person team with hundreds of answers, that's a meaningful reduction in token costs and faster inference times.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Optimize
&lt;/h2&gt;

&lt;p&gt;Not every JSON payload needs this treatment. If you're sending a small config object or a single user query, the overhead of optimization isn't worth it.&lt;/p&gt;

&lt;p&gt;But when you're building features that process large amounts of structured data, like we do with retrospective and standup summaries at Kollabe, these tricks make a real difference. They're simple to implement, don't require external dependencies, and give you immediate wins.&lt;/p&gt;

&lt;p&gt;There's also something to be said for staying in control of your data pipeline. When you write your own optimization layer, you understand exactly what's happening. You can tweak the short ID prefixes, decide which fields to drop, and adjust the strategy as your data evolves. No black boxes.&lt;/p&gt;

&lt;p&gt;The best part? LLMs handle optimized JSON just fine. They don't need pretty formatting or verbose key names to understand your data. They just need the information.&lt;/p&gt;




&lt;p&gt;Oh and one last shameless plug: if you work on an agile dev team, check out my free &lt;a href="https://kollabe.com?utm_source=devto" rel="noopener noreferrer"&gt;planning poker and retrospective tool called Kollabe&lt;/a&gt;. We use all these tricks to power our AI summaries.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A Halloween Retrospective 🎃</title>
      <dc:creator>Matt Lewandowski</dc:creator>
      <pubDate>Thu, 30 Oct 2025 10:14:13 +0000</pubDate>
      <link>https://dev.to/mattlewandowski93/a-halloween-retrospective-17m9</link>
      <guid>https://dev.to/mattlewandowski93/a-halloween-retrospective-17m9</guid>
      <description>&lt;p&gt;Let's be honest. Running the same "What went well? What didn't?" retrospective format sprint after sprint gets stale. Your team shows up, adds a few cards, and you move on. No energy. No engagement. Just another meeting.&lt;/p&gt;

&lt;p&gt;But what if your next retro could actually be... fun?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kollabe.com/templates/halloween-retrospective?utm_source=devto" rel="noopener noreferrer"&gt;Kollabe's Halloween Retrospective template&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Themed Retros Work
&lt;/h2&gt;

&lt;p&gt;Here's the thing about retrospectives: they're only as good as the participation you get. When people are engaged, they share more honest feedback. When they're bored, you get surface level responses that don't move the needle.&lt;/p&gt;

&lt;p&gt;Themed retros break the monotony. They give people permission to be creative, have fun, and think differently about the same problems. And right now? Halloween season is the perfect excuse to try something new.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Halloween Retrospective Format
&lt;/h2&gt;

&lt;p&gt;Instead of your standard columns, try this spooky twist:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🕸️🎃 Spooky Successes&lt;/strong&gt;&lt;br&gt;
What treats and triumphs haunted your sprint? This is your "what went well" but with way more personality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👻🕷️ Ghoulish Glitches&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
What scares and missteps gave you chills? Your "what went wrong" column, but it sounds way less harsh.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧙♀️🪄 Witchy Wishes&lt;/strong&gt;&lt;br&gt;
What spells can you cast to improve the next sprint? Your action items, but now you're conjuring solutions instead of just "noting concerns."&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Run It
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with a Halloween icebreaker.&lt;/strong&gt; Ask everyone to share their favorite spooky movie or their worst Halloween costume. Gets people loosened up and talking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set the mood.&lt;/strong&gt; Use Halloween emojis, GIFs, whatever. Make it visually fun. The more playful the board looks, the more people engage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fill out the columns.&lt;/strong&gt; Give everyone 5 minutes to add their cards. Encourage emoji use. Make it weird.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Group and vote.&lt;/strong&gt; Cluster similar items together, then vote on the top priorities. Democracy, but spooky.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Turn wishes into action.&lt;/strong&gt; Take your top voted items and create actual action items with owners and deadlines. This is where the magic happens.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole thing takes 45 to 60 minutes, works great for teams of 5 to 12 people, and honestly? It's just more fun than your standard retro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

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

&lt;p&gt;If you want to run a Halloween retrospective (or any themed retro) without building it from scratch, check out &lt;a href="https://kollabe.com/templates/halloween-retrospective?utm_source=devto" rel="noopener noreferrer"&gt;Kollabe's Halloween Retrospective template&lt;/a&gt;. It's got the board already set up, includes ice breakers, and has AI features to help group similar items and summarize discussions.&lt;/p&gt;

&lt;p&gt;No signup required to start. Just create a room, share the link, and you're ready to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Retrospectives should drive continuous improvement. But if your team dreads them, they won't. Themed retros are a simple way to inject energy back into a ceremony that often becomes stale.&lt;/p&gt;

&lt;p&gt;Try a Halloween retro this month. See what happens when you make reflection fun instead of formulaic.&lt;/p&gt;

&lt;p&gt;What's the most creative retrospective format you've tried? Drop it in the comments. Always looking for new ideas.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>scrum</category>
      <category>management</category>
      <category>product</category>
    </item>
  </channel>
</rss>
