<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://nageemsemaj.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://nageemsemaj.com/" rel="alternate" type="text/html" /><updated>2026-05-08T10:17:46-06:00</updated><id>https://nageemsemaj.com/feed.xml</id><title type="html">James Meegan</title><subtitle>Personal. Portfolio. Blog: Highlighting My Experiences.</subtitle><author><name>James Meegan</name></author><entry><title type="html">Building Tools For Fantasy Football</title><link href="https://nageemsemaj.com/meta/2026/05/08/sleeper-dynasty-tools.html" rel="alternate" type="text/html" title="Building Tools For Fantasy Football" /><published>2026-05-08T00:00:00-06:00</published><updated>2026-05-08T00:00:00-06:00</updated><id>https://nageemsemaj.com/meta/2026/05/08/sleeper-dynasty-tools</id><content type="html" xml:base="https://nageemsemaj.com/meta/2026/05/08/sleeper-dynasty-tools.html"><![CDATA[<!--
  This is a sample first post. Delete it or rewrite it.
  New posts: create a file in /_posts named YYYY-MM-DD-your-title.md
  and include the same kind of front matter block at the top.
-->

<p>I play in multiple dynasty fantasy football leagues. And for as much time as I spend thinking about them, I was spending a surprising amount of that time just trying to get a basic read on where things stood.</p>

<p>Who’s winning? How old is my roster relative to the rest of the league? Did that trade I’ve been thinking about actually happen? Where did I even save that roster export?</p>

<p>None of that lives in one place. The Sleeper app is great for managing moves and checking scores, but it’s not built for the kind of standing-back, big-picture view that dynasty managers actually need. So I started building tools to fill the gap.</p>

<h2 id="tool-1-sleeper-dynasty-roster-sync">Tool 1: Sleeper Dynasty Roster Sync</h2>

<p>The first problem I hit was practical: I wanted my roster data in a spreadsheet so I could sort, filter, and think about it without fighting a mobile UI.</p>

<p><a href="https://github.com/nageemsemaj/sleeper-dynasty-roster-sync">Sleeper Dynasty Roster Sync</a> is a Google Apps Script that pulls your Sleeper roster into Google Sheets automatically. Point it at your league, run it, and your full roster — player names, positions, ages, and ownership details — populates a clean sheet you can work with however you want.</p>

<p>It’s a small script, but it solved a real workflow problem. I was manually copying roster data before big decisions. Now I don’t.</p>

<p><strong>Built with:</strong> Google Apps Script, Sleeper API</p>

<h2 id="tool-2-sleeper-league-health-dashboard">Tool 2: Sleeper League Health Dashboard</h2>

<p>Once I had roster data flowing into Sheets, the next question became bigger: <em>what does my whole league look like?</em></p>

<p>The <a href="https://nageemsemaj.github.io/sleeper-league-dashboard/">Sleeper League Health Dashboard</a> is a single-page web app that pulls live data from the Sleeper API and surfaces it in one view. Enter your Sleeper username and it loads all your leagues for the season. Pick one and you get:</p>

<ul>
  <li><strong>Standings and playoff picture</strong> with win/loss record, points for/against, current streak, and clinch/bubble/elimination indicators</li>
  <li><strong>Roster age and dynasty health</strong> with per-team average age bars color-coded by contention window, plus a league-wide age distribution chart</li>
  <li><strong>Trade and waiver activity</strong> with a recent transaction feed, week-by-week volume chart, and a per-manager activity score</li>
  <li><strong>Manager spotlight</strong> — click any team to see their full roster, age breakdown, and recent transaction history</li>
</ul>

<p>No login, no backend, no install. It runs entirely in the browser off the public Sleeper API.</p>

<p><strong>Built with:</strong> Vanilla JavaScript, HTML/CSS, Chart.js, Sleeper API</p>

<h2 id="what-ive-learned-building-these">What I’ve learned building these</h2>

<p>Both tools came from the same starting point: a specific thing I wanted to know that I couldn’t easily find out. That constraint turned out to be a good forcing function. It kept the scope tight and made it easy to know when something was done.</p>

