remote-functions
Use when building, auditing, or reviewing SvelteKit remote functions for validation, batching, and optimistic UI patterns
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Remote Functions
Quick Start
/// file: src/routes/counter/count.remote.ts
import * as v from 'valibot'
import { query, command } from '$app/server'
let count = 0
export const getCount = query(async () => count)
export const increment = command(
v.object({ delta: v.optional(v.number(), 1) }),
async ({ delta = 1 }) => {
count += delta
getCount().set(count) // keep cached query in sync without extra fetch
},
)
Trigger optimistic single-flight updates via
increment({ delta: 1 }).updates(getCount().withOverride((n = 0) => n + 1))
inside the component.
Core Principles
- Validate every argument with a Standard Schema; use
getRequestEventfor auth/cookies but never treatroute/params/urlas an authorization boundary. - Queries are cached promises — refresh,
set, orwithOverridethem explicitly from commands/forms to prevent stale UI and redundant roundtrips.
Common Patterns
Single-flight optimistic mutations
Pair a command/form with its sibling query: perform the
mutation, then call query.refresh()/set() or
.updates(query.withOverride(...)) so the UI updates once per
request, even with high latency.
Reference Files
For detailed documentation, see:
Notes
- Prefer
formfor progressive enhancement; reservecommandfor imperative or cross-component workflows. - Use
query.batchfor n+1 scenarios (e.g., weather demo) andprerender({ inputs, dynamic })for data that should be cached at build time yet remain opt-in for runtime refreshes.
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-26
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!