Skip to main content
The Daytona TypeScript SDK provides a fully typed interface for interacting with Daytona Sandboxes, enabling sandbox management, code execution, file operations, and more.

Installation

npm install @daytonaio/sdk

Quick Start

import { Daytona } from '@daytonaio/sdk'

// Initialize using environment variables
const daytona = new Daytona()

// Create a sandbox
const sandbox = await daytona.create()

// Run code in the sandbox
const response = await sandbox.process.codeRun('console.log("Hello World!")')
console.log(response.result)

// Clean up when done
await daytona.delete(sandbox)

Configuration

Using Environment Variables

Set the following environment variables:
export DAYTONA_API_KEY="your-api-key"
export DAYTONA_API_URL="https://app.daytona.io/api"  # Optional
export DAYTONA_TARGET="us"  # Optional
Then initialize the client:
import { Daytona } from '@daytonaio/sdk'

const daytona = new Daytona()

Using Configuration Object

import { Daytona, DaytonaConfig } from '@daytonaio/sdk'

const config: DaytonaConfig = {
  apiKey: 'your-api-key',
  apiUrl: 'https://app.daytona.io/api',
  target: 'us',
}

const daytona = new Daytona(config)

Sandbox Management

Creating Sandboxes

Basic Sandbox Creation

import { Daytona } from '@daytonaio/sdk'

const daytona = new Daytona()
const sandbox = await daytona.create()

console.log(`Created sandbox: ${sandbox.id}`)
console.log(`State: ${sandbox.state}`)

Customized Sandbox Creation

import { Daytona, CodeLanguage } from '@daytonaio/sdk'

const daytona = new Daytona()

const sandbox = await daytona.create({
  language: CodeLanguage.TYPESCRIPT,
  envVars: { NODE_ENV: 'development' },
  autoStopInterval: 60, // Auto-stop after 1 hour of inactivity
  autoArchiveInterval: 60, // Auto-archive after 1 hour of being stopped
  autoDeleteInterval: 120, // Auto-delete after 2 hours of being stopped
  labels: { project: 'my-app', environment: 'dev' },
})

Listing Sandboxes

// List all sandboxes
const result = await daytona.list()
console.log(`Total sandboxes: ${result.total}`)

for (const sandbox of result.items) {
  console.log(`ID: ${sandbox.id}, State: ${sandbox.state}`)
}

// List with pagination
const paginatedResult = await daytona.list({ page: 1, limit: 10 })

Getting a Sandbox

// Get by ID
const sandbox = await daytona.get('sandbox-id')

// Get by name
const sandbox = await daytona.get('sandbox-name')

Sandbox Lifecycle

// Stop a sandbox
await sandbox.stop()
console.log(`Sandbox state: ${sandbox.state}`) // 'stopped'

// Start a sandbox
await sandbox.start()
console.log(`Sandbox state: ${sandbox.state}`) // 'started'

// Delete a sandbox
await sandbox.delete()

Setting Labels

await sandbox.setLabels({
  environment: 'development',
  project: 'my-app',
  public: 'true',
})

console.log(`Labels:`, sandbox.labels)

Code Execution

Running TypeScript/JavaScript Code

// Simple code execution
const response = await sandbox.process.codeRun('console.log("Hello, World!")')
console.log(response.result)

// Multi-line code
const code = `
const x = 10
const y = 20
console.log(\`Sum: \${x + y}\`)
`

const response = await sandbox.process.codeRun(code)
console.log(response.result) // Output: Sum: 30

Executing Shell Commands

// Execute a command
const response = await sandbox.process.executeCommand('echo "Hello, World!"')
if (response.exitCode === 0) {
  console.log(response.result)
} else {
  console.error(`Error: ${response.result}`)
}

// Execute with working directory and timeout
const response = await sandbox.process.executeCommand(
  'ls -la',
  '/home/daytona',
  undefined,
  10 // timeout in seconds
)
console.log(response.result)

Code Interpreter (Stateful Execution)

// Create a stateful code interpreter session
const interpreter = sandbox.codeInterpreter

// Execute code with real-time streaming
const channels = await interpreter.runCode(`
import time
for i in range(5):
    print(f"Step {i+1}")
    time.sleep(0.5)
`)

// Read real-time output
for await (const msg of channels.stdout) {
  console.log(`[STDOUT] ${msg.text}`)
}

// Wait for completion
const result = await channels.done
console.log(`Final output: ${result.stdout}`)

File Operations

Uploading Files

// Upload a single file from buffer
const content = Buffer.from('Hello, World!')
await sandbox.fs.uploadFile(content, '/tmp/hello.txt')

// Upload a file from local path
await sandbox.fs.uploadFiles([
  {
    source: 'local-file.txt',
    destination: '/tmp/remote-file.txt',
  },
])

