All skills
clerk avatar

/clerk-nuxt-patterns

@ca5e365 official
by clerkclerk/skills83 stars
5

Nuxt 3 auth patterns with @clerk/nuxt - middleware, composables, server API routes, SSR. Triggers on: Nuxt auth, useAuth composable, clerkMiddleware Nuxt, server API Clerk, Nuxt route protection.

Use this Skill: https://skilld.dev/gh/clerk/skills/clerk-nuxt-patterns

This session only. Nothing lands on disk.

referencescomposables.md

≈487 tokens on demand. Your agent reads this file only when SKILL.md points to it.

Composables (HIGH)

All composables are auto-imported by @clerk/nuxt — no import statements needed in <script setup>.

useAuth()

Returns reactive auth state and helpers:

<script setup lang="ts">
const { isSignedIn, isLoaded, userId, sessionId, orgId, orgRole, orgSlug } = useAuth()
</script>

<template>
  <div v-if="!isLoaded">Loading...</div>
  <div v-else-if="!isSignedIn">Please sign in</div>
  <div v-else>Hello {{ userId }}</div>
</template>

useUser()

Returns the full user object with profile data:

<script setup lang="ts">
const { isLoaded, isSignedIn, user } = useUser()
</script>

<template>
  <div v-if="isLoaded && isSignedIn">
    <img :src="user.imageUrl" :alt="user.fullName" />
    <p>{{ user.firstName }} {{ user.lastName }}</p>
    <p>{{ user.emailAddresses[0]?.emailAddress }}</p>
  </div>
</template>

useClerk()

Access the Clerk instance for programmatic actions:

<script setup lang="ts">
const clerk = useClerk()

function handleSignOut() {
  clerk.signOut()
}

function openProfile() {
  clerk.openUserProfile()
}
</script>

useSignIn() / useSignUp()

For custom auth flows:

<script setup lang="ts">
const { signIn, setActive } = useSignIn()

async function handleLogin(email: string, password: string) {
  const result = await signIn.create({
    identifier: email,
    password,
  })

  if (result.status === 'complete') {
    await setActive({ session: result.createdSessionId })
    navigateTo('/dashboard')
  }
}
</script>

Ref vs Value

Composables return Ref<T> values. Access with .value in <script setup> but NOT in templates:

<script setup lang="ts">
const { isSignedIn, userId } = useAuth()
// In script: isSignedIn.value, userId.value
</script>

<template>
  <!-- In template: no .value needed -->
  <div v-if="isSignedIn">{{ userId }}</div>
</template>

Docs

Source: SKILL.md on GitHub

No alerts16d4 checks · Risk SAFE
  • Gen Agent Trust Hub16d

    The skill provides legitimate Nuxt 3 authentication patterns using the official Clerk SDK. All code snippets, configurations, and dependencies follow established best practices for secure application development.

  • Socket16d

    No alerts

  • Snyk16d

    Risk: LOW · No issues

  • ZeroLeaks5mo

    Score: 93/100 · 2 sections analyzed

Signed by skilld at ca5e365. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub yesterday.

Activeupdated 6 months ago
What it can do
Network
metadata
{
  "author": "clerk",
  "version": "1.0.0"
}
All 1 allowed tools
WebFetch
  • Nuxt
  • Auth
  • clerk
  • authentication
  • middleware
  • ssr
  • composables
  • nitro

README badge

README badge for clerk/skills/clerk-nuxt-patterns

Provides Nuxt 3 patterns for Clerk authentication, covering route protection with middleware, server API routes via Nitro, and client-side composables like useAuth and useUser. Includes SSR-safe patterns and organization-aware auth flows using @clerk/nuxt.

Generated from the current SKILL.md.

Does this skill work with Nuxt 3?
Yes. The skill covers Nuxt 3 patterns specifically, including auto-imports, composables, and the Nitro server runtime.
How do I protect routes from unauthenticated users?
Add `definePageMeta({ middleware: 'auth' })` to your page component. The `@clerk/nuxt` module auto-registers the auth middleware.
Can I use useAuth in server API routes?
No. useAuth is client-only. Use `event.context.auth` in Nitro server routes instead, or import `clerkClient` from `@clerk/nuxt/server`.
What causes hydration mismatches with auth state?
Rendering auth state before the component mounts. Fix this by wrapping sensitive content in `<ClientOnly>` or checking `isLoaded` before rendering.
How do I set up environment variables?
Use `NUXT_PUBLIC_CLERK_PUBLISHABLE_KEY` for the public key and `NUXT_CLERK_SECRET_KEY` for the secret key in your `.env` file.

Generated from the current SKILL.md. These answers refresh after source changes.