<p>On the technical side, the dashboard pushed me to think carefully about data architecture before touching the UI. The Sleeper API is well-documented but you’re pulling from several endpoints — league info, rosters, users, matchups, transactions, and a player database — and stitching them together client-side. Getting the fetch strategy right (parallel where possible, cached where expensive) made a real difference in how the app feels to use.</p>

<p>The roster sync taught me something different: sometimes the right tool is a ten-minute script, not a full application. Not everything needs a UI.</p>

<h2 id="whats-next">What’s next</h2>

<p>Both tools are actively used and I’m planning to extend them. On the dashboard side, I want to add dynasty value integration (KeepTradeCut or similar) so the roster age view has market context, and shareable per-manager links so you can send someone a direct view of their team. On the roster sync side, I want to add automatic scheduling so it refreshes on its own without needing to be run manually.</p>

<p>If you play in a Sleeper dynasty league, both tools are open source and free to use. Links below.</p>

<hr />

<p><strong><a href="https://nageemsemaj.github.io/sleeper-league-dashboard/">Sleeper League Health Dashboard</a></strong> — <a href="https://github.com/nageemsemaj/sleeper-league-dashboard">GitHub</a></p>

<p><strong><a href="https://github.com/nageemsemaj/sleeper-dynasty-roster-sync">Sleeper Dynasty Roster Sync</a></strong> — Google Apps Script</p>

<hr />

<p><em>I’ll be posting twice a month. If you’re into product management, software, or just figuring out your career as you go, stick around.</em></p>]]></content><author><name>James Meegan</name></author><category term="meta" /><category term="fantasy football" /><category term="javascript" /><category term="google apps script" /><category term="sleeper" /><category term="side projects" /><summary type="html"><![CDATA[I Kept Losing Track of My Dynasty Leagues, So I Built Two Tools to Fix That]]></summary></entry><entry><title type="html">From Cleaning Bathrooms to Breaking Software</title><link href="https://nageemsemaj.com/meta/2026/04/19/journey-1.html" rel="alternate" type="text/html" title="From Cleaning Bathrooms to Breaking Software" /><published>2026-04-19T00:00:00-06:00</published><updated>2026-04-19T00:00:00-06:00</updated><id>https://nageemsemaj.com/meta/2026/04/19/journey-1</id><content type="html" xml:base="https://nageemsemaj.com/meta/2026/04/19/journey-1.html"><![CDATA[<!--
  This is a sample first post. Delete it or rewrite it.
  New posts: create a file in /_posts named YYYY-MM-DD-your-title.md
  and include the same kind of front matter block at the top.
-->

<h1 id="from-cleaning-bathrooms-to-breaking-software">From Cleaning Bathrooms to Breaking Software</h1>

<p><strong>I didn’t plan a career in tech. I just knew I didn’t want to spend my life cleaning bathrooms. This is the story of how I found my way into QA, one wrong turn and reset at a time</strong></p>

<hr />

<h2 id="end-of-high-school">End of High School</h2>

<p>In 2008, I graduated high school with no real plan.</p>

<p>I wasn’t a bad student, but I wasn’t a disciplined one either. I tested well, but I didn’t take school seriously enough to do anything with it. I didn’t even apply to college. I just followed the default path and enrolled at Ivy Tech because that’s what people around me were doing.</p>

<p>That pattern continued for a while.</p>

<p>I told myself I’d transfer to Indiana University–Purdue University Indianapolis, but I didn’t put in the work. I spent more time traveling to visit friends at other schools than focusing on my own classes. After two years, I didn’t even have enough credits for an associate’s degree.</p>

<p>So I tried something new. I moved to Muncie and eventually got into Ball State. I explored social work, then operations management. I did… fine. Not terrible, not great. But after four years of my parents supporting my education, they drew a line. Fairly.</p>

<p>By 2012, I was back home, working jobs that paid the bills but didn’t feel like a future.</p>

<p>I made pizzas. I delivered them. I cleaned bathrooms. I worked at a deli. I picked up a second job at a liquor store just to piece together something that looked like full-time income.</p>

<p>And one day, cleaning a bathroom at work, I had a very clear realization:</p>

<p>I didn’t want this to be my trajectory.</p>

<h2 id="the-reset">The Reset</h2>

<p>I went back to school with a different mindset.</p>

