<?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: CJ</title>
    <description>The latest articles on DEV Community by CJ (@zennmarieee).</description>
    <link>https://dev.to/zennmarieee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3960900%2F5add7a87-c074-4974-9f06-efd2733831c5.jpg</url>
      <title>DEV Community: CJ</title>
      <link>https://dev.to/zennmarieee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zennmarieee"/>
    <language>en</language>
    <item>
      <title>The Passion Autopsy: A Compassionate Case File for the Hobbies We Let Go</title>
      <dc:creator>CJ</dc:creator>
      <pubDate>Mon, 13 Jul 2026 06:05:39 +0000</pubDate>
      <link>https://dev.to/zennmarieee/the-passion-autopsy-a-compassionate-case-file-for-the-hobbies-we-let-go-1fih</link>
      <guid>https://dev.to/zennmarieee/the-passion-autopsy-a-compassionate-case-file-for-the-hobbies-we-let-go-1fih</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Passion Autopsy&lt;/strong&gt; is a small web app for a passion no one ever talks about: the ones we quietly let die.&lt;/p&gt;

&lt;p&gt;Most "passion" projects celebrate the fire — the fandom, the rivalry, the obsession still burning. I wanted to build something for the other side of that: the guitar in the closet, the half-finished novel, the sport you gave up somewhere between adulthood and exhaustion. Instead of guilt-tripping you about quitting, the app generates a compassionate, literary &lt;strong&gt;autopsy report&lt;/strong&gt; for your lost passion — written by the fictional &lt;strong&gt;Chief Examiner at the Department of Lost Passions&lt;/strong&gt; — exploring what happened to it, and whether it could realistically come back.&lt;/p&gt;

&lt;p&gt;You type in what you used to love, roughly when it faded, and a sentence or two of context. The examiner returns a full case file: a status (Deceased / Dormant / Critical / Missing), a cause of death, contributing factors, a fragment of "recovered evidence" quoted from your own words, the examiner's findings, and an honest read on whether revival is possible — closing on a single line meant to read like the last words on a museum plaque.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://passion-autopsy.vercel.app/" rel="noopener noreferrer"&gt;https://passion-autopsy.vercel.app/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub repo:&lt;/strong&gt; &lt;a href="https://github.com/zennmarieee/passion-autopsy" rel="noopener noreferrer"&gt;https://github.com/zennmarieee/passion-autopsy&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Home Page
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4p0bp3or3dcja3ztuyn5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4p0bp3or3dcja3ztuyn5.png" alt="Home Page" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Passion Report
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fho11q048pdqvlun9pk44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fho11q048pdqvlun9pk44.png" alt="Report1" width="800" height="1436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Next.js (App Router) + TypeScript + Tailwind CSS, deployed on Vercel. No database, no authentication — the entire experience lives in a single page, backed by one serverless API route.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The persona is the product.&lt;/strong&gt; The whole app hinges on Gemini staying in character as a forensic examiner rather than slipping into generic AI or self-help language. I spent real time on the prompt: it explicitly forbids clichés like &lt;em&gt;"it's never too late"&lt;/em&gt; or &lt;em&gt;"follow your dreams,"&lt;/em&gt; frames the passion itself (not the person) as the "patient" under examination, and asks for a closing line written like a museum plaque inscription rather than a motivational quote. Getting that tone right mattered more to me than any single feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured output, validated end-to-end.&lt;/strong&gt; Gemini returns strict JSON (&lt;code&gt;status&lt;/code&gt;, &lt;code&gt;cause_of_death&lt;/code&gt;, &lt;code&gt;contributing_factors&lt;/code&gt;, &lt;code&gt;recovered_evidence&lt;/code&gt;, &lt;code&gt;autopsy_findings&lt;/code&gt;, &lt;code&gt;resurrection_possibility&lt;/code&gt;, &lt;code&gt;case_closing_statement&lt;/code&gt;), which I validate against a schema server-side before it ever reaches the client — so a malformed AI response fails loudly on the server instead of quietly breaking the UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt-injection guard.&lt;/strong&gt; Since three form fields get dropped directly into the prompt, I explicitly delimit user input as &lt;code&gt;&amp;lt;case_intake&amp;gt;&lt;/code&gt; &lt;em&gt;data&lt;/em&gt;, with an instruction telling Gemini to treat anything that looks like an embedded instruction as a strange detail about the passion, not a command to obey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hardest bug wasn't the AI — it was the screenshot.&lt;/strong&gt; The "Download as Image" export (built with html2canvas) came out looking completely washed out for a while. Turned out to be two separate issues stacked on top of each other: Tailwind's CSS-variable-based color system doesn't always survive html2canvas's DOM cloning, &lt;em&gt;and&lt;/em&gt; the card's fade-in animation — which starts at &lt;code&gt;opacity: 0&lt;/code&gt; — was restarting on the clone and getting rasterized before it finished. The fix was to have html2canvas copy already-resolved computed colors onto the clone and explicitly force &lt;code&gt;animation: none; opacity: 1&lt;/code&gt; before rasterizing. Small bug, satisfying fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local history, no database.&lt;/strong&gt; Past cases save to &lt;code&gt;localStorage&lt;/code&gt; so you can revisit or re-download old reports — fully client-side, removable anytime, never sent anywhere. Keeps the "no backend" constraint honest while still giving the experience some persistence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guardrails for a public demo.&lt;/strong&gt; A lightweight per-IP rate limit and an origin check on the API route keep the (very finite) Gemini quota from being drained by casual abuse, since this is a publicly shared link with no login.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Google AI&lt;/strong&gt; — Gemini (&lt;code&gt;gemini-3.1-flash-lite&lt;/code&gt;) is the entire reasoning engine behind this project, not a bolted-on summarizer. It's doing structured persona-driven creative writing under a hard JSON schema: sustaining a consistent fictional voice, reasoning about &lt;em&gt;why&lt;/em&gt; a passion plausibly faded from sparse user input, and reconstructing a specific "evidence" detail grounded only in what the user actually said — while explicitly avoiding cliché and staying in character across every generation.&lt;/p&gt;

