mcpField
C
clerk-vue-patterns

clerk-vue-patterns

github.com/clerkDevelopment8914.1k installsUpdated today
Repository

About clerk-vue-patterns

A reference skill for coding agents using `@clerk/vue` v2+ with Vue 3. It describes Clerk composables and patterns for Vue Router guards and Pinia integration, with Nuxt directed to a separate skill.

Key features

  1. 01Documents auth and user composables
  2. 02Covers organization composables
  3. 03Guides Vue Router navigation guards
  4. 04Explains Pinia auth-state integration
  5. 05Distinguishes Vue from Nuxt usage

Use cases

  1. 01Read reactive sign-in state in Vue
  2. 02Guard Vue Router navigation
  3. 03Connect Clerk auth state to Pinia

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/clerk/skills --skill clerk-vue-patterns

After installing, type/clerk-vue-patternsin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

evals/
evals.json
references/
composables.md
pinia-integration.md
vue-router-guards.md
templates/vue-basic-auth/
index.html
package.json
vite.config.ts
templates/vue-basic-auth/src/
App.vue
main.ts
style.css

Details

From the project README

Vue Patterns

SDK: @clerk/vue v2+ (Vue 3). For Nuxt, use clerk-nuxt-patterns.

What Do You Need?

TaskReference
Composables: useAuth, useUser, useOrganizationreferences/composables.md
Vue Router navigation guardsreferences/vue-router-guards.md
Pinia store with auth statereferences/pinia-integration.md

Mental Model

Vue uses composables from @clerk/vue:

  • useAuth() — reactive isSignedIn, userId, signOut
  • useUser() — reactive user object
  • useClerk() — full Clerk instance for advanced operations
  • useOrganization() — reactive organization, membership

Setup

Vue (Plain)
// main.ts
import { clerkPlugin } from '@clerk/vue'
import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)
app.use(clerkPlugin, {
  publishableKey: import.meta.env.VITE_CLERK_PUBLISHABLE_KEY,
})
app.mount('#app')

Composables Usage

<script setup lang="ts">
import { useAuth, useUser } from '@clerk/vue'

const { isSignedIn, userId, signOut } = useAuth()
const { user } = useUser()
</script>

<template>
  <div v-if="isSignedIn">
    <p>Hello {{ user?.firstName }}</p>
    <button @click="signOut()">Sign Out</button>
  </div>
  <SignInButton v-else />
</template>

Org Switching

<script setup lang="ts">
import { useOrganizationList } from '@clerk/vue'

const { userMemberships, setActive } = useOrganizationList()
</script>

<template>
  <button
    v-for="mem in userMemberships.data ?? []"
    :key="mem.organization.id"
    @click="setActive({ organization: mem.organization.id })"
  >
    {{ mem.organization.name }}
  </button>
</template>

Common Pitfalls

SymptomCauseFix
Composables return undefinedNot inside ClerkProvider treeEnsure app.use(clerkPlugin, { publishableKey }) is called
userId reactive but not updatingDestructuring loses reactivityUse const { userId } = useAuth() (toRefs-style composable, reactive)

Import Map

WhatImport
Composables@clerk/vue
Plugin setup@clerk/vue
Components@clerk/vue

See Also

  • clerk-setup - Initial Clerk install
  • clerk-custom-ui - Custom flows & appearance
  • clerk-orgs - B2B organizations

Docs

Comments

Markdown supported