Browser applications
Use @tagna/udiot/browser for browser-oriented components, state, observables,
forms, routing, in-memory events and micro-frontends. Use
@tagna/udiot/database/browser for its separately configured client integrations.
Do not assume root, Node, server, database-server or AI-provider imports are
safe to bundle into a browser application.
State example
import assert from 'node:assert/strict';
import { createStore } from '@tagna/udiot/browser';
const store = createStore({ count: 0 }, (state, action) =>
action.type === 'increment' ? { count: state.count + 1 } : state,
);
await store.dispatch({ type: 'increment' });
assert.equal(store.getState().count, 1);
The assertion runs in Node as a logic test. In your browser app remove the Node assert import and connect subscriptions to your view, cleaning them up on unmount. This example is not a DOM/browser compatibility test.
Build and security
Use a bundler with moduleResolution: Bundler; see
TypeScript setup. Verify decorator metadata
support if using implicit constructor injection. Inspect built assets for Node
built-ins, server packages, development tooling and secrets.
Keep private provider keys, service-role credentials and server authorization logic on the server. A public client configuration is not proof that access controls are configured correctly. Validate requests server-side.
Browser/component/MFE surfaces remain experimental. Selected packed smoke tests
cover Chromium, Firefox and WebKit, not every feature or version. Test your
application's navigation, DOM lifecycle, cleanup, persistence and network failure
behavior. Root UI helpers are not all re-exported by /browser; use the
export inventory to check a particular symbol.
See the browser safety contract, micro-frontends, forms and hydration boundaries.