[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [local‑first/Evolu](https://evolu.dev/docs/api-reference/common/local-first/Evolu) › DeviceMutation

```ts
type DeviceMutation<D extends EvoluSchema, Kind extends MutationKind> = <
  TableName,
>(
  table: TableName,
  values: MutationValues<D[TableName], Kind>,
  ...options: [TableName] extends [`_${string}`]
    ? [options?: MutationOptions<ShardOwner | SharedOwner>]
    : [
        options: MutationOptions<ShardOwner | SharedOwner> & {
          owner: ShardOwner | SharedOwner;
        },
      ]
) => {
  id: InferOutput<D[TableName]["id"]>;
};
```

Defined in: [packages/common/src/local-first/Evolu.ts:2089](https://github.com/evoluhq/evolu/blob/aa223771feea747ffb1b0f5f3271574455633e37/packages/common/src/local-first/Evolu.ts#L2089)

A [Mutation](https://evolu.dev/docs/api-reference/common/local-first/Schema/type-aliases/Mutation) of a [DeviceEvolu](https://evolu.dev/docs/api-reference/common/local-first/Evolu/interfaces/DeviceEvolu). The device owner never syncs, so a
mutation of a synced table, one whose name doesn't start with `_`, takes
options with the `owner` the app syncs that table's rows with, which isn't an
AppOwner. A local-only table's rows stay on this device, so its mutations
need no owner.