page Tutorial {
  seo {
    title = "Tutorial"
    description = "Build a secure task application with WRNexusJS preview APIs."
    canonical = "https://wrnexusjs.dev/tutorial"
  }
  view {
    <a class="skip-link" href="#main">Skip to content</a>
    <div class="docs-shell">
      <header class="topbar"><a class="brand" href="/"><span>W</span> WRNexusJS</a><nav aria-label="Primary"><a href="/getting-started">Get started</a><a href="/packages">Packages</a><a href="/language">Language</a><a href="/architecture">Architecture</a></nav><div class="topbar-actions"><a class="preview-pill" href="/access">Preview · v0.2.25</a><button data-wire-theme-toggle class="theme-button" aria-label="Toggle color theme" title="Toggle color theme">◐</button></div></header>
      <div class="mobile-doc-nav"><details><summary>Browse documentation</summary><nav><a href="/getting-started">Get started</a><a href="/packages">Packages</a><a href="/language">Language</a><a href="/architecture">Architecture</a><a href="/tutorial">Tutorial</a><a href="/guides/project-structure">Guides</a><a href="/examples">Examples</a><a href="/search">Search</a></nav></details></div>
      <main id="main" class="portal-main"><nav class="breadcrumbs" aria-label="Breadcrumb"><a href="/">Home</a><span aria-hidden="true">/</span><span>Documentation</span><span aria-hidden="true">/</span><span aria-current="page">Tutorial</span></nav><article class="documentation prose standalone"><span class="status status-beta">Preview · runnable-project extraction pending</span><h1>Secure task board</h1><p>This tutorial connects the installed 0.2.25 APIs into one design. Snippets are limited to declarations and README patterns verified in the installed packages; a CI-compiled standalone fixture remains on the roadmap.</p><h2>Application shape</h2><p>A <code>.wrn</code> page renders tasks from an SSR API binding. A shared validation schema protects mutations. Session middleware identifies users, authorization policies gate updates, and a realtime room broadcasts changes.</p><h2>Schema and create route</h2><pre><code>import &#123; v, parseBody &#125; from "@wrnexus/validation";
const task = v.object(&#123; title: v.string().trim().min(3).max(120) &#125;);
export const POST = async (ctx) =&gt; &#123;
  const parsed = await parseBody(task, ctx.req);
  if (!parsed.ok) return parsed.response;
  return Response.json(&#123; ok: true, task: parsed.value &#125;, &#123; status: 201 &#125;);
&#125;;</code></pre><h2>Server-rendered list</h2><pre><code>page Tasks &#123;
  ssr &#123; api tasks GET /api/tasks &#123; return tasks &#125; &#125;
  view &#123;
    &lt;main&gt;&lt;h1&gt;Tasks&lt;/h1&gt;&lt;ul&gt;
      &#123;#each tasks as task&#125;&lt;li&gt;&#123;task.title&#125;&lt;/li&gt;&#123;:empty&#125;&lt;li&gt;No tasks yet.&lt;/li&gt;&#123;/each&#125;
    &lt;/ul&gt;&lt;/main&gt;
  &#125;
&#125;</code></pre><h2>Production checklist</h2><ul><li>Choose SQLite for local development or configure the supported PostgreSQL driver.</li><li>Run migrations before accepting traffic.</li><li>Enable session authentication and enforce authorization on every mutation.</li><li>Validate upload types and sizes; keep private objects behind authenticated routes.</li><li>Use Redis pub/sub when realtime rooms span processes.</li><li>Treat the default queue as non-durable until a production driver is selected.</li></ul><p>Follow the focused <a href="/guides/database">database</a>, <a href="/guides/authentication">authentication</a>, <a href="/guides/authorization">authorization</a>, <a href="/guides/realtime">realtime</a>, and <a href="/guides/uploads">upload</a> guides.</p></article></main>
      <footer><p><strong>WRNexusJS 0.2.25</strong> · Private Developer Preview · Bun-native</p><nav aria-label="Footer"><a href="/access">Request access</a><a href="/license">License</a><a href="/security">Security</a><a href="/support">Support</a><a href="/llms.txt">AI guide</a></nav><p>WRNexusJS is created by <a href="https://workroot.in/">WorkRoot</a>. WRNexus is a separate SaaS product.</p></footer>
    </div>
  }
}