&lt;p&gt;Thanks for reading — and for anyone who's ever had a passion quietly go dormant: no judgment. Just data.&lt;/p&gt;

</description>
      <category>weekendchallenge</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>The Passion Autopsy — A Compassionate Case File for the Hobbies We Let Go</title>
      <dc:creator>CJ</dc:creator>
      <pubDate>Mon, 13 Jul 2026 06:01:33 +0000</pubDate>
      <link>https://dev.to/zennmarieee/the-passion-autopsy-a-compassionate-case-file-for-the-hobbies-we-let-go-5ac9</link>
      <guid>https://dev.to/zennmarieee/the-passion-autopsy-a-compassionate-case-file-for-the-hobbies-we-let-go-5ac9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Passion Autopsy&lt;/strong&gt; is a small web app for a passion no one ever talks about: the ones we quietly let die.&lt;/p&gt;

&lt;p&gt;Most "passion" projects celebrate the fire — the fandom, the rivalry, the obsession still burning. I wanted to build something for the other side of that: the guitar in the closet, the half-finished novel, the sport you gave up somewhere between adulthood and exhaustion. Instead of guilt-tripping you about quitting, the app generates a compassionate, literary &lt;strong&gt;autopsy report&lt;/strong&gt; for your lost passion — written by the fictional &lt;strong&gt;Chief Examiner at the Department of Lost Passions&lt;/strong&gt; — exploring what happened to it, and whether it could realistically come back.&lt;/p&gt;

