> ## Documentation Index
> Fetch the complete documentation index at: https://docs.useshipd.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Architecture

> How flag changes reach your application and how local evaluation behaves during outages.

## Overview

You manage flags in the dashboard, CLI, or management API. Your application downloads an environment's configuration as a snapshot and evaluates flags locally, without a network request on each flag check.

## Manage flags

Use the dashboard to change targeting rules, enabled state, and fallthrough values. Use the CLI to sync flag definitions from code, or the [management API](/reference/control-plane-api) to automate supported operations. Changes publish automatically; you do not need a separate publish step.

Organizations, projects, environments, and credentials determine who can change flags and which configuration your application receives. See [Environments](/concepts/environments), [Access control](/enterprise/access-control), and [Keys](/concepts/keys).

## Evaluate in your application

The SDK downloads a [snapshot](/concepts/snapshots) for the environment bound to its SDK key from `https://edge.useshipd.com`. Each flag check uses that local snapshot and the evaluation context you provide.

* Flag checks do not wait for the dashboard or API.
* Rules can use only the snapshot and evaluation context available to the SDK.
* Percentage rollouts assign the same bucket for the same flag key and bucket attribute.

See [Local evaluation](/concepts/local-evaluation) for startup defaults, caching, and fallback behavior.

## Receive changes

SDKs poll for updated snapshots. TypeScript SDKs can also enable realtime updates with `stream: true`: an update notification triggers a snapshot refresh rather than waiting for the next poll.

Streaming needs a WebSocket implementation. Node.js 20 callers supply the `WebSocket` option; browsers and Node.js 22+ provide one. See [SDK reference](/reference/sdk#createclient).

With a positive `refreshIntervalMs`, polling continues if streaming is unavailable. With `refreshIntervalMs: 0`, the client keeps its last good snapshot until a manual refresh or another update notification. Go uses polling.

## Handle service interruptions

If a refresh fails, SDKs keep evaluating with their last good snapshot. Before a snapshot loads, they use configured defaults or supported bootstrap/cache options. Changes made during an interruption reach your application after a successful refresh.

See [What happens if shipd is down?](/concepts/local-evaluation#what-happens-if-shipd-is-down) and [Troubleshooting](/resources/troubleshooting).

## Understand data sharing

Evaluation runs locally. SDKs can also send evaluation and identify events; those are separate from flag checks. Review [Identify users](/flags/identify-users) and the [Edge API](/reference/edge-api) for event contents and behavior. Disable event delivery with `events: false` in TypeScript or `DisableEvents: true` in Go.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.