From d4d4f141e1ad59c65f78eccbe4433bfc740bcb32 Mon Sep 17 00:00:00 2001 From: Brian Luo <57960778+law-chain-hot@users.noreply.github.com> Date: Tue, 16 Jun 2026 17:00:57 +0800 Subject: [PATCH 1/3] feat(dashboard): drop region column from box table; full image refs in onboarding - BoxTable: remove the Region column from the desktop table and the Region entry from the compact mobile meta. The box table no longer surfaces region. - Remove the now-unused getRegionName plumbing from the box-table path (Boxes page, BoxTable, useBoxTable, columns, types) and the stale 'region' entry from persisted column visibility. useRegions/getRegionName stay in place for the other consumers (Runners, Org Settings, Box details). - onboarding-code-examples: use the fully-qualified image reference ghcr.io/boxlite-ai/boxlite-agent-base:20260605-p0-r3 across all four SDK snippets (JS/TS, Python, Go, Rust) instead of the short 'boxlite/base'. --- .../src/components/BoxTable/columns.tsx | 19 ------------------- .../src/components/BoxTable/index.tsx | 3 --- .../src/components/BoxTable/types.ts | 1 - .../src/components/BoxTable/useBoxTable.ts | 10 +++------- .../src/lib/onboarding-code-examples.ts | 8 ++++---- apps/dashboard/src/pages/Boxes.tsx | 4 ---- 6 files changed, 7 insertions(+), 38 deletions(-) diff --git a/apps/dashboard/src/components/BoxTable/columns.tsx b/apps/dashboard/src/components/BoxTable/columns.tsx index 095cec881..bc4c64281 100644 --- a/apps/dashboard/src/components/BoxTable/columns.tsx +++ b/apps/dashboard/src/components/BoxTable/columns.tsx @@ -52,7 +52,6 @@ interface GetColumnsProps { handleCreateSshAccess: (id: string) => void handleRevokeSshAccess: (id: string) => void handleRecover: (id: string) => void - getRegionName: (regionId: string) => string | undefined handleScreenRecordings: (id: string) => void } @@ -67,7 +66,6 @@ export function getColumns({ handleCreateSshAccess, handleRevokeSshAccess, handleRecover, - getRegionName, handleScreenRecordings, }: GetColumnsProps): ColumnDef[] { const handleOpenWebTerminal = async (boxId: string) => { @@ -170,23 +168,6 @@ export function getColumns({ ), accessorKey: 'state', }, - { - id: 'region', - size: 80, - enableSorting: true, - enableHiding: false, - header: ({ column }) => { - return - }, - cell: ({ row }) => { - return ( -
- {getRegionName(row.original.target) ?? row.original.target} -
- ) - }, - accessorKey: 'target', - }, { id: 'resources', size: 230, diff --git a/apps/dashboard/src/components/BoxTable/index.tsx b/apps/dashboard/src/components/BoxTable/index.tsx index 505f2d2ec..cf86809f9 100644 --- a/apps/dashboard/src/components/BoxTable/index.tsx +++ b/apps/dashboard/src/components/BoxTable/index.tsx @@ -45,7 +45,6 @@ export function BoxTable({ boxIsLoading, boxStateIsTransitioning, loading, - getRegionName, handleStart, handleStop, handleDelete, @@ -96,7 +95,6 @@ export function BoxTable({ filters, onFiltersChange, handleRecover, - getRegionName, }) const [pendingBulkAction, setPendingBulkAction] = useState(null) @@ -233,7 +231,6 @@ export function BoxTable({
- {getRegionName(box.target) ?? box.target}
diff --git a/apps/dashboard/src/components/BoxTable/types.ts b/apps/dashboard/src/components/BoxTable/types.ts index 2de1966f3..0d2b34a27 100644 --- a/apps/dashboard/src/components/BoxTable/types.ts +++ b/apps/dashboard/src/components/BoxTable/types.ts @@ -20,7 +20,6 @@ export interface BoxTableProps { boxIsLoading: Record boxStateIsTransitioning: Record loading: boolean - getRegionName: (regionId: string) => string | undefined handleStart: (id: string) => void handleStop: (id: string) => void handleDelete: (id: string) => void diff --git a/apps/dashboard/src/components/BoxTable/useBoxTable.ts b/apps/dashboard/src/components/BoxTable/useBoxTable.ts index 42a743684..9c2eb9921 100644 --- a/apps/dashboard/src/components/BoxTable/useBoxTable.ts +++ b/apps/dashboard/src/components/BoxTable/useBoxTable.ts @@ -48,7 +48,6 @@ interface UseBoxTableProps { filters: BoxFilters onFiltersChange: (filters: BoxFilters) => void handleRecover: (id: string) => void - getRegionName: (regionId: string) => string | undefined } export function useBoxTable({ @@ -71,19 +70,18 @@ export function useBoxTable({ filters, onFiltersChange, handleRecover, - getRegionName, }: UseBoxTableProps) { // Column visibility state management with persistence const [columnVisibility, setColumnVisibility] = useState(() => { const saved = getLocalStorageItem(LocalStorageKey.BoxTableColumnVisibility) if (saved) { try { - return { ...JSON.parse(saved), id: true, region: true, labels: false } + return { ...JSON.parse(saved), id: true, labels: false } } catch { - return { id: true, region: true, labels: false } + return { id: true, labels: false } } } - return { id: true, region: true, labels: false } + return { id: true, labels: false } }) useEffect(() => { @@ -107,7 +105,6 @@ export function useBoxTable({ handleCreateSshAccess, handleRevokeSshAccess, handleRecover, - getRegionName, handleScreenRecordings, }), [ @@ -121,7 +118,6 @@ export function useBoxTable({ handleCreateSshAccess, handleRevokeSshAccess, handleRecover, - getRegionName, handleScreenRecordings, ], ) diff --git a/apps/dashboard/src/lib/onboarding-code-examples.ts b/apps/dashboard/src/lib/onboarding-code-examples.ts index ba06f39e2..768a8a445 100644 --- a/apps/dashboard/src/lib/onboarding-code-examples.ts +++ b/apps/dashboard/src/lib/onboarding-code-examples.ts @@ -24,7 +24,7 @@ const rt = JsBoxlite.rest(new BoxliteRestOptions({ credential: new ApiKeyCredential(apiKey), })) -const box = await rt.create({ image: 'boxlite/base' }, 'sdk-quickstart') +const box = await rt.create({ image: 'ghcr.io/boxlite-ai/boxlite-agent-base:20260605-p0-r3' }, 'sdk-quickstart') await box.start() const exec = await box.exec('echo', ['Hello from BoxLite SDK']) @@ -54,7 +54,7 @@ async def main(): credential=ApiKeyCredential(os.environ["BOXLITE_API_KEY"]), )) - box = await rt.create(BoxOptions(image="boxlite/base"), name="sdk-quickstart") + box = await rt.create(BoxOptions(image="ghcr.io/boxlite-ai/boxlite-agent-base:20260605-p0-r3"), name="sdk-quickstart") await box.start() execution = await box.exec("echo", args=["Hello from BoxLite SDK"]) @@ -105,7 +105,7 @@ func main() { } defer rt.Close() - box, err := rt.Create(ctx, "boxlite/base", boxlite.WithName("sdk-quickstart")) + box, err := rt.Create(ctx, "ghcr.io/boxlite-ai/boxlite-agent-base:20260605-p0-r3", boxlite.WithName("sdk-quickstart")) if err != nil { log.Fatal(err) } @@ -143,7 +143,7 @@ async fn main() -> Result<(), Box> { )?; let options = BoxOptions { - rootfs: RootfsSpec::Image("boxlite/base".into()), + rootfs: RootfsSpec::Image("ghcr.io/boxlite-ai/boxlite-agent-base:20260605-p0-r3".into()), ..Default::default() }; let box_handle = rt.create(options, Some("sdk-quickstart".into())).await?; diff --git a/apps/dashboard/src/pages/Boxes.tsx b/apps/dashboard/src/pages/Boxes.tsx index 84fdb8525..2850de840 100644 --- a/apps/dashboard/src/pages/Boxes.tsx +++ b/apps/dashboard/src/pages/Boxes.tsx @@ -29,7 +29,6 @@ import { useApi } from '@/hooks/useApi' import { deleteBoxViaBoxApi, startBoxViaBoxApi, stopBoxViaBoxApi } from '@/lib/cloudBox' import { useConfig } from '@/hooks/useConfig' import { useNotificationSocket } from '@/hooks/useNotificationSocket' -import { useRegions } from '@/hooks/useRegions' import { DEFAULT_BOX_SORTING, getBoxesQueryKey, @@ -295,8 +294,6 @@ const Boxes: React.FC = () => { // TODO(image-rewrite): template/image listing removed with the image/template subsystem. - const { getRegionName } = useRegions() - // Subscribe to Box Events useEffect(() => { @@ -857,7 +854,6 @@ const Boxes: React.FC = () => { filters={filters} onFiltersChange={handleFiltersChange} handleRecover={handleRecover} - getRegionName={getRegionName} handleScreenRecordings={handleScreenRecordings} headerAction={ authenticatedUserHasPermission(OrganizationRolePermissionsEnum.WRITE_BOXES) ? ( From e50f76c6970700620a5448af70a74c59d16c8fb0 Mon Sep 17 00:00:00 2001 From: Brian Luo <57960778+law-chain-hot@users.noreply.github.com> Date: Tue, 16 Jun 2026 17:18:55 +0800 Subject: [PATCH 2/3] feat(dashboard): tighten box table density and widen table viewport - BoxTable: drop the stale min-w-[1360px] (sized for removed columns) to min-w-[1120px] so the table fills the viewport without horizontal scroll, and tighten row vertical padding (py-2 -> py-1, scoped to this table) so rows are ~41px instead of ~46px. - use-mobile: lower COMPACT_BREAKPOINT 1200 -> 1024 so the dashboard keeps the full table (not the compact card layout) down to 1024px. --- apps/dashboard/src/components/BoxTable/index.tsx | 5 ++++- apps/dashboard/src/hooks/use-mobile.tsx | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/dashboard/src/components/BoxTable/index.tsx b/apps/dashboard/src/components/BoxTable/index.tsx index cf86809f9..94020aded 100644 --- a/apps/dashboard/src/components/BoxTable/index.tsx +++ b/apps/dashboard/src/components/BoxTable/index.tsx @@ -279,7 +279,10 @@ export function BoxTable({ ) ) : (
- +
{table.getHeaderGroups().map((headerGroup) => ( diff --git a/apps/dashboard/src/hooks/use-mobile.tsx b/apps/dashboard/src/hooks/use-mobile.tsx index 4143bd124..a9834af2f 100644 --- a/apps/dashboard/src/hooks/use-mobile.tsx +++ b/apps/dashboard/src/hooks/use-mobile.tsx @@ -7,7 +7,7 @@ import { useMatchMedia } from './useMatchMedia' const MOBILE_BREAKPOINT = 768 -const COMPACT_BREAKPOINT = 1200 +const COMPACT_BREAKPOINT = 1024 export function useIsMobile() { return useMatchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) From 7875dc81e01cca91fe5e0632b8c6401a03bd8d87 Mon Sep 17 00:00:00 2001 From: Brian Luo <57960778+law-chain-hot@users.noreply.github.com> Date: Tue, 16 Jun 2026 20:31:45 +0800 Subject: [PATCH 3/3] fix(dashboard): drop stale region key from persisted box-table column visibility Removing the Region column left a 'region: true' entry in the persisted columnVisibility localStorage that was spread back on every load. react-table ignores visibility keys without a matching column, so it was harmless cruft, but strip it on load to keep persisted state clean (CodeRabbit review). --- apps/dashboard/src/components/BoxTable/useBoxTable.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/dashboard/src/components/BoxTable/useBoxTable.ts b/apps/dashboard/src/components/BoxTable/useBoxTable.ts index 9c2eb9921..cf52f6dd5 100644 --- a/apps/dashboard/src/components/BoxTable/useBoxTable.ts +++ b/apps/dashboard/src/components/BoxTable/useBoxTable.ts @@ -76,7 +76,10 @@ export function useBoxTable({ const saved = getLocalStorageItem(LocalStorageKey.BoxTableColumnVisibility) if (saved) { try { - return { ...JSON.parse(saved), id: true, labels: false } + const parsed = JSON.parse(saved) + // Drop the legacy `region` key left in persisted state after the Region column was removed. + delete parsed.region + return { ...parsed, id: true, labels: false } } catch { return { id: true, labels: false } }