&lt;p&gt;You type in what you used to love, roughly when it faded, and a sentence or two of context. The examiner returns a full case file: a status (Deceased / Dormant / Critical / Missing), a cause of death, contributing factors, a fragment of "recovered evidence" quoted from your own words, the examiner's findings, and an honest read on whether revival is possible — closing on a single line meant to read like the last words on a museum plaque.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://passion-autopsy.vercel.app/" rel="noopener noreferrer"&gt;https://passion-autopsy.vercel.app/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub repo:&lt;/strong&gt; &lt;a href="https://github.com/zennmarieee/passion-autopsy" rel="noopener noreferrer"&gt;https://github.com/zennmarieee/passion-autopsy&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Home Page
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4p0bp3or3dcja3ztuyn5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4p0bp3or3dcja3ztuyn5.png" alt="Home Page" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Passion Report
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fho11q048pdqvlun9pk44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fho11q048pdqvlun9pk44.png" alt="Report1" width="800" height="1436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Next.js (App Router) + TypeScript + Tailwind CSS, deployed on Vercel. No database, no authentication — the entire experience lives in a single page, backed by one serverless API route.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The persona is the product.&lt;/strong&gt; The whole app hinges on Gemini staying in character as a forensic examiner rather than slipping into generic AI or self-help language. I spent real time on the prompt: it explicitly forbids clichés like &lt;em&gt;"it's never too late"&lt;/em&gt; or &lt;em&gt;"follow your dreams,"&lt;/em&gt; frames the passion itself (not the person) as the "patient" under examination, and asks for a closing line written like a museum plaque inscription rather than a motivational quote. Getting that tone right mattered more to me than any single feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured output, validated end-to-end.&lt;/strong&gt; Gemini returns strict JSON (&lt;code&gt;status&lt;/code&gt;, &lt;code&gt;cause_of_death&lt;/code&gt;, &lt;code&gt;contributing_factors&lt;/code&gt;, &lt;code&gt;recovered_evidence&lt;/code&gt;, &lt;code&gt;autopsy_findings&lt;/code&gt;, &lt;code&gt;resurrection_possibility&lt;/code&gt;, &lt;code&gt;case_closing_statement&lt;/code&gt;), which I validate against a schema server-side before it ever reaches the client — so a malformed AI response fails loudly on the server instead of quietly breaking the UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt-injection guard.&lt;/strong&gt; Since three form fields get dropped directly into the prompt, I explicitly delimit user input as &lt;code&gt;&amp;lt;case_intake&amp;gt;&lt;/code&gt; &lt;em&gt;data&lt;/em&gt;, with an instruction telling Gemini to treat anything that looks like an embedded instruction as a strange detail about the passion, not a command to obey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hardest bug wasn't the AI — it was the screenshot.&lt;/strong&gt; The "Download as Image" export (built with html2canvas) came out looking completely washed out for a while. Turned out to be two separate issues stacked on top of each other: Tailwind's CSS-variable-based color system doesn't always survive html2canvas's DOM cloning, &lt;em&gt;and&lt;/em&gt; the card's fade-in animation — which starts at &lt;code&gt;opacity: 0&lt;/code&gt; — was restarting on the clone and getting rasterized before it finished. The fix was to have html2canvas copy already-resolved computed colors onto the clone and explicitly force &lt;code&gt;animation: none; opacity: 1&lt;/code&gt; before rasterizing. Small bug, satisfying fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local history, no database.&lt;/strong&gt; Past cases save to &lt;code&gt;localStorage&lt;/code&gt; so you can revisit or re-download old reports — fully client-side, removable anytime, never sent anywhere. Keeps the "no backend" constraint honest while still giving the experience some persistence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guardrails for a public demo.&lt;/strong&gt; A lightweight per-IP rate limit and an origin check on the API route keep the (very finite) Gemini quota from being drained by casual abuse, since this is a publicly shared link with no login.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Google AI&lt;/strong&gt; — Gemini (&lt;code&gt;gemini-3.1-flash-lite&lt;/code&gt;) is the entire reasoning engine behind this project, not a bolted-on summarizer. It's doing structured persona-driven creative writing under a hard JSON schema: sustaining a consistent fictional voice, reasoning about &lt;em&gt;why&lt;/em&gt; a passion plausibly faded from sparse user input, and reconstructing a specific "evidence" detail grounded only in what the user actually said — while explicitly avoiding cliché and staying in character across every generation.&lt;/p&gt;

&lt;p&gt;Thanks for reading — and for anyone who's ever had a passion quietly go dormant: no judgment. Just data.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <item>
      <title>I Finally Finished LifeSquares: A Life-in-Weeks Reflection App</title>
      <dc:creator>CJ</dc:creator>
      <pubDate>Sun, 07 Jun 2026 16:34:36 +0000</pubDate>
      <link>https://dev.to/zennmarieee/i-finally-finished-lifesquares-a-life-in-weeks-reflection-app-4iia</link>
      <guid>https://dev.to/zennmarieee/i-finally-finished-lifesquares-a-life-in-weeks-reflection-app-4iia</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;LifeSquares is a reflective web application that visualizes a person's life as a grid of weeks. Each square represents a single week, turning the abstract concept of time into something tangible and easier to understand.&lt;/p&gt;

