Skip to main content

Your workstation, defined in TypeScript

Workstation turns a TypeScript configuration into a working macOS or Linux setup: development runtimes, command-line tools, desktop applications, configuration files, shell startup, and background services. Keep the inputs in Git, review the changes, and run workstation build whenever the machine needs to match them.

Start with a working setup

New to Workstation? Follow these guides in order. Each introduces the next piece only after you have something working.

StepWhat you will learnWhat you will have afterward
1. Understand the modelDeclarations, pins, ownership, and reconciliationKnow what a build will change and what it will preserve
2. Install WorkstationNative executable, required managers, and configuration loadingA working workstation command
3. Build your first configurationPreview, create, update, run a task, and removeA verified file-only setup you can safely explore
4. Build a developer workstationCombine packages, activation, dotfiles, platform differences, and tasksA useful configuration you can adapt to your own machines

The native executable includes its runtime. You can use built-in configuration helpers without installing Node.js or creating a JavaScript project first. Install the package locally when you want editor types or a pinned library version.

What does a configuration look like?

import { defineConfig, files, task, tools } from "@dovocode/workstation";

const versions = { node: "lts", pnpm: "12.3.4" };

export default defineConfig({
resources: [
tools.mise(versions),
files.mise("~/.config/mise/config.toml", versions),
files.json("~/.config/example/settings.json", { theme: "dark" }),
],
tasks: {
hello: task("echo", ["Your setup is ready"], {
description: "An explicit command, separate from reconciliation",
}),
},
});

This declares tools to install, a mise file that selects their exact locked versions, a generated settings file, and a named command. A declaration describes the desired result. It does not install anything merely because you imported it.

workstation build # Prepare supported managers, resolve pins, apply the setup
workstation status # Check recorded declarations against the machine
workstation hello # Run only the explicit task

If the managers already exist, run workstation plan before a build to inspect proposed changes. Generated files overwrite differing content by default and save the original for restoration. Review existing files before adapting this example; choose a file policy when you only want to manage a section or selected keys.

Make it your own

Start with the change you actually want to make:

GoalRead next
Use one setup across your laptop and desktopConfiguration, machines, and paths
Choose the right abstraction for automationDesign your setup
Install runtimes, CLI tools, and desktop applicationsPackages and runtimes
Generate settings or bring dotfiles under managementFiles and existing content
Make installed tools available in new terminalsShells and activation
Build your own executable from local sourceCustom tools
Keep a background process runningServices
Configure repositories, seed app settings, and repair installationsProvisioning

Use it every day

A build is not just a one-time installer. Run it after an intentional configuration change or to reconcile a machine that has drifted. Keep your package pins stable until you choose to refresh them.

  • Everyday workflows: add a machine, upgrade selected packages, migrate dotfiles, move your checkout, and remove old declarations.
  • Ownership and recovery: understand what is adopted, what is removed, where originals live, and when snapshot rollback is possible.
  • Troubleshooting: interpret diagnostics and recover without losing the state needed to restore your original files.

Go further

Use tasks and aliases for explicit project commands and post-apply hooks for repeatable follow-up work. Use Docker and sandbox tasks to control separate environments, or embed the client in your own TypeScript application.

The CLI reference provides exact command and option behavior. The generated API reference lists public helpers and types. Read architecture and development when extending Workstation itself.

Know the boundary

Workstation manages declared resources. It does not capture an entire machine, back up application databases, purchase App Store software, or automatically revert every package-manager transaction. Keep configuration and locks in Git; keep ownership state and original-file backups private. Authentication and application initialization remain explicit operations.