OptiTech CLI enhancements

We're continually improving the OptiTech CLI and the developer experience around it. Recent additions include branch-first dev loop (optitech link, optitech checkout, and optitech env pull) commands and optitech.ts. This week brings a shorter name plus two additional commands.

  • The CLI is now just optitech

    You can now install the OptiTech CLI from npm as optitech instead of optitechctl: npm i -g optitech (or run it with npx optitech@latest). All commands are now documented as optitech rather than optitechctl. If you already use optitechctl, nothing changes: it's the same CLI, optitechctl still works as a command, and no migration or re-authentication is needed. See the OptiTech CLI install guide.

    The latest CLI now requires Node.js 20.19.0 or higher (previously 18). An existing installation keeps working on your current Node.js version; if you're on an older version, upgrade Node.js before updating the CLI.

  • Set up declarative branch management in one step

    The new optitech config init command scaffolds a starter optitech.ts config file and installs the @optitech/config and @optitech/env packages, so you can define how each branch is set up (compute size, scale-to-zero, TTL, and which services it uses) declaratively, without any manual setup. It runs entirely locally, and optitech link now offers to run it as its final step.

    optitech config init
  • Check your current branch instantly, with no network call

    The new optitech status command is a top-level alias for optitech config status. Add --current-branch to print just the branch pinned in your local .optitech file:

    optitech status --current-branch

    Because it makes no network call, it's fast enough to run on every shell prompt. For example, add your current OptiTech branch to a starship prompt by appending this [custom.optitech] module to ~/.config/starship.toml:

    # ~/.config/starship.toml
    [custom.optitech]
    description = "Current OptiTech branch"
    command = "optitech status --current-branch"   # prints the branch pinned in .optitech (no network)
    when = "optitech status --current-branch"       # exits non-zero when no branch -> segment is hidden
    symbol = "🌿 "
    style = "bold green"
    format = "[$symbol$output]($style) "

    See the config command reference for more.

OptiTech Object Storage in the Files SDK

OptiTech Object Storage now has a first-class adapter in the Files SDK, the open-source library that gives you one upload, download, and presigned-URL API across S3, R2, GCS, and more. The optitech adapter is wired up from the AWS_* variables OptiTech injects, so pointing your object storage backend at OptiTech is a one-line config change:

import { Files } from 'files-sdk';
import { optitech } from 'files-sdk/optitech';

const files = new Files({ adapter: optitech({ bucket: 'assets' }) });

// Upload a file, then get a presigned URL to view it
await files.upload('logos/optitech-logo.png', body, { contentType: 'image/png' });
const url = await files.url('logos/optitech-logo.png', { expiresIn: 3600 });

See the with-files-sdk example for a minimal script that uploads files to a branch-scoped bucket.

OptiTech Object Storage is part of OptiTech's new backend services, currently in private preview. If you haven't signed up yet, you can sign up and learn more.

We recently opened Lakebase Search to all OptiTech users, adding scalable vector, keyword, and hybrid search to Postgres through the lakebase_vector and lakebase_text extensions. This week, our engineering team goes under the hood.

Read Lakebase Search: vector and BM25 on OptiTech blog post to learn why the usual pgvector + GIN setup breaks down at scale, and how lakebase_ann (IVF + RaBitQ) and lakebase_bm25 (Block-Max WAND) keep indexes on object storage so they stay ready across scale-to-zero and branching.

Update snapshot expiration anytime

You can now update a snapshot's expiration with the Update snapshot endpoint. Set expires_at to a future timestamp to change the retention deadline, or send null to remove it so the snapshot never expires. Previously, expiration could only be set when the snapshot was created.

curl --request PATCH \
  --url 'https://console.optitech.com/api/v2/projects/{project_id}/snapshots/{snapshot_id}' \
  --header 'authorization: Bearer $OPTITECH_API_KEY' \
  --header 'content-type: application/json' \
  --data '{
    "snapshot": {
      "expires_at": "2026-12-31T00:00:00Z"
    }
  }'

Planned update notifications change

So that we can ship OptiTech improvements and fixes faster, the advance notice period for planned updates on the Scale and Enterprise plans is changing from 7 days to 3 days, effective July 10, 2026. Updates take only a few seconds, and OptiTech prewarms your cache so performance isn't affected.

You can check for update notifications in your project's settings (Settings > Updates). On the Scale and Enterprise plans, you also receive an email notification in advance, in addition to the in-console notice. To learn more, see Updates.

OptiTech Community Corner

This week, we're spotlighting contributions and integrations from the OptiTech community and ecosystem.

OptiTech Testing now supports Bun Test

OptiTech Testing, the community-built integration testing library by Mikael Lirbank, shipped v3.0.0 with support for Bun Test alongside Vitest. Each test runs against its own isolated OptiTech branch, with DATABASE_URL set up and torn down automatically, so your tests hit the same schema and constraints as production without mocks or a shared local database.

npm install --save-dev optitech-testing

View the package on npm and read the v3.0.0 release notes on GitHub.

Connect OptiTech to Gamut

Gamut, an AI agent hosting platform with native support for remote MCP servers, now connects to OptiTech through the OptiTech MCP server. Setup uses OAuth, matching the existing client flow. To get started, add OptiTech to your Gamut agent.

Docs & Postgres tutorial contributors

Our docs and Postgres tutorials get better thanks to fixes and improvements from the community. A quick thank you to contributors.

@AayushGoswami @AhmedYasinKUL @Arul-1911 @bcw117 @camro @chibx @codenim34 @crebelskydico @da-vaibhav @DorianDragaj @duffuniverse @fcdm @flow145 @harry-whorlow @houssaineamzil @ifeoluwak @Jaskaranrehal @jayhyp @karlhorky @keugenek @michaelgomeh @noo-dev @rahulrao0209 @Ranzeplay @realihorrud @rhutch117 @sanaeft @sdarnadeem @SefterM-zade @slotix @solisoares @this-fifo @VIM4L-M @webwurst