&lt;p&gt;The project was inspired by the idea that life is finite and that seeing time visually can encourage more intentional living. Rather than focusing on productivity or achievement, LifeSquares is designed as a personal reflection tool that helps users think about their past, present, and future.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Interactive life grid where every week is represented as a square&lt;/li&gt;
&lt;li&gt;Birthdate-based calculations for weeks lived and weeks remaining&lt;/li&gt;
&lt;li&gt;Adjustable lifespan projections&lt;/li&gt;
&lt;li&gt;Life phase visualization using color-coded stages&lt;/li&gt;
&lt;li&gt;Weekly journaling and reflection entries&lt;/li&gt;
&lt;li&gt;Life statistics and summary metrics&lt;/li&gt;
&lt;li&gt;Responsive and accessible interface&lt;/li&gt;
&lt;li&gt;Light and dark theme support&lt;/li&gt;
&lt;li&gt;Local storage persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://lifesquares.vercel.app/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Check out the Live Demo&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/zennmarieee" rel="noopener noreferrer"&gt;
        zennmarieee
      &lt;/a&gt; / &lt;a href="https://github.com/zennmarieee/LifeSquares" rel="noopener noreferrer"&gt;
        LifeSquares
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Each square equals one week, turning time into something tangible and reflective.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LifeSquares&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;LifeSquares is a web-based life visualization and reflection app that represents your entire lifespan as a grid of weekly squares. Each square equals one week — turning abstract time into something you can see, feel, and write about.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🟦 Interactive Life Grid&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Visualize every week of your life as a square. Hover for tooltips, navigate with your keyboard, and see your past and future at a glance.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;📅 Birthdate Input &amp;amp; Validation&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Enter your birthdate via a date picker or typed input. LifeSquares computes your weeks lived and weeks remaining automatically.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;⏳ Lifespan Selector&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Adjust your assumed lifespan (default: 4,000 weeks / ~76.9 years) to explore different projections and see how the numbers shift.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🎨 Life Phase Color Coding&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Toggle a suggested life phase model that colors the grid by heuristic age ranges:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Age Range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Childhood&lt;/td&gt;
&lt;td&gt;0–12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teen &amp;amp; Early Adult&lt;/td&gt;
&lt;td&gt;13–24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Working Years&lt;/td&gt;
&lt;td&gt;25–64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retirement &amp;amp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/zennmarieee/LifeSquares" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Video Walkthrough
&lt;/h3&gt;

&lt;p&gt;Demo:   &lt;iframe src="https://www.youtube.com/embed/frlmt0q53Pw"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The walkthrough demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a life grid from a birthdate&lt;/li&gt;
&lt;li&gt;Exploring life statistics&lt;/li&gt;
&lt;li&gt;Switching lifespan projections&lt;/li&gt;
&lt;li&gt;Writing journal entries&lt;/li&gt;
&lt;li&gt;Theme switching and persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Before
&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%2Ftg6x4qfqcr83kuxqtd89.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%2Ftg6x4qfqcr83kuxqtd89.png" alt="Original LifeSquares prototype showing a basic life grid with minimal styling" width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  After
&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%2Frdsnijmv7gvvoy1lz87z.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%2Frdsnijmv7gvvoy1lz87z.png" alt="Redesigned LifeSquares interface featuring an interactive life grid and improved layout" width="799" height="434"&gt;&lt;/a&gt;&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%2Fn3uxt5qjmdkp72miqf1r.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%2Fn3uxt5qjmdkp72miqf1r.png" alt="Redesigned Lifesquares Dark Mode Version" width="800" height="435"&gt;&lt;/a&gt;&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%2Fnofmvdcw9aq8yqktynt3.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%2Fnofmvdcw9aq8yqktynt3.png" alt="Redesigned Lifesquares Stats Tab" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story: Resurrecting LifeSquares
&lt;/h2&gt;

&lt;p&gt;LifeSquares started as an experiment inspired by the “life in weeks” concept. The initial version did its job—it could render a life grid and calculate weeks lived—but it always felt closer to a visualization than a real product.&lt;/p&gt;

&lt;p&gt;When I returned to it for the &lt;strong&gt;Finish-Up-A-Thon&lt;/strong&gt;, it was clear the project had potential, but it was incomplete in every meaningful way: no persistence, no reflection layer, and no real structure beyond the grid itself.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Goal:&lt;/strong&gt; Before the challenge, LifeSquares could &lt;em&gt;display&lt;/em&gt; time. After revisiting it, I wanted it to help users &lt;em&gt;interact&lt;/em&gt; with time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The Technical Debt Wake-up Call
&lt;/h3&gt;