// Upload multiple files
await sandbox.fs.uploadFiles([
  {
    source: 'file1.txt',
    destination: '/tmp/file1.txt',
  },
  {
    source: Buffer.from('content'),
    destination: '/tmp/file2.txt',
  },
])

Downloading Files

// Download a single file to memory
const content = await sandbox.fs.downloadFile('/tmp/hello.txt')
console.log(content.toString('utf-8'))

// Download multiple files
const results = await sandbox.fs.downloadFiles([
  {
    source: '/tmp/file1.txt',
    destination: 'local-file1.txt',
  },
  {
    source: '/tmp/file2.txt', // To memory
  },
])

for (const result of results) {
  if (result.error) {
    console.error(`Error: ${result.error}`)
  } else if (typeof result.result === 'string') {
    console.log(`Downloaded to: ${result.result}`)
  } else {
    console.log(`Downloaded to memory: ${result.result?.length} bytes`)
  }
}

File System Operations

// List files in a directory
const files = await sandbox.fs.listFiles('/tmp')
for (const file of files) {
  console.log(`${file.name}: ${file.size} bytes`)
}

// Create a folder
await sandbox.fs.createFolder('/tmp/new-folder', '755')

// Search for files
const matches = await sandbox.fs.searchFiles('/tmp', '*.txt')
console.log(`Found ${matches.files.length} files`)
for (const file of matches.files) {
  console.log(file)
}

// Replace content in files
await sandbox.fs.replaceInFiles(
  ['/tmp/config.json'],
  '"debug": true',
  '"debug": false'
)

Git Operations

Cloning Repositories

// Clone a public repository
await sandbox.git.clone(
  'https://github.com/daytonaio/daytona.git',
  '/tmp/daytona'
)

// Clone with authentication
await sandbox.git.clone(
  'https://github.com/private/repo.git',
  '/tmp/repo',
  undefined, // commitId
  undefined, // branch
  'user',
  'token'
)

// Clone a specific branch
await sandbox.git.clone(
  'https://github.com/example/repo.git',
  '/tmp/repo',
  undefined, // commitId
  'develop'
)

Git Status and Branches

// Get repository status
const status = await sandbox.git.status('/tmp/repo')
console.log(`Current branch: ${status.currentBranch}`)
console.log(`Files changed: ${status.fileStatus.length}`)

// List branches
const branches = await sandbox.git.branches('/tmp/repo')
for (const branch of branches) {
  console.log(`Branch: ${branch}`)
}

Committing Changes

// Add files
await sandbox.git.add('/tmp/repo', ['file1.txt', 'file2.txt'])

// Commit changes
await sandbox.git.commit(
  '/tmp/repo',
  'Add new features',
  'Your Name',
  '[email protected]'
)

// Push changes
await sandbox.git.push(
  '/tmp/repo',
  'user',
  'token'
)

Language Server Protocol

Starting an LSP Server

// Create and start a TypeScript LSP server
const lsp = await sandbox.createLspServer('typescript', '/workspace/project')
await lsp.start()

// Notify LSP about opened file
await lsp.didOpen('/workspace/project/src/index.ts')

Code Intelligence

// Get document symbols
const symbols = await lsp.documentSymbols('/workspace/project/src/index.ts')
for (const symbol of symbols) {
  console.log(`${symbol.name} (${symbol.kind})`)
}

// Get completions
const completions = await lsp.completions(
  '/workspace/project/src/index.ts',
  { line: 10, character: 15 }
)
for (const item of completions) {
  console.log(`${item.label}: ${item.detail}`)
}

// Go to definition
const definition = await lsp.definition(
  '/workspace/project/src/index.ts',
  { line: 5, character: 10 }
)
console.log(`Definition at:`, definition)

Stopping LSP Server

// Stop the LSP server
await lsp.stop()

Error Handling

import {
  Daytona,
  DaytonaError,
  DaytonaNotFoundError,
  DaytonaRateLimitError,
} from '@daytonaio/sdk'

try {
  const daytona = new Daytona()
  const sandbox = await daytona.create()

  // Execute code that might fail
  const response = await sandbox.process.executeCommand('invalid-command')
  if (response.exitCode !== 0) {
    console.error(`Command failed: ${response.result}`)
  }

  await daytona.delete(sandbox)
} catch (error) {
  if (error instanceof DaytonaNotFoundError) {
    console.error(`Resource not found: ${error.message}`)
  } else if (error instanceof DaytonaRateLimitError) {
    console.error(`Rate limit exceeded: ${error.message}`)
  } else if (error instanceof DaytonaError) {
    console.error(`Daytona error: ${error.message}`)
  } else {
    console.error(`Unexpected error:`, error)
  }
}

