<script> import data from '$data' let todos = $state([]) let loading = $state(true) // Subscribe to realtime updates data.todos.subscribe(items => { todos = items loading = false })</script>{#if loading} <p>Loading...</p>{:else} {#each todos as todo (todo.id)} <p>{todo.title}</p> {/each}{/if}
// Create a new recordawait data.todos.create({ title: 'Buy groceries', completed: false})// Update a record by IDawait data.todos.update('abc123', { completed: true})// Delete a record by IDawait data.todos.delete('abc123')
All operations trigger realtime updates—any subscribed component will update automatically.
<script> import content from '$content'</script><h1>{content.hero_title}</h1><p>{content.hero_description}</p><button>{content.cta_button_text}</button>
Content field names are automatically converted to snake_case:
<script> import data from '$data' let todos = $state([]) let show_completed = $state(false) // Use $derived.by() for callbacks/filters let visible_todos = $derived.by(() => todos.filter(t => show_completed || !t.completed) ) // Use [...] spread before sort (sort mutates the array) let sorted_todos = $derived.by(() => [...visible_todos].sort((a, b) => a.created - b.created) )</script>
Common mistake: $derived(todos.filter(...)) won’t work. Use $derived.by(() => todos.filter(...)) for callbacks.