&lt;p&gt;Reopening the codebase months later was a reality check. The architecture had drifted into something fragile—state was scattered, components were tightly coupled, and the grid logic was doing far more than it should have been responsible for. Even small changes risked breaking unrelated parts of the UI.&lt;/p&gt;

&lt;p&gt;The biggest pivots I had to make were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Refactoring state management:&lt;/strong&gt; Moving from a scattered component-level approach into a more structured flow.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Rebuilding the grid logic:&lt;/strong&gt; Decoupling it from user data so it could scale cleanly with different lifespan configurations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Debugging Nightmare
&lt;/h3&gt;

&lt;p&gt;The most frustrating issue showed up in the grid layout. On certain screen sizes (especially mobile Safari), the squares would subtly shift out of alignment.&lt;/p&gt;

&lt;p&gt;I ended up tracing it back to how offsets were being calculated when mapping weeks into rows and columns. The logic assumed a fixed layout, which completely broke under responsive scaling. The fix came from simplifying the calculation instead of overengineering it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The corrected approach: Deriving the grid from a single source of truth&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;calculateGrid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lifeExpectancy&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="c1"&gt;// Each year = 52 weeks, grid is derived directly from total weeks&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;lifeExpectancy&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;52&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;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot acted as a development partner throughout the project.&lt;/p&gt;

&lt;p&gt;I used Copilot to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accelerate React component development&lt;/li&gt;
&lt;li&gt;Generate repetitive UI boilerplate&lt;/li&gt;
&lt;li&gt;Refactor existing code&lt;/li&gt;
&lt;li&gt;Improve accessibility implementations&lt;/li&gt;
&lt;li&gt;Explore alternative approaches for state management&lt;/li&gt;
&lt;li&gt;Speed up debugging and iteration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than replacing my decision-making, Copilot helped reduce development friction and allowed me to focus more on product design, user experience, and feature refinement.&lt;/p&gt;

&lt;p&gt;The Finish-Up-A-Thon provided the perfect motivation to revisit an unfinished idea and turn it into something I was excited to share publicly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Future plans for LifeSquares include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data export and backup options&lt;/li&gt;
&lt;li&gt;Richer journaling experiences&lt;/li&gt;
&lt;li&gt;Goal and milestone tracking&lt;/li&gt;
&lt;li&gt;Calendar integrations&lt;/li&gt;
&lt;li&gt;Additional visualization modes&lt;/li&gt;
&lt;li&gt;Optional cloud synchronization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LifeSquares reminded me that unfinished projects still have potential—it just takes the decision to come back and finish them.&lt;/p&gt;

&lt;p&gt;I'm curious—how do you all track your time or personal milestones? Do you prefer 'productivity' focused tools, or are you more into 'reflection' tools like LifeSquares? Let me know in the comments!&lt;/p&gt;

</description>
      <category>githubchallenge</category>
      <category>devchallenge</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Finally Finished LifeSquares: A Life-in-Weeks Reflection App</title>
      <dc:creator>CJ</dc:creator>
      <pubDate>Sun, 07 Jun 2026 15:45:36 +0000</pubDate>
      <link>https://dev.to/zennmarieee/i-finally-finished-lifesquares-a-life-in-weeks-reflection-app-4lgb</link>
      <guid>https://dev.to/zennmarieee/i-finally-finished-lifesquares-a-life-in-weeks-reflection-app-4lgb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;LifeSquares is a reflective web application that visualizes a person's life as a grid of weeks. Each square represents a single week, turning the abstract concept of time into something tangible and easier to understand.&lt;/p&gt;

&lt;p&gt;The project was inspired by the idea that life is finite and that seeing time visually can encourage more intentional living. Rather than focusing on productivity or achievement, LifeSquares is designed as a personal reflection tool that helps users think about their past, present, and future.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Interactive life grid where every week is represented as a square&lt;/li&gt;
&lt;li&gt;Birthdate-based calculations for weeks lived and weeks remaining&lt;/li&gt;
&lt;li&gt;Adjustable lifespan projections&lt;/li&gt;
&lt;li&gt;Life phase visualization using color-coded stages&lt;/li&gt;
&lt;li&gt;Weekly journaling and reflection entries&lt;/li&gt;
&lt;li&gt;Life statistics and summary metrics&lt;/li&gt;
&lt;li&gt;Responsive and accessible interface&lt;/li&gt;
&lt;li&gt;Light and dark theme support&lt;/li&gt;
&lt;li&gt;Local storage persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://lifesquares.vercel.app/" rel="noopener noreferrer"&gt;https://lifesquares.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/zennmarieee/LifeSquares" rel="noopener noreferrer"&gt;https://github.com/zennmarieee/LifeSquares&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Video Walkthrough
&lt;/h3&gt;

