Skip to main content
Documentation
StartOverviewArchitectureAuthenticationSend your first message
TypeScript SDKOverviewTrusted app serverApp-user clientsRealtimeErrors & webhooks
Flutter SDKOverviewInstallationAuthenticationChannels & messagesOffline & syncRealtimeUI componentsPush & lifecycle
ConceptsTenancy & scopeChannels & messagesDelivery & reconciliationSecurity checklist
ProtocolsRealtimeSigned webhooks
ReferenceREST APIErrors, limits & retriesDeploy docs to Coolify
VV ChatDocs API v1
Recommended starting points
Build chat without rebuilding infrastructureV Chat is a multi-tenant messaging backend with typed server, web, and Flutter integration paths.StartArchitecture at a glanceUnderstand the control plane, data plane, realtime path, and SDK boundaries before integrating.StartAuthentication and credentialsSelect the correct credential for dashboard, trusted-server, app-user, realtime, and webhook flows.StartSend your first messageUse the trusted TypeScript server client to create the minimum safe messaging flow.StartTypeScript SDK overviewChoose the correct typed client for trusted servers, app users, dashboard sessions, realtime, and webhooks.TypeScript SDKTrusted app-server clientUse AppServerClient from a protected backend to manage data-plane resources and mint app-user tokens.TypeScript SDKApp-user clientsBuild browser or Node app-user flows with VChatClient or the lower-level AppUserClient.TypeScript SDK
↑↓ Navigate↵ Openesc Close
API reference
StartOverviewArchitectureAuthenticationSend your first message
TypeScript SDKOverviewTrusted app serverApp-user clientsRealtimeErrors & webhooks
Flutter SDKOverviewInstallationAuthenticationChannels & messagesOffline & syncRealtimeUI componentsPush & lifecycle
ConceptsTenancy & scopeChannels & messagesDelivery & reconciliationSecurity checklist
ProtocolsRealtimeSigned webhooks
ReferenceREST APIErrors, limits & retriesDeploy docs to Coolify
Contract sourceOpenAPI JSON
Docs/Flutter SDK
Offline-first reads

Offline state and reconciliation

Understand what Drift persists, what remains online-only, and how recovery restores authoritative state.

Updated 2026-08-09•sdks/flutter/packages/v_chat_persistence_drift/README.md · SDK offline contracts

Persisted state

  • Confirmed scoped channel, membership, message, thread, reaction-summary, conversation, and unread entities.
  • Validated deletion tombstones and independent entity versions.
  • Bounded realtime recovery metadata, last accepted sequence, and push receipt deduplication state.
  • Scope keys that isolate environment, application, and app-user sessions.

Never persisted

  • Bearer tokens, application credentials, webhook secrets, signing keys, or cookies.
  • Pending message bodies, mutation command queues, signed attachment URLs/headers, or attachment bytes.
  • Remote cursors, connection tickets, WebSocket frames, typing state, presence state, or timers.
  • Raw server errors, arbitrary response bodies, or unbounded custom payloads outside the released schema limits.

Compose Drift with v_chat_core

dart
final store = DriftOfflineStore(executor: databaseExecutor);

final client = VChatClient(
  options: VChatClientOptions(
    appId: '00000000-0000-4000-8000-000000000001',
    apiBaseUri: Uri.parse('https://api.example.com'),
  ),
  tokenProvider: tokenProvider,
  offlineStore: store,
);

try {
  await client.connectUser(userId: 'current-user-id');
  await client.conversations.refresh();
} finally {
  await client.dispose();
}

VChatClient initializes the supplied store and assumes ownership. Do not share one store or executor across clients that can dispose independently.

Reconnect recovery

Recovery can resume from retained event history or require bounded authoritative refresh. A gap, stale subscription, or refresh_required state pauses trust in local continuity until the SDK completes the documented REST reconciliation. Recovery never replays REST mutations or typing events.

PreviousChannels, messages, and threadsNext Flutter realtime
On this pagePersisted stateNever persistedCompose Drift with v_chat_coreReconnect recovery
Report a docs issue