diff --git a/browsers/location.mdx b/browsers/location.mdx
new file mode 100644
index 00000000..4c7c9425
--- /dev/null
+++ b/browsers/location.mdx
@@ -0,0 +1,127 @@
+---
+title: "Browser Location"
+description: "Set a browser session's timezone and locale, or use the defaults for its region"
+---
+
+Each browser session has one timezone and one formatting locale. By default, both come from the [region](/browsers/regions) the browser runs in, for example `America/New_York` and `en-US` for a browser in `us-east`. Set either field to override it for the session.
+
+The setting applies across browser contexts, pages, frames, workers, `Intl`, `navigator.language`, `navigator.languages`, and future `Accept-Language` headers. Updating it doesn't restart Chromium or reload pages.
+
+
+Location controls timezone and language behavior. It doesn't set geolocation coordinates, grant geolocation permission, change the system clock, translate browser UI, or guarantee a bot-detection outcome. KERNEL doesn't derive location from a browser's proxy; to match a proxy's country, set the location explicitly.
+
+
+## Set location when creating a browser
+
+Set either field independently. An omitted field uses the default for the browser's region.
+
+
+```typescript TypeScript
+import Kernel from '@onkernel/sdk';
+
+const kernel = new Kernel();
+const browser = await kernel.browsers.create({
+ location: {
+ timezone: 'Europe/Berlin',
+ locale: 'de-DE',
+ },
+});
+
+console.log(browser.location);
+```
+
+```python Python
+from kernel import Kernel
+
+kernel = Kernel()
+browser = kernel.browsers.create(
+ location={
+ "timezone": "Europe/Berlin",
+ "locale": "de-DE",
+ },
+)
+
+print(browser.location)
+```
+
+
+`timezone` accepts IANA identifiers such as `America/Los_Angeles`. `locale` accepts BCP 47 tags such as `en-US` or `de-DE` that the browser formats dates and numbers for with that exact region. KERNEL normalizes spelling and deprecated codes, so `en-us` becomes `en-US` and `iw-IL` becomes `he-IL`. KERNEL validates the complete request before changing the session and returns a `400` with code `invalid_browser_location` for an unsupported value such as `en-QQ`.
+
+## Update a running browser
+
+Use `browsers.update()` to set an override without restarting Chromium:
+
+
+```typescript TypeScript
+const browser = await kernel.browsers.update('01j8m3w6q2d7av9n5k4f1p8c', {
+ location: {
+ timezone: 'America/Los_Angeles',
+ locale: 'en-US',
+ },
+});
+```
+
+```python Python
+browser = kernel.browsers.update(
+ "01j8m3w6q2d7av9n5k4f1p8c",
+ location={
+ "timezone": "America/Los_Angeles",
+ "locale": "en-US",
+ },
+)
+```
+
+
+PATCH semantics are field-specific:
+
+- omit `location` or one of its fields to leave that field unchanged
+- set a string to create or replace a session override
+- set a field to `null` in TypeScript or `None` in Python to clear that override and return to the default for the browser's region
+
+
+```typescript TypeScript
+const browser = await kernel.browsers.update('01j8m3w6q2d7av9n5k4f1p8c', {
+ location: {
+ timezone: null,
+ },
+});
+```
+
+```python Python
+browser = kernel.browsers.update(
+ "01j8m3w6q2d7av9n5k4f1p8c",
+ location={"timezone": None},
+)
+```
+
+
+Clearing one field doesn't clear the other. Overrides stay in place when you change the browser's proxy.
+
+## Read effective location
+
+Browser responses include the effective values, where each came from, and convergence state:
+
+```json
+{
+ "location": {
+ "timezone": "America/Los_Angeles",
+ "locale": "en-US",
+ "timezone_source": "override",
+ "locale_source": "metro",
+ "pending": false
+ }
+}
+```
+
+`timezone_source` and `locale_source` are `override` for a value set on the session and `metro` for the default of the browser's region. The fields are independent, so their sources can differ.
+
+When `pending` is `true`, the API has accepted the change but the running browser hasn't finished applying it. Browser creation doesn't wait for it.
+
+## Runtime behavior
+
+- New pages, frames, workers, and network contexts start with the latest applied values.
+- Existing pages and workers receive the update without a reload.
+- Existing `Intl` formatter objects and application-level caches can retain values captured before the update. Create a new formatter when you need the latest default.
+- Future requests use the updated language preference. Requests already in flight aren't rewritten.
+- Customer CDP emulation remains separate from the session default and can temporarily override what a particular target reports.
+- Location overrides last only for the browser session. Profiles don't save them, and a browser returned to a pool loses them before its next lease.
diff --git a/introduction/configure.mdx b/introduction/configure.mdx
index c0b41925..bf791a33 100644
--- a/introduction/configure.mdx
+++ b/introduction/configure.mdx
@@ -91,6 +91,7 @@ browser = kernel.browsers.create(
Often agents don't require these, but they're there when you do:
- **[Regions](/browsers/regions):** run browsers in `us-east`, `eu-west`, or `ap-southeast`, closer to your code and your users.
+- **[Location](/browsers/location):** set the browser's timezone and locale for the session without restarting Chromium; otherwise they follow the browser's region.
- **[Extensions](/browsers/extensions):** load unpacked Chrome extensions into a browser.
- **[Chrome policies](/browsers/chrome-policies):** apply Chrome enterprise policies, such as startup pages and bookmarks.
- **[Private networking](/browsers/private-networking):** reach services behind a VPN or tunnel from inside the browser session.