&lt;p&gt;Demo: &lt;a href="https://www.youtube.com/watch?v=frlmt0q53Pw" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=frlmt0q53Pw&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The walkthrough demonstrates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a life grid from a birthdate&lt;/li&gt;
&lt;li&gt;Exploring life statistics&lt;/li&gt;
&lt;li&gt;Switching lifespan projections&lt;/li&gt;
&lt;li&gt;Writing journal entries&lt;/li&gt;
&lt;li&gt;Theme switching and persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Before
&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%2Ftg6x4qfqcr83kuxqtd89.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%2Ftg6x4qfqcr83kuxqtd89.png" alt="Original LifeSquares prototype showing a basic life grid with minimal styling" width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  After
&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%2Frdsnijmv7gvvoy1lz87z.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%2Frdsnijmv7gvvoy1lz87z.png" alt="Redesigned LifeSquares interface featuring an interactive life grid and improved layout" width="799" height="434"&gt;&lt;/a&gt;&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%2Fn3uxt5qjmdkp72miqf1r.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%2Fn3uxt5qjmdkp72miqf1r.png" alt="After App" width="800" height="435"&gt;&lt;/a&gt;&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%2Fnofmvdcw9aq8yqktynt3.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%2Fnofmvdcw9aq8yqktynt3.png" alt="After App" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;LifeSquares started as an experiment inspired by the popular "life in weeks" concept. The initial version successfully displayed a life grid, but it felt more like a visualization than a complete product.&lt;/p&gt;

&lt;p&gt;Before participating in the Finish-Up-A-Thon, LifeSquares could display a life grid and calculate weeks lived, but it lacked journaling, life statistics, theme support, local persistence, and many of the features needed to make it useful beyond a simple visualization.&lt;/p&gt;

&lt;p&gt;During the challenge, I focused on transforming it from a simple concept into a more complete experience by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding weekly journaling functionality&lt;/li&gt;
&lt;li&gt;Building life summaries and statistics dashboards&lt;/li&gt;
&lt;li&gt;Creating lifespan customization options&lt;/li&gt;
&lt;li&gt;Improving accessibility and keyboard navigation&lt;/li&gt;
&lt;li&gt;Implementing light and dark themes&lt;/li&gt;
&lt;li&gt;Adding local persistence so data survives page refreshes&lt;/li&gt;
&lt;li&gt;Improving the overall UI and responsiveness&lt;/li&gt;
&lt;li&gt;Preparing the application for deployment and public use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest improvement was shifting the project from merely showing time to helping users reflect on how they spend it.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot acted as a development partner throughout the project.&lt;/p&gt;

&lt;p&gt;I used Copilot to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accelerate React component development&lt;/li&gt;
&lt;li&gt;Generate repetitive UI boilerplate&lt;/li&gt;
&lt;li&gt;Refactor existing code&lt;/li&gt;
&lt;li&gt;Improve accessibility implementations&lt;/li&gt;
&lt;li&gt;Explore alternative approaches for state management&lt;/li&gt;
&lt;li&gt;Speed up debugging and iteration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than replacing my decision-making, Copilot helped reduce development friction and allowed me to focus more on product design, user experience, and feature refinement.&lt;/p&gt;

&lt;p&gt;The Finish-Up-A-Thon provided the perfect motivation to revisit an unfinished idea and turn it into something I was excited to share publicly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Future plans for LifeSquares include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data export and backup options&lt;/li&gt;
&lt;li&gt;Richer journaling experiences&lt;/li&gt;
&lt;li&gt;Goal and milestone tracking&lt;/li&gt;
&lt;li&gt;Calendar integrations&lt;/li&gt;
&lt;li&gt;Additional visualization modes&lt;/li&gt;
&lt;li&gt;Optional cloud synchronization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LifeSquares reminded me that unfinished projects still have potential—it just takes the decision to come back and finish them.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>webdev</category>
      <category>react</category>
    </item>
  </channel>
</rss>
