<?xml version="1.0" encoding="UTF-8"?>
<!-- Dashboard Starter build log. Hand-maintained: newest item first, one <item>
      <title>Demo Sandboxes: A Private Copy for Every Visitor</title>
      <link>https://mvmorten.com/projects/dashboard-starter/demo-sandboxes</link>
      <guid isPermaLink="true">https://mvmorten.com/projects/dashboard-starter/demo-sandboxes</guid>
      <pubDate>Fri, 13 Nov 2026 16:00:00 -0700</pubDate>
      <description>Step 8 gives every visitor a private demo sandbox instead of a shared demo account. Why the shared account kept needing workarounds, how sandboxes expire, and the background job that cleans them up without bypassing Row-Level Security.</description>
    </item>

     per post. -->
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Dashboard Starter · Built in public</title>
    <link>https://mvmorten.com/projects/dashboard-starter/</link>
    <atom:link href="https://mvmorten.com/projects/dashboard-starter/feed.xml" rel="self" type="application/rss+xml" />
    <description>An opinionated React + ASP.NET Core + SQL Server starter, built in public by Michael Mortensen.</description>
    <language>en-us</language>
    <lastBuildDate>Fri, 13 Nov 2026 16:00:00 -0700</lastBuildDate>

    <item>
      <title>Roles and Permissions: Check What, Not Who</title>
      <link>https://mvmorten.com/projects/dashboard-starter/roles-and-permissions</link>
      <guid isPermaLink="true">https://mvmorten.com/projects/dashboard-starter/roles-and-permissions</guid>
      <pubDate>Sat, 07 Nov 2026 21:00:00 -0700</pubDate>
      <description>Roles, permissions, and a Members page. Why the code checks permissions and never role names, why permissions come from the database instead of the cookie, and how a tenant always keeps an admin, even when two admins demote each other at once.</description>
    </item>

    <item>
      <title>Password Reset: Tokens, Timing, and an Email Service on Its Way Out</title>
      <link>https://mvmorten.com/projects/dashboard-starter/password-reset</link>
      <guid isPermaLink="true">https://mvmorten.com/projects/dashboard-starter/password-reset</guid>
      <pubDate>Fri, 06 Nov 2026 21:00:00 -0700</pubDate>
      <description>Forgot password, reset, and change password, built on step 5's sign-in. Where a reset link can leak, why the form gives everyone the same answer, and why email moved from Azure to Resend when Microsoft announced ACS's retirement.</description>
    </item>

    <item>
      <title>Signing In: Our Own Auth, and the Deploy It Broke</title>
      <link>https://mvmorten.com/projects/dashboard-starter/signing-in</link>
      <guid isPermaLink="true">https://mvmorten.com/projects/dashboard-starter/signing-in</guid>
      <pubDate>Wed, 04 Nov 2026 16:00:00 -0700</pubDate>
      <description>The live demo now sits behind a real sign-in: our own user tables, Argon2id, and a plain cookie, with no Identity and no JWT. How it works, and the deploy that kept failing because I merged before the infrastructure existed.</description>
    </item>

    <item>
      <title>The App Shell: A Sidebar, a Top Bar, and Three Dependencies</title>
      <link>https://mvmorten.com/projects/dashboard-starter/the-app-shell</link>
      <guid isPermaLink="true">https://mvmorten.com/projects/dashboard-starter/the-app-shell</guid>
      <pubDate>Sat, 31 Oct 2026 12:00:00 -0700</pubDate>
      <description>The single health page is now a real app shell: a sidebar, a top bar with a tenant switcher, and light and dark themes. Built on plain CSS and the browser&apos;s own elements, with exactly three new dependencies, and a lot of what I chose not to add.</description>
    </item>

    <item>
      <title>Ship Early, Ship Often: Deploying to Azure Before the First Feature</title>
      <link>https://mvmorten.com/projects/dashboard-starter/ship-early-ship-often</link>
      <guid isPermaLink="true">https://mvmorten.com/projects/dashboard-starter/ship-early-ship-often</guid>
      <pubDate>Mon, 26 Oct 2026 07:00:00 -0700</pubDate>
      <description>Step 3 was supposed to be the app shell. Instead, Dashboard Starter is live on Azure and deploys itself on every merge. Why I deployed before the first feature, how it fits together, and the three ways the first deploy failed.</description>
    </item>

    <item>
      <title>No Magic: Repo Structure and Local Dev Setup</title>
      <link>https://mvmorten.com/projects/dashboard-starter/no-magic</link>
      <guid isPermaLink="true">https://mvmorten.com/projects/dashboard-starter/no-magic</guid>
      <pubDate>Fri, 23 Oct 2026 07:00:00 -0700</pubDate>
      <description>Before writing step 2's code, I went back over the stack from post 1 and changed a surprising amount of it. What I changed, what I questioned and kept, and what the repo does now.</description>
    </item>

    <item>
      <title>Why I'm Building Another Dashboard Starter (In Public)</title>
      <link>https://mvmorten.com/projects/dashboard-starter/why-another-dashboard-starter</link>
      <guid isPermaLink="true">https://mvmorten.com/projects/dashboard-starter/why-another-dashboard-starter</guid>
      <pubDate>Tue, 20 Oct 2026 12:00:00 -0700</pubDate>
      <description>Why I'm building an open-source React, ASP.NET Core, and SQL Server dashboard starter in public, what version 1 covers, and how the series will work.</description>
    </item>
  </channel>
</rss>