<p>Not because I suddenly loved school, but because I finally understood what happens if you don’t take it seriously.</p>

<p>With help from my dad, I finished the last few credits I needed and earned an Associate’s degree. It wasn’t glamorous, but it was momentum.</p>

<p>When I met with an advisor at IUPUI, they asked what I wanted to study.</p>

<p>I didn’t have a polished answer. But I knew two things:</p>

<p>I liked helping people
I was always drawn to computers and technology</p>

<p>That led me to the School of Informatics and Computing and a program that was just getting started at the time: Human-Computer Interaction.</p>

<p>That decision changed everything.</p>

<h2 id="learning-how-to-learn">Learning How to Learn</h2>

<p>When I started at IUPUI in 2014, I treated it like a second chance.</p>

<p>And early on, I almost slipped back into old habits.</p>

<p>I struggled in my first math class and bombed the first two exams. That could have been the start of another spiral, but instead I did something I hadn’t done before: I asked for help.</p>

<p>I went to the Math Assistance Center every day.</p>

<p>I did my homework there. I asked questions. I stayed until I understood the material.</p>

<p>My next three exam scores were 94, 98, and 100.</p>

<p>I finished the class with a B+, and more importantly, I proved to myself that I could change how I approached problems. After that semester, I made the Dean’s List every term.</p>

<p>That experience stuck with me more than any single class.</p>

<h2 id="discovering-qa-by-accident">Discovering QA (By Accident)</h2>

<p>Near graduation, I hit another unexpected hurdle.</p>

<p>An internship I had lined up didn’t count toward my capstone requirement. I suddenly needed a new one, fast.</p>

<p>I ended up landing a session internship with the Office of Technology Services for the Indiana Legislative Services Agency.</p>

<p>That’s where I was introduced to quality assurance.</p>

<p>Up to that point, my studies focused on designing good user experiences. QA flipped that perspective. Instead of asking, “How should this work?” I started asking:</p>

<p>“What happens when this breaks?”</p>

<p>I loved it immediately.</p>

<p>Testing wasn’t just about finding bugs. It was about protecting users from bad experiences before they ever saw them. It was problem-solving, systems thinking, and user advocacy all rolled into one.</p>

<p>I also started experimenting on my own. I built small proofs of concept using QR codes to improve access to public information like livestreams when government rooms were full.</p>

<p>At the time, the idea was brushed off.</p>

<p>Too much access. Too much transparency.</p>

<p>A few years later, QR codes became everywhere.</p>

<p>That was the first time I realized I liked not just testing systems, but thinking ahead of them.</p>

<h2 id="first-real-role-trial-by-fire">First Real Role: Trial by Fire</h2>

<p>After graduating in 2016, I joined ADESA (KAR Auction Services) as a junior QA.</p>

<p>Within six months, I was promoted and moved onto a major project building dealer-to-dealer auction applications for Toyota and Lexus.</p>

<p>That role escalated quickly.</p>

<p>We shifted from waterfall to agile. I took ownership of mobile QA. I stepped into scrum responsibilities. I worked across onshore and offshore teams.</p>

<p>Less than a year in, I wasn’t just testing anymore. I was coordinating, leading, and helping shape how work got done.</p>

<p>At the same time, I got pulled into experimental projects, like testing a custom car photo booth built with Raspberry Pi hardware. That happened because I had casually mentioned I’d built one at home for fun.</p>

<p>That moment stuck with me too.</p>

<p>The things you tinker with on your own eventually become the things people trust you with professionally.</p>

<h2 id="a-setback-that-wasnt-one">A Setback That Wasn’t One</h2>

<p>In 2019, the company eliminated QA roles.</p>

<p>The reasoning was that developers could handle testing.</p>

<p>I was laid off.</p>

<p>The next day, they asked me to come back. Same role, same pay.</p>

<p>I said no.</p>

<p>Instead, my wife and I moved to Denver.</p>

<p>At the time, it felt like a risk. In hindsight, it was a turning point.</p>

<h2 id="where-it-all-leads">Where It All Leads</h2>

<p>I didn’t take a straight path into tech.</p>

<p>I failed classes. I changed directions. I worked jobs that had nothing to do with where I ended up.</p>

<p>But each of those experiences added something:</p>