Complete Example

import { Daytona, CodeLanguage } from '@daytonaio/sdk'
import * as fs from 'fs'

async function main() {
  // Initialize client
  const daytona = new Daytona()

  // Create a sandbox with custom configuration
  const sandbox = await daytona.create({
    language: CodeLanguage.TYPESCRIPT,
    envVars: { NODE_ENV: 'production' },
    labels: { project: 'data-analysis' },
  })

  console.log(`Created sandbox: ${sandbox.id}`)

  try {
    // Upload a TypeScript script
    const script = `
import * as fs from 'fs'

interface User {
  name: string
  age: number
}

const users: User[] = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
]

console.log(JSON.stringify(users))
`
    await sandbox.fs.uploadFile(Buffer.from(script), '/tmp/analyze.ts')

    // Install TypeScript
    const installResult = await sandbox.process.executeCommand(
      'npm install -g typescript @types/node'
    )
    if (installResult.exitCode !== 0) {
      console.error(`Failed to install TypeScript: ${installResult.result}`)
      return
    }

    // Run the script
    const result = await sandbox.process.executeCommand(
      'ts-node /tmp/analyze.ts'
    )
    console.log(`Analysis result: ${result.result}`)
  } finally {
    // Cleanup
    await daytona.delete(sandbox)
    console.log('Sandbox deleted')
  }
}

main().catch(console.error)

API Reference

Daytona Class

Methods

  • create(params?) - Create a new sandbox
  • get(sandboxIdOrName) - Get a sandbox by ID or name
  • list(options?) - List sandboxes with pagination
  • delete(sandbox) - Delete a sandbox

Sandbox Class

Properties

  • fs: FileSystem - File system operations interface
  • git: Git - Git operations interface
  • process: Process - Process execution interface
  • codeInterpreter: CodeInterpreter - Code interpreter interface
  • computerUse: ComputerUse - Computer use operations for desktop automation
  • id: string - Sandbox ID
  • state: SandboxState - Current state
  • labels: Record<string, string> - Custom labels
  • env: Record<string, string> - Environment variables

Methods

  • setLabels(labels) - Set custom labels
  • getPreviewLink(port) - Get port preview URL
  • start() - Start the sandbox
  • stop() - Stop the sandbox
  • delete() - Delete the sandbox
  • createLspServer(language, workingDir) - Create an LSP server

Process Class

Methods

  • executeCommand(command, cwd?, env?, timeout?) - Execute a shell command
  • codeRun(code, params?) - Execute code directly

FileSystem Class

Methods

  • uploadFile(content, path) - Upload a file
  • uploadFiles(files) - Upload multiple files
  • downloadFile(path) - Download a file
  • downloadFiles(requests) - Download multiple files
  • listFiles(path) - List files in a directory
  • createFolder(path, mode?) - Create a folder
  • searchFiles(root, pattern) - Search for files
  • replaceInFiles(files, oldStr, newStr) - Replace content in files

Git Class

Methods

  • clone(url, path, commitId?, branch?, username?, password?) - Clone a repository
  • status(path) - Get repository status
  • branches(path) - List branches
  • add(path, files) - Add files to staging
  • commit(path, message, author, email) - Commit changes
  • push(path, username?, password?) - Push changes

Best Practices

Always Use Try-Finally for Cleanup

import { Daytona } from '@daytonaio/sdk'

async function processData() {
  const daytona = new Daytona()
  const sandbox = await daytona.create()

  try {
    // Do work with sandbox
    const result = await sandbox.process.codeRun('console.log("Hello")')
    return result
  } finally {
    // Always cleanup
    await daytona.delete(sandbox)
  }
}

Check Exit Codes

const response = await sandbox.process.executeCommand('some-command')
if (response.exitCode !== 0) {
  console.error(`Command failed: ${response.result}`)
  // Handle error
} else {
  console.log(`Success: ${response.result}`)
}

Use TypeScript for Type Safety

import { Daytona, Sandbox, CodeLanguage } from '@daytonaio/sdk'

async function createTypedSandbox(daytona: Daytona): Promise<Sandbox> {
  return await daytona.create({
    language: CodeLanguage.TYPESCRIPT,
  })
}

Handle Promise Rejections

import { Daytona } from '@daytonaio/sdk'

const daytona = new Daytona()

// Always handle promise rejections
daytona
  .create()
  .then((sandbox) => {
    // Use sandbox
    return sandbox.process.codeRun('console.log("Hello")')
  })
  .catch((error) => {
    console.error('Error:', error)
  })

Next Steps

SDK Overview

Compare all available SDKs

API Reference

Complete API documentation

Examples

Browse TypeScript examples on GitHub

Python SDK

Learn about the Python SDK

Build docs developers (and LLMs) love