<?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: Zackary Loevseth</title>
    <description>The latest articles on DEV Community by Zackary Loevseth (@zackary_lvseth_d494d598e).</description>
    <link>https://dev.to/zackary_lvseth_d494d598e</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%2F4134758%2F4e3042ce-0f64-424d-b57e-e85876a09224.png</url>
      <title>DEV Community: Zackary Loevseth</title>
      <link>https://dev.to/zackary_lvseth_d494d598e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zackary_lvseth_d494d598e"/>
    <language>en</language>
    <item>
      <title>Fliproom: a room changeover is a content problem</title>
      <dc:creator>Zackary Loevseth</dc:creator>
      <pubDate>Mon, 21 Sep 2026 02:10:02 +0000</pubDate>
      <link>https://dev.to/zackary_lvseth_d494d598e/fliproom-a-room-changeover-is-a-content-problem-1kj7</link>
      <guid>https://dev.to/zackary_lvseth_d494d598e/fliproom-a-room-changeover-is-a-content-problem-1kj7</guid>
      <description>&lt;p&gt;Built for &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path Two&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Fliproom turns a room changeover into an ordered, visual checklist. A volunteer selects the current layout and the next one, then sees what stays, what moves, and what goes into storage.&lt;/p&gt;

&lt;p&gt;The demonstration is a fictional community hall called The Commons: a 12-by-8-metre room with eight pieces of equipment and three layouts—Workshop, Presentation, and Open floor. The room and its content were created for this application. They do not represent a real venue or customer deployment.&lt;/p&gt;

&lt;p&gt;The interface shows numbered furniture on a floor plan, before/after views, and a move list connected to the same equipment. Dependencies keep a step locked until its destination has been cleared. If two items exchange positions, the planner can introduce a temporary parking step. Checkmarks survive a browser reload; changing layouts starts a fresh checklist. A text download lets someone carry the instructions away from the screen.&lt;/p&gt;

&lt;p&gt;This is a deliberately small planning aid. It checks rectangular footprints and room bounds, not carrying routes, lifting arrangements, or venue safety. It assumes outside storage is available when in-room parking will not fit. Its time estimates are fixed per equipment operation, not measured results.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Public application:&lt;/strong&gt; &lt;a href="https://zackaryloevseth.github.io/fliproom/" rel="noopener noreferrer"&gt;Try Fliproom&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fif650fxbmldy7css0fbj.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%2Fif650fxbmldy7css0fbj.png" alt="Fliproom's floor plan and ordered room-changeover checklist" width="799" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Start with Workshop → Presentation. Compare the floor views, inspect the numbered moves, and complete the prerequisites for a blocked step. Then undo a prerequisite and watch its dependent checkmark clear. Reverse the changeover or select Open floor to produce another plan.&lt;/p&gt;

&lt;p&gt;No login is needed. The deployed demo loaded published Sanity content and displayed a ready plan without browser errors. Local checks also inspected the downloaded seven-move checklist and found no horizontal overflow at a 390px viewport.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/ZackaryLoevseth/fliproom" rel="noopener noreferrer"&gt;Fliproom on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source revision:&lt;/strong&gt; &lt;a href="https://github.com/ZackaryLoevseth/fliproom/commit/88ad48288fb6e5c656b75ef9f3ad7f3d40441079" rel="noopener noreferrer"&gt;88ad482&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The MIT-licensed application uses Next.js, TypeScript, React, and Sanity. The public planner is hosted on GitHub Pages. It makes no model calls at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Build Process
&lt;/h2&gt;

&lt;p&gt;Codex was the development environment. AI agents designed and wrote the implementation, reviewed the code, ran the tests, and drafted this post. My role was account signup/sign-in and approval of the project, fictional content import, source release, and demo publication. The technical work and checks described here were performed by the agents.&lt;/p&gt;

&lt;p&gt;The brief was to build a useful application whose behavior depends on structured content. The key decision was to derive moves from layouts rather than author a second set of instructions. An equipment document owns its dimensions; every layout references it. The planner then compares placements and produces instructions from that shared model.&lt;/p&gt;

&lt;p&gt;The work was divided among the interface, planning engine, and Sanity integration, with another agent reviewing the results. Three problems made that review worthwhile.&lt;/p&gt;

&lt;p&gt;First, a move from 90° back to 0° originally omitted the target orientation in its text. The floor diagram could be correct while the printable instruction was incomplete. Move labels now state the absolute target orientation, and a regression test covers that transition.&lt;/p&gt;

&lt;p&gt;Second, subtitles were optional in Studio but required by the read validator. Clearing a subtitle could therefore break an otherwise valid catalog. The GROQ projection now turns an omitted subtitle into empty text. A test evaluates the actual query against the seed documents, rather than checking a separate approximation of the query.&lt;/p&gt;

&lt;p&gt;Third, authenticated success concealed a public-access failure. Studio imported 12 documents and reread 12 exact matches, but an anonymous count returned zero. The generated IDs contained dots and landed on private document paths. The generator now uses hyphenated IDs, with a regression test. After reimport, a separate unauthenticated check read all 12 public documents and confirmed that both the raw documents and resolved GROQ catalog exactly matched the reviewed seed. The authenticated receipt and public-read check answered different questions; both were needed.&lt;/p&gt;

&lt;p&gt;The local suite passes 21 tests, and typechecking passes. Tests replay all nine sample-layout transitions, check collisions and final positions, and exercise parking, rotation, invalid inputs, dependent undo, and GROQ reference resolution. Production and static-export builds passed. Browser checks with live Sanity content verified that saved progress restored after reload, prerequisites unlocked step 6, and undoing a prerequisite cleared and disabled it. No console errors or warnings were reported in that check.&lt;/p&gt;

&lt;p&gt;No full agent session or private conversation context has been exported. The application content and this writeup are confined to this build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Project:&lt;/strong&gt; &lt;code&gt;fliproom&lt;/code&gt; — &lt;code&gt;i5bjg9lg&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dataset:&lt;/strong&gt; &lt;code&gt;production&lt;/code&gt;, publicly readable. An unauthenticated check verified 12 published documents: one room, eight equipment items, and three layouts.&lt;/p&gt;

&lt;p&gt;The content model separates rooms, equipment, and layouts. Placements reference equipment and store coordinates and orientation; layouts reference their room. GROQ resolves those relationships into the planner's input. Tests reject unresolved references and equipment belonging to another room.&lt;/p&gt;

&lt;p&gt;Sanity Studio runs locally for authenticated editing; the GitHub Pages demo exposes only the public planner. Invalid published content produces a catalog error instead of silently substituting demonstration data. Checklist progress stays in the visitor's browser and does not write completed work to Sanity. The app does not use the App SDK or Sanity Workflows.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