<p>Service jobs taught me empathy and patience
School (eventually) taught me discipline and how to learn
QA taught me how to think critically about systems and users</p>

<p>Today, I still approach problems the same way I approached that math class and those early QA projects:</p>

<p>Figure out what’s actually happening.
Understand where things break.
And make them better before someone else has to deal with it.</p>

<p>That’s the work I care about.</p>

<hr />

<p><em>I’ll be posting twice a month. If you’re into product management, software, or just figuring out your career as you go, stick around.</em></p>]]></content><author><name>James Meegan</name></author><category term="meta" /><category term="first-post" /><summary type="html"><![CDATA[I didn’t plan a career in tech. I just knew I didn’t want to spend my life cleaning bathrooms. This is the story of how I found my way into QA, one wrong turn and reset at a time]]></summary></entry><entry><title type="html">From QA to Product: Why I Started Writing Things Down</title><link href="https://nageemsemaj.com/meta/2026/04/16/welcome.html" rel="alternate" type="text/html" title="From QA to Product: Why I Started Writing Things Down" /><published>2026-04-16T00:00:00-06:00</published><updated>2026-04-16T00:00:00-06:00</updated><id>https://nageemsemaj.com/meta/2026/04/16/welcome</id><content type="html" xml:base="https://nageemsemaj.com/meta/2026/04/16/welcome.html"><![CDATA[<!--
  This is a sample first post. Delete it or rewrite it.
  New posts: create a file in /_posts named YYYY-MM-DD-your-title.md
  and include the same kind of front matter block at the top.
-->

<h1 id="from-qa-to-product-why-i-started-writing-things-down">From QA to Product: Why I Started Writing Things Down</h1>

<p><strong>I’m not a writer — let’s just get that out of the way up front.</strong></p>

<hr />

<h2 id="the-setup">The Setup</h2>

<p>I’ve spent my career in software. I started in QA, which means I spent years trying to break things other people built — and honestly, I was pretty good at it. Somewhere along the way I moved into product management, which means I now spend my time figuring out <em>what</em> to build and <em>why</em> before anyone writes a line of code.</p>

<p>That shift changed how I think about software, about teams, and about what “quality” actually means. And I kept having these moments — conversations with my team, decisions that went well (or didn’t), patterns I kept seeing — where I thought, “I should write this down.”</p>

<p>So here I am, writing it down.</p>

<h2 id="why-bother">Why Bother?</h2>

<p>A few reasons, if I’m being honest.</p>

<p>First, I want to get better at articulating what I’ve learned. When you move from a technical role into product, you pick up a lot through experience that’s hard to put into words. Writing forces you to make it concrete.</p>

<p>Second, I think the QA-to-PM path is more common than people realize, but nobody really talks about it. If you’re a QA engineer thinking about product, or a PM who came from a testing background, I want this to be a space where that perspective gets some airtime.</p>

<p>Third — and this is the selfish one — I want a record. A few years from now I want to look back and see how my thinking evolved. That’s worth the discomfort of putting myself out there.</p>

<h2 id="what-to-expect">What to Expect</h2>

<p>I’m going to keep this simple. Twice a month I’ll share something — a lesson from work, a take on how teams build software, a reflection on my career so far. Some posts will be practical (here’s a framework I use, here’s how I handle X). Others will be more personal (here’s something I got wrong, here’s what surprised me).</p>

<p>I’m not going to pretend I have all the answers. I’m still figuring a lot of this out. But I think there’s value in sharing the process, not just the polished takeaways.</p>

<h2 id="the-takeaway">The Takeaway</h2>

<p>If you’ve ever thought “I’m not a writer” as a reason not to share what you know — I get it. I’m right there with you. But I’ve realized that having something worth saying matters more than saying it perfectly.</p>

<p>So here goes. Thanks for reading the first one.</p>

<hr />

<p><em>I’ll be posting twice a month. If you’re into product management, software, or just figuring out your career as you go, stick around.</em></p>]]></content><author><name>James Meegan</name></author><category term="meta" /><category term="first-post" /><summary type="html"><![CDATA[I'm not a writer. But I've learned a lot switching from QA to product management, and I figured it was time to start sharing some of it.]]></summary></entry></feed>