Docs
Eidos has two jobs: keep your Save clicks safe when the network flakes, and let reads work offline. Everything else is optional.
Next: Never lose a save →npm install @sweidos/eidos# pnpm add @sweidos/eidosAdd the Vite plugin so eidos-sw.js lands in public/ on every build.
import { defineConfig } from 'vite'import { eidos } from '@sweidos/eidos/vite'
export default defineConfig({ plugins: [eidos()],})Not on Vite? Copy once: cp node_modules/@sweidos/eidos/dist/eidos-sw.js public/
import { createRoot } from 'react-dom/client'import { EidosProvider } from '@sweidos/eidos'import { App } from './App'
createRoot(document.getElementById('root')!).render( <EidosProvider swPath="/eidos-sw.js"> <App /> </EidosProvider>,)import { resource, action } from '@sweidos/eidos'import type { ActionContext } from '@sweidos/eidos'
// Read — cache this GET when offlineexport const products = resource('/api/products', { offline: true })
// Save — never lose this write; forward the ticket to your APIexport const createOrder = action( async (payload, ctx: ActionContext) => { const res = await fetch('/api/orders', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Idempotency-Key': ctx.idempotencyKey, }, body: JSON.stringify(payload), }) return res.json() }, { reliability: 'neverLose', name: 'createOrder' },)Keep resource / action at module scope so replay can find them after a reload.
const result = await createOrder({ productId: 1, qty: 2 })
if ('queued' in result) { // Offline or flaky — already saved in the pocket. Will retry. showToast(result.message)}