| name | stacks-browser |
| description | Use when working with browser/frontend functionality in Stacks — the useAuth composable (login, register, logout, token management), Stripe billing utilities (loadCardElement, confirmPayment), the API fetch client, browser model loading, or auto-imported browser utilities. Covers @stacksjs/browser. |
| license | MIT |
| compatibility | Bun >= 1.3.0, TypeScript |
| allowed-tools | Read Edit Write Bash Grep Glob |
Stacks Browser
Frontend/browser utilities for STX applications.
Key Paths
- Core package:
storage/framework/core/browser/src/
- Auto-imports:
storage/framework/browser-auto-imports.json
Authentication Composable (useAuth)
const { user, isAuthenticated, login, register, logout, token, errors, loading } = useAuth()
await login({ email: 'user@example.com', password: 'secret' })
await register({ email: 'new@example.com', password: 'secret', name: 'John' })
await logout()
authGuard()
authGuard({ guest: true })
API Client (Fetch)
import { Fetch, initApi } from '@stacksjs/browser'
initApi({ baseUrl: '/api', onUnauthorized: () => router.push('/login') })
const users = await Fetch.get('/users')
await Fetch.post('/users', { name: 'John' })
await Fetch.patch('/users/1', { name: 'Jane' })
await Fetch.put('/users/1', data)
await Fetch.destroy('/users/1')
Fetch.setToken('bearer-token')
Stripe Billing (Browser-Side)
import { loadCardElement, loadPaymentElement, confirmCardSetup, confirmCardPayment, confirmPayment, createPaymentMethod } from '@stacksjs/browser'
const cardElement = await loadCardElement(clientSecret)
const paymentElement = await loadPaymentElement(clientSecret)
const { paymentIntent, error } = await confirmCardPayment(clientSecret, elements)
const { setupIntent, error } = await confirmCardSetup(clientSecret, elements)
const { paymentIntent, error } = await confirmPayment(elements)
const { paymentIntent, error } = await createPaymentMethod(elements)
Browser Model Loading
import { loadBrowserModels, getBrowserModel, getBrowserModelNames } from '@stacksjs/browser'
await loadBrowserModels()
const User = getBrowserModel('User')
const names = getBrowserModelNames()
Browser Query Builder
import { browserQuery, BrowserQueryBuilder, browserAuth, createBrowserModel, createBrowserDb } from '@stacksjs/browser'
const users = await browserQuery('users').where('active', true).get()
const db = createBrowserDb({ baseUrl: '/api' })
Utility Functions
useDateFormat(date, 'YYYY-MM-DD')
useNow()
formatAreaSize(sqMeters)
formatDistance(miles)
formatElevation(feet)
formatDuration(seconds)
getRelativeTime(dateString)
fetchData(fetcher, { onError, fallback })
random(size?)
customAlphabet(alphabet, size)
createRegExp(pattern)
retry(fn, { retries: 3, initialDelay: 100, backoffFactor: 2 })
sleep(ms), wait(ms), delay(ms)
waitUntil(condition, { interval, timeout })
waitWhile(condition, options)
createSingletonPromise(fn)
createControlledPromise()
createPromiseLock()
Guards
notNullish(v) — type guard for non-null/undefined
noNull(v) — excludes null
notUndefined(v) — excludes undefined
isTruthy(v) — excludes falsy values
Auto-Initialization
autoInit()
Re-exports from Composables
useDark, useFetch, useOnline, useStorage, useToggle, useDateFormat, useNow, usePreferredDark
Gotchas
- All browser utilities are auto-imported in STX templates
initApi() must be called before using Fetch
loadCardElement() requires Stripe.js to be loaded
publishableKey must be set for Stripe integration
- Browser models use a different query builder than server-side models
autoInit() exposes utilities on window.StacksBrowser
- Do NOT use
document.*, window.* directly in STX templates