diff --git a/docs/src/js/classes/BranchContents.md b/docs/src/js/classes/BranchContents.md
new file mode 100644
index 000000000..47339d7ab
--- /dev/null
+++ b/docs/src/js/classes/BranchContents.md
@@ -0,0 +1,43 @@
+[**@lancedb/lancedb**](../README.md) • **Docs**
+
+***
+
+[@lancedb/lancedb](../globals.md) / BranchContents
+
+# Class: BranchContents
+
+## Constructors
+
+### new BranchContents()
+
+```ts
+new BranchContents(): BranchContents
+```
+
+#### Returns
+
+[`BranchContents`](BranchContents.md)
+
+## Properties
+
+### manifestSize
+
+```ts
+manifestSize: number;
+```
+
+***
+
+### parentBranch?
+
+```ts
+optional parentBranch: string;
+```
+
+***
+
+### parentVersion
+
+```ts
+parentVersion: number;
+```
diff --git a/docs/src/js/classes/Branches.md b/docs/src/js/classes/Branches.md
new file mode 100644
index 000000000..ea4d72f07
--- /dev/null
+++ b/docs/src/js/classes/Branches.md
@@ -0,0 +1,90 @@
+[**@lancedb/lancedb**](../README.md) • **Docs**
+
+***
+
+[@lancedb/lancedb](../globals.md) / Branches
+
+# Class: Branches
+
+Branch manager for a [Table](Table.md).
+
+Unlike tags, `create` and `checkout` return a new [Table](Table.md) handle scoped
+to the branch; writes on it do not affect `main`.
+
+## Methods
+
+### checkout()
+
+```ts
+checkout(name): Promise
+```
+
+Check out an existing branch and return a handle scoped to it.
+
+#### Parameters
+
+* **name**: `string`
+
+#### Returns
+
+`Promise`<[`Table`](Table.md)>
+
+***
+
+### create()
+
+```ts
+create(
+ name,
+ fromRef?,
+ fromVersion?): Promise
+```
+
+Create a branch and return a handle scoped to it.
+
+#### Parameters
+
+* **name**: `string`
+ Name of the new branch.
+
+* **fromRef?**: `string`
+ Source branch to fork from. Defaults to `main`.
+
+* **fromVersion?**: `number`
+ A specific version on `fromRef`. Defaults to latest.
+
+#### Returns
+
+`Promise`<[`Table`](Table.md)>
+
+***
+
+### delete()
+
+```ts
+delete(name): Promise
+```
+
+Delete a branch.
+
+#### Parameters
+
+* **name**: `string`
+
+#### Returns
+
+`Promise`<`void`>
+
+***
+
+### list()
+
+```ts
+list(): Promise>
+```
+
+List all branches, mapping name to branch metadata.
+
+#### Returns
+
+`Promise`<`Record`<`string`, [`BranchContents`](BranchContents.md)>>
diff --git a/docs/src/js/classes/Table.md b/docs/src/js/classes/Table.md
index 1675f2c93..a7a4dfafc 100644
--- a/docs/src/js/classes/Table.md
+++ b/docs/src/js/classes/Table.md
@@ -110,6 +110,23 @@ containing the new version number of the table after altering the columns.
***
+### branches()
+
+```ts
+abstract branches(): Promise
+```
+
+Get the branch manager for this table.
+
+Branches are isolated, writable lines of history forked from another
+branch (or version). Writes on a branch do not affect `main`.
+
+#### Returns
+
+`Promise`<[`Branches`](Branches.md)>
+
+***
+
### checkout()
```ts
diff --git a/docs/src/js/globals.md b/docs/src/js/globals.md
index 7d26fd75b..3efa3a360 100644
--- a/docs/src/js/globals.md
+++ b/docs/src/js/globals.md
@@ -19,6 +19,8 @@
- [BooleanQuery](classes/BooleanQuery.md)
- [BoostQuery](classes/BoostQuery.md)
+- [BranchContents](classes/BranchContents.md)
+- [Branches](classes/Branches.md)
- [Connection](classes/Connection.md)
- [HeaderProvider](classes/HeaderProvider.md)
- [Index](classes/Index.md)
diff --git a/nodejs/lancedb/index.ts b/nodejs/lancedb/index.ts
index f4f724e8a..c74cf1caa 100644
--- a/nodejs/lancedb/index.ts
+++ b/nodejs/lancedb/index.ts
@@ -38,6 +38,7 @@ export {
FragmentSummaryStats,
Tags,
TagContents,
+ BranchContents,
MergeResult,
AddResult,
AddColumnsResult,
@@ -111,6 +112,7 @@ export {
export {
Table,
+ Branches,
AddDataOptions,
UpdateOptions,
OptimizeOptions,
diff --git a/nodejs/lancedb/table.ts b/nodejs/lancedb/table.ts
index 10b486bf9..fce768f74 100644
--- a/nodejs/lancedb/table.ts
+++ b/nodejs/lancedb/table.ts
@@ -1260,15 +1260,19 @@ export interface FieldMetadataUpdate {
* to the branch; writes on it do not affect `main`.
*/
export class Branches {
- private readonly inner: NativeBranches;
+ #inner: NativeBranches;
+ /**
+ * Construct a Branches manager. Internal use only.
+ * @hidden
+ */
constructor(inner: NativeBranches) {
- this.inner = inner;
+ this.#inner = inner;
}
/** List all branches, mapping name to branch metadata. */
async list(): Promise> {
- return await this.inner.list();
+ return await this.#inner.list();
}
/**
@@ -1283,16 +1287,16 @@ export class Branches {
fromRef?: string,
fromVersion?: number,
): Promise {
- return new LocalTable(await this.inner.create(name, fromRef, fromVersion));
+ return new LocalTable(await this.#inner.create(name, fromRef, fromVersion));
}
/** Check out an existing branch and return a handle scoped to it. */
async checkout(name: string): Promise {
- return new LocalTable(await this.inner.checkout(name));
+ return new LocalTable(await this.#inner.checkout(name));
}
/** Delete a branch. */
async delete(name: string): Promise {
- return await this.inner.delete(name);
+ return await this.#inner.delete(name);
}
}