Showing preview only (2,094K chars total). Download the full file or copy to clipboard to get everything.
Repository: jetify-com/devbox
Branch: main
Commit: b589a11e5bef
Files: 895
Total size: 1.8 MB
Directory structure:
gitextract_w04sbmq7/
├── .envrc
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── 01-bug.yaml
│ │ ├── 02-feature.yaml
│ │ ├── 03-package-bug.yaml
│ │ └── 04-package-request.yaml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── cache-upload.yml
│ ├── cli-post-release.yml
│ ├── cli-release.yml
│ ├── cli-tests.yaml
│ ├── debug.yaml
│ ├── docker-image-release.yml
│ ├── random-reviewer-assignment.yml
│ ├── stale-issue-cleanup.yml
│ └── vscode-ext-release.yaml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yaml
├── .schema/
│ ├── devbox-plugin.schema.json
│ └── devbox.schema.json
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── NUSHELL.md
├── README.md
├── cmd/
│ └── devbox/
│ └── main.go
├── devbox.go
├── devbox.json
├── devbox.md
├── examples/
│ ├── .gitignore
│ ├── README.md
│ ├── cloud_development/
│ │ ├── argo-workflows/
│ │ │ ├── README.md
│ │ │ ├── argo-patch.sh
│ │ │ └── devbox.json
│ │ ├── maelstrom/
│ │ │ ├── README.md
│ │ │ └── devbox.json
│ │ ├── minikube/
│ │ │ ├── README.md
│ │ │ └── devbox.json
│ │ └── temporal/
│ │ ├── .envrc
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── devbox.json
│ │ ├── hello/
│ │ │ ├── .gitignore
│ │ │ ├── __init__.py
│ │ │ ├── hello_activity.py
│ │ │ └── hello_cron.py
│ │ ├── requirements.txt
│ │ ├── tests/
│ │ │ └── __init__.py
│ │ └── venvShellHook.sh
│ ├── data_science/
│ │ ├── R/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── src/
│ │ │ └── examplePlot.R
│ │ ├── README.md
│ │ ├── jupyter/
│ │ │ ├── .envrc
│ │ │ ├── .pdm-python
│ │ │ ├── .pdm.toml
│ │ │ ├── __pypackages__/
│ │ │ │ └── .gitignore
│ │ │ ├── devbox.json
│ │ │ ├── main.py
│ │ │ └── pyproject.toml
│ │ ├── llama/
│ │ │ ├── README.md
│ │ │ └── devbox.json
│ │ ├── pytorch/
│ │ │ ├── basic-example/
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.json
│ │ │ │ ├── main.py
│ │ │ │ └── pyproject.toml
│ │ │ └── gradio/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── class_names.txt
│ │ │ ├── devbox.json
│ │ │ ├── requirements.txt
│ │ │ └── run.py
│ │ └── tensorflow/
│ │ ├── README.md
│ │ ├── devbox.json
│ │ ├── main.py
│ │ └── requirements.txt
│ ├── databases/
│ │ ├── mariadb/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── setup_db.sql
│ │ ├── mysql/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── mysql/
│ │ │ │ │ └── my.cnf
│ │ │ │ ├── mysql80/
│ │ │ │ │ └── my.cnf
│ │ │ │ └── mysql84/
│ │ │ │ └── my.cnf
│ │ │ ├── devbox.json
│ │ │ ├── my.cnf
│ │ │ └── setup_db.sql
│ │ ├── postgres/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── setup_postgres_db.sql
│ │ ├── redis/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ └── redis/
│ │ │ │ └── redis.conf
│ │ │ └── devbox.json
│ │ └── valkey/
│ │ ├── README.md
│ │ ├── devbox.d/
│ │ │ └── valkey/
│ │ │ └── valkey.conf
│ │ └── devbox.json
│ ├── development/
│ │ ├── bun/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── bun.lockb
│ │ │ ├── devbox.json
│ │ │ ├── index.test.ts
│ │ │ ├── index.ts
│ │ │ ├── package.json
│ │ │ └── tsconfig.json
│ │ ├── csharp/
│ │ │ └── hello-world/
│ │ │ ├── .gitignore
│ │ │ ├── Program.cs
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── hello-world.csproj
│ │ ├── elixir/
│ │ │ └── elixir_hello/
│ │ │ ├── .formatter.exs
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── lib/
│ │ │ │ ├── elixir_hello.ex
│ │ │ │ └── kv.exs
│ │ │ ├── mix.exs
│ │ │ └── test/
│ │ │ ├── elixir_hello_test.exs
│ │ │ └── test_helper.exs
│ │ ├── fsharp/
│ │ │ └── hello-world/
│ │ │ ├── .gitignore
│ │ │ ├── Program.fs
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── hello-world.fsproj
│ │ ├── go/
│ │ │ └── hello-world/
│ │ │ ├── .envrc
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ ├── haskell/
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── my-project/
│ │ │ ├── .gitignore
│ │ │ ├── CHANGELOG.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── Setup.hs
│ │ │ ├── app/
│ │ │ │ └── Main.hs
│ │ │ ├── my-project.cabal
│ │ │ ├── package.yaml
│ │ │ ├── src/
│ │ │ │ └── Lib.hs
│ │ │ ├── stack.yaml
│ │ │ └── test/
│ │ │ └── Spec.hs
│ │ ├── java/
│ │ │ ├── README.md
│ │ │ ├── gradle/
│ │ │ │ ├── .gitignore
│ │ │ │ └── hello-world/
│ │ │ │ ├── README.md
│ │ │ │ ├── build.gradle
│ │ │ │ ├── devbox.json
│ │ │ │ ├── gradlew
│ │ │ │ ├── settings.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ └── java/
│ │ │ │ └── hello/
│ │ │ │ └── HelloWorld.java
│ │ │ └── maven/
│ │ │ ├── .gitignore
│ │ │ └── hello-world/
│ │ │ ├── README.md
│ │ │ ├── devbox-maven-app/
│ │ │ │ └── pom.xml
│ │ │ ├── devbox.json
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ └── java/
│ │ │ │ └── com/
│ │ │ │ └── devbox/
│ │ │ │ └── mavenapp/
│ │ │ │ └── App.java
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── devbox/
│ │ │ └── mavenapp/
│ │ │ └── AppTest.java
│ │ ├── nim/
│ │ │ └── spinnytest/
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── spinnytest
│ │ │ ├── spinnytest.nim
│ │ │ └── spinnytest.nimble
│ │ ├── nodejs/
│ │ │ ├── .gitignore
│ │ │ ├── nodejs-npm/
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.json
│ │ │ │ ├── index.js
│ │ │ │ └── package.json
│ │ │ ├── nodejs-pnpm/
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.json
│ │ │ │ ├── index.js
│ │ │ │ └── package.json
│ │ │ ├── nodejs-typescript/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── devbox.json
│ │ │ │ ├── index.js
│ │ │ │ ├── index.ts
│ │ │ │ ├── package.json
│ │ │ │ └── tsconfig.json
│ │ │ └── nodejs-yarn/
│ │ │ ├── .yarnrc.yml
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── index.js
│ │ │ └── package.json
│ │ ├── php/
│ │ │ └── latest/
│ │ │ ├── .envrc
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── composer.json
│ │ │ ├── devbox.d/
│ │ │ │ └── php/
│ │ │ │ ├── php-fpm.conf
│ │ │ │ └── php.ini
│ │ │ ├── devbox.json
│ │ │ └── public/
│ │ │ └── index.php
│ │ ├── python/
│ │ │ ├── pip/
│ │ │ │ ├── .envrc
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.d/
│ │ │ │ │ └── python310Packages.pip/
│ │ │ │ │ └── venvShellHook.sh
│ │ │ │ ├── devbox.json
│ │ │ │ ├── main.py
│ │ │ │ └── requirements.txt
│ │ │ ├── pipenv/
│ │ │ │ ├── Pipfile
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.json
│ │ │ │ ├── main.py
│ │ │ │ └── requirements.txt
│ │ │ └── poetry/
│ │ │ ├── poetry-demo/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.json
│ │ │ │ ├── poetry_demo/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __main__.py
│ │ │ │ ├── pyproject.toml
│ │ │ │ └── tests/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_poetry_demo.py
│ │ │ └── poetry-pyproject-subdir/
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── frontend/
│ │ │ │ └── .empty
│ │ │ └── service/
│ │ │ ├── pyproject.toml
│ │ │ └── test_with_pytest.py
│ │ ├── ruby/
│ │ │ ├── .envrc
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── hello.rb
│ │ ├── rust/
│ │ │ ├── README.md
│ │ │ └── rust-stable-hello-world/
│ │ │ ├── .gitignore
│ │ │ ├── Cargo.toml
│ │ │ ├── conf/
│ │ │ │ └── set-env.sh
│ │ │ ├── devbox.json
│ │ │ └── src/
│ │ │ └── main.rs
│ │ └── zig/
│ │ ├── README.md
│ │ └── zig-hello-world/
│ │ ├── .gitignore
│ │ ├── build.zig
│ │ ├── devbox.json
│ │ └── src/
│ │ └── main.zig
│ ├── flakes/
│ │ ├── README.md
│ │ ├── go-mod/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── ory-cli/
│ │ │ └── flake.nix
│ │ ├── overlay/
│ │ │ ├── .nvmrc
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── package.json
│ │ │ └── yarn-overlay/
│ │ │ └── flake.nix
│ │ ├── php/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ └── php/
│ │ │ │ ├── php-fpm.conf
│ │ │ │ └── php.ini
│ │ │ ├── devbox.json
│ │ │ └── my-php-flake/
│ │ │ └── flake.nix
│ │ ├── php-extension/
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── my-php-flake/
│ │ │ └── flake.nix
│ │ └── remote/
│ │ └── devbox.json
│ ├── insecure/
│ │ └── devbox.json
│ ├── plugins/
│ │ ├── builtin/
│ │ │ ├── devbox.d/
│ │ │ │ └── php84/
│ │ │ │ ├── php-fpm.conf
│ │ │ │ └── php.ini
│ │ │ └── devbox.json
│ │ ├── git/
│ │ │ ├── devbox.d/
│ │ │ │ ├── jetify-com.devbox-plugin-example.my-github-plugin/
│ │ │ │ │ └── some-file.txt
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ ├── git-with-revision/
│ │ │ ├── devbox.d/
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ ├── github/
│ │ │ ├── devbox.d/
│ │ │ │ ├── jetify-com.devbox-plugin-example.my-github-plugin/
│ │ │ │ │ └── some-file.txt
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ ├── github-with-revision/
│ │ │ ├── devbox.d/
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ ├── local/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ └── my-plugin/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ ├── my-plugin/
│ │ │ │ ├── plugin.json
│ │ │ │ ├── process-compose.yaml
│ │ │ │ └── some-file.txt
│ │ │ └── test.sh
│ │ ├── v2-git/
│ │ │ ├── devbox.d/
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ ├── v2-github/
│ │ │ ├── devbox.d/
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ └── v2-local/
│ │ ├── devbox.d/
│ │ │ └── plugin1/
│ │ │ └── foo.txt
│ │ ├── devbox.json
│ │ ├── plugin1/
│ │ │ ├── foo.txt
│ │ │ ├── plugin.json
│ │ │ ├── plugin1a/
│ │ │ │ └── plugin.json
│ │ │ └── process-compose.yaml
│ │ ├── plugin2/
│ │ │ ├── plugin.json
│ │ │ └── process-compose.yaml
│ │ └── plugin3/
│ │ └── plugin.json
│ ├── servers/
│ │ ├── apache/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── apacheHttpd/
│ │ │ │ │ └── httpd.conf
│ │ │ │ └── web/
│ │ │ │ └── index.html
│ │ │ └── devbox.json
│ │ ├── caddy/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── caddy/
│ │ │ │ │ └── Caddyfile
│ │ │ │ └── web/
│ │ │ │ └── index.html
│ │ │ └── devbox.json
│ │ └── nginx/
│ │ ├── .envrc
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── devbox.d/
│ │ │ ├── nginx/
│ │ │ │ ├── fastcgi.conf
│ │ │ │ ├── nginx.conf
│ │ │ │ └── nginx.template
│ │ │ └── web/
│ │ │ └── index.html
│ │ └── devbox.json
│ ├── stacks/
│ │ ├── django/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── process-compose.yml
│ │ │ ├── requirements.txt
│ │ │ └── todo_project/
│ │ │ ├── manage.py
│ │ │ ├── todo_app/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── admin.py
│ │ │ │ ├── apps.py
│ │ │ │ ├── migrations/
│ │ │ │ │ ├── 0001_initial.py
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── models.py
│ │ │ │ ├── templates/
│ │ │ │ │ └── todo_app/
│ │ │ │ │ ├── create_todo.html
│ │ │ │ │ └── todo_list.html
│ │ │ │ ├── tests.py
│ │ │ │ └── views.py
│ │ │ └── todo_project/
│ │ │ ├── __init__.py
│ │ │ ├── asgi.py
│ │ │ ├── settings.py
│ │ │ ├── urls.py
│ │ │ └── wsgi.py
│ │ ├── drupal/
│ │ │ ├── .editorconfig
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── composer.json
│ │ │ ├── devbox.d/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── nginx/
│ │ │ │ │ ├── fastcgi.conf
│ │ │ │ │ ├── mime.conf
│ │ │ │ │ ├── nginx.conf
│ │ │ │ │ └── nginx.template
│ │ │ │ └── php/
│ │ │ │ ├── php-fpm.conf
│ │ │ │ └── php.ini
│ │ │ ├── devbox.json
│ │ │ ├── install-drupal.sh
│ │ │ ├── setup_db.sql
│ │ │ └── web/
│ │ │ ├── .csslintrc
│ │ │ ├── .eslintignore
│ │ │ ├── .eslintrc.json
│ │ │ ├── .gitignore
│ │ │ ├── .ht.router.php
│ │ │ ├── .htaccess
│ │ │ ├── INSTALL.txt
│ │ │ ├── README.md
│ │ │ ├── example.gitignore
│ │ │ ├── index.html
│ │ │ ├── index.php
│ │ │ ├── modules/
│ │ │ │ └── README.txt
│ │ │ ├── profiles/
│ │ │ │ └── README.txt
│ │ │ ├── robots.txt
│ │ │ ├── sites/
│ │ │ │ ├── README.txt
│ │ │ │ ├── default/
│ │ │ │ │ ├── default.services.yml
│ │ │ │ │ └── default.settings.php
│ │ │ │ ├── development.services.yml
│ │ │ │ ├── example.settings.local.php
│ │ │ │ └── example.sites.php
│ │ │ ├── themes/
│ │ │ │ └── README.txt
│ │ │ ├── update.php
│ │ │ └── web.config
│ │ ├── jekyll/
│ │ │ ├── .envrc
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── myblog/
│ │ │ │ ├── .bundle/
│ │ │ │ │ └── config
│ │ │ │ ├── .gitignore
│ │ │ │ ├── 404.html
│ │ │ │ ├── Gemfile
│ │ │ │ ├── _config.yml
│ │ │ │ ├── _posts/
│ │ │ │ │ └── 2023-01-15-welcome-to-jekyll.markdown
│ │ │ │ ├── about.md
│ │ │ │ └── index.md
│ │ │ └── process-compose.yml
│ │ ├── lapp-stack/
│ │ │ ├── .gitignore
│ │ │ ├── .testrc
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── apache/
│ │ │ │ │ └── httpd.conf
│ │ │ │ ├── php/
│ │ │ │ │ ├── php-fpm.conf
│ │ │ │ │ └── php.ini
│ │ │ │ └── web/
│ │ │ │ └── index.html
│ │ │ ├── devbox.json
│ │ │ ├── my_app/
│ │ │ │ ├── config.php
│ │ │ │ ├── index.php
│ │ │ │ └── info.php
│ │ │ └── setup_postgres_db.sql
│ │ ├── laravel/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── php/
│ │ │ │ │ ├── php-fpm.conf
│ │ │ │ │ └── php.ini
│ │ │ │ └── redis/
│ │ │ │ └── redis.conf
│ │ │ └── devbox.json
│ │ ├── lepp-stack/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── nginx/
│ │ │ │ │ ├── fastcgi.conf
│ │ │ │ │ ├── nginx.conf
│ │ │ │ │ └── nginx.template
│ │ │ │ ├── php/
│ │ │ │ │ ├── php-fpm.conf
│ │ │ │ │ └── php.ini
│ │ │ │ └── web/
│ │ │ │ └── index.html
│ │ │ ├── devbox.json
│ │ │ ├── my_app/
│ │ │ │ ├── config.php
│ │ │ │ ├── index.php
│ │ │ │ └── info.php
│ │ │ └── setup_postgres_db.sql
│ │ ├── rails/
│ │ │ ├── .ruby-version
│ │ │ ├── README.md
│ │ │ ├── blog/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .ruby-version
│ │ │ │ ├── Gemfile
│ │ │ │ ├── Rakefile
│ │ │ │ ├── app/
│ │ │ │ │ ├── assets/
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ └── manifest.js
│ │ │ │ │ │ ├── images/
│ │ │ │ │ │ │ └── .keep
│ │ │ │ │ │ └── stylesheets/
│ │ │ │ │ │ └── application.css
│ │ │ │ │ ├── channels/
│ │ │ │ │ │ └── application_cable/
│ │ │ │ │ │ ├── channel.rb
│ │ │ │ │ │ └── connection.rb
│ │ │ │ │ ├── controllers/
│ │ │ │ │ │ ├── application_controller.rb
│ │ │ │ │ │ └── concerns/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── helpers/
│ │ │ │ │ │ └── application_helper.rb
│ │ │ │ │ ├── jobs/
│ │ │ │ │ │ └── application_job.rb
│ │ │ │ │ ├── mailers/
│ │ │ │ │ │ └── application_mailer.rb
│ │ │ │ │ ├── models/
│ │ │ │ │ │ ├── application_record.rb
│ │ │ │ │ │ └── concerns/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ └── views/
│ │ │ │ │ └── layouts/
│ │ │ │ │ ├── application.html.erb
│ │ │ │ │ ├── mailer.html.erb
│ │ │ │ │ └── mailer.text.erb
│ │ │ │ ├── bin/
│ │ │ │ │ ├── bundle
│ │ │ │ │ ├── rails
│ │ │ │ │ ├── rake
│ │ │ │ │ └── setup
│ │ │ │ ├── config/
│ │ │ │ │ ├── application.rb
│ │ │ │ │ ├── boot.rb
│ │ │ │ │ ├── cable.yml
│ │ │ │ │ ├── credentials.yml.enc
│ │ │ │ │ ├── database.yml
│ │ │ │ │ ├── environment.rb
│ │ │ │ │ ├── environments/
│ │ │ │ │ │ ├── development.rb
│ │ │ │ │ │ ├── production.rb
│ │ │ │ │ │ └── test.rb
│ │ │ │ │ ├── initializers/
│ │ │ │ │ │ ├── assets.rb
│ │ │ │ │ │ ├── content_security_policy.rb
│ │ │ │ │ │ ├── filter_parameter_logging.rb
│ │ │ │ │ │ ├── inflections.rb
│ │ │ │ │ │ └── permissions_policy.rb
│ │ │ │ │ ├── locales/
│ │ │ │ │ │ └── en.yml
│ │ │ │ │ ├── puma.rb
│ │ │ │ │ ├── routes.rb
│ │ │ │ │ └── storage.yml
│ │ │ │ ├── config.ru
│ │ │ │ ├── db/
│ │ │ │ │ ├── schema.rb
│ │ │ │ │ └── seeds.rb
│ │ │ │ ├── lib/
│ │ │ │ │ ├── assets/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ └── tasks/
│ │ │ │ │ └── .keep
│ │ │ │ ├── log/
│ │ │ │ │ └── .keep
│ │ │ │ ├── public/
│ │ │ │ │ ├── 404.html
│ │ │ │ │ ├── 422.html
│ │ │ │ │ ├── 500.html
│ │ │ │ │ └── robots.txt
│ │ │ │ ├── storage/
│ │ │ │ │ └── .keep
│ │ │ │ ├── test/
│ │ │ │ │ ├── application_system_test_case.rb
│ │ │ │ │ ├── channels/
│ │ │ │ │ │ └── application_cable/
│ │ │ │ │ │ └── connection_test.rb
│ │ │ │ │ ├── controllers/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── fixtures/
│ │ │ │ │ │ └── files/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── helpers/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── integration/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── mailers/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── models/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── system/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ └── test_helper.rb
│ │ │ │ └── tmp/
│ │ │ │ ├── .keep
│ │ │ │ ├── pids/
│ │ │ │ │ └── .keep
│ │ │ │ └── storage/
│ │ │ │ └── .keep
│ │ │ ├── devbox.json
│ │ │ └── process-compose.yml
│ │ └── spring/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── build.gradle
│ │ ├── devbox.json
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── settings.gradle
│ │ ├── setup_db.sql
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── devbox/
│ │ │ │ └── example/
│ │ │ │ └── spring/
│ │ │ │ └── spring/
│ │ │ │ ├── Application.java
│ │ │ │ ├── MainController.java
│ │ │ │ ├── User.java
│ │ │ │ └── UserRepository.java
│ │ │ └── resources/
│ │ │ └── application.properties
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── devbox/
│ │ └── example/
│ │ └── spring/
│ │ └── spring/
│ │ └── ApplicationTests.java
│ └── tutorial/
│ ├── README.md
│ └── devbox.json
├── flake.nix
├── go.mod
├── go.sum
├── internal/
│ ├── boxcli/
│ │ ├── add.go
│ │ ├── args.go
│ │ ├── auth.go
│ │ ├── cache.go
│ │ ├── config.go
│ │ ├── create.go
│ │ ├── env.go
│ │ ├── featureflag/
│ │ │ ├── auth.go
│ │ │ ├── feature.go
│ │ │ ├── feature_test.go
│ │ │ ├── impure_print_dev_env.go
│ │ │ ├── resolvev2.go
│ │ │ ├── script_exit_on_error.go
│ │ │ └── tidywarning.go
│ │ ├── gen-docs.go
│ │ ├── generate.go
│ │ ├── global.go
│ │ ├── info.go
│ │ ├── init.go
│ │ ├── install.go
│ │ ├── integrate.go
│ │ ├── list.go
│ │ ├── log.go
│ │ ├── midcobra/
│ │ │ ├── debug.go
│ │ │ ├── midcobra.go
│ │ │ ├── telemetry.go
│ │ │ ├── telemetry_test.go
│ │ │ └── trace.go
│ │ ├── multi/
│ │ │ ├── multi.go
│ │ │ └── sync.go
│ │ ├── patch.go
│ │ ├── path.go
│ │ ├── pull.go
│ │ ├── push.go
│ │ ├── rm.go
│ │ ├── root.go
│ │ ├── run.go
│ │ ├── search.go
│ │ ├── secrets.go
│ │ ├── services.go
│ │ ├── setup.go
│ │ ├── shell.go
│ │ ├── shellenv.go
│ │ ├── update.go
│ │ ├── usererr/
│ │ │ ├── exiterr.go
│ │ │ └── usererr.go
│ │ └── version.go
│ ├── build/
│ │ └── build.go
│ ├── cachehash/
│ │ ├── hash.go
│ │ └── hash_test.go
│ ├── cmdutil/
│ │ ├── cmdutil.go
│ │ └── exec.go
│ ├── conf/
│ │ ├── doc.go
│ │ └── env.go
│ ├── cuecfg/
│ │ ├── cuecfg.go
│ │ ├── doc.go
│ │ ├── json.go
│ │ ├── toml.go
│ │ ├── xml.go
│ │ └── yaml.go
│ ├── debug/
│ │ ├── debug.go
│ │ └── time.go
│ ├── devbox/
│ │ ├── cache.go
│ │ ├── devbox.go
│ │ ├── devbox_test.go
│ │ ├── devopt/
│ │ │ └── devboxopts.go
│ │ ├── docgen/
│ │ │ ├── docgen.go
│ │ │ └── readme.tmpl
│ │ ├── envpath/
│ │ │ ├── pathlists.go
│ │ │ ├── pathlists_test.go
│ │ │ ├── stack.go
│ │ │ └── stack_test.go
│ │ ├── envvars.go
│ │ ├── errors.go
│ │ ├── flakes.go
│ │ ├── generate/
│ │ │ ├── devcontainer_util.go
│ │ │ └── tmpl/
│ │ │ ├── DevboxImageDockerfile
│ │ │ ├── DevboxImageDockerfileRootUser
│ │ │ ├── Dockerfile.dockerignore.tmpl
│ │ │ ├── dev.Dockerfile.tmpl
│ │ │ ├── envrc.tmpl
│ │ │ ├── envrcContent.tmpl
│ │ │ └── prod.Dockerfile.tmpl
│ │ ├── global.go
│ │ ├── nixprofile.go
│ │ ├── packages.go
│ │ ├── providers/
│ │ │ ├── identity/
│ │ │ │ └── identity.go
│ │ │ └── nixcache/
│ │ │ ├── nixcache.go
│ │ │ └── setup.go
│ │ ├── pure_shell.go
│ │ ├── pushpull.go
│ │ ├── refresh.go
│ │ ├── secrets.go
│ │ ├── services.go
│ │ ├── shell.go
│ │ ├── shell_test.go
│ │ ├── shellcmd/
│ │ │ ├── command.go
│ │ │ └── command_test.go
│ │ ├── shellrc.tmpl
│ │ ├── shellrc_fish.tmpl
│ │ ├── testdata/
│ │ │ └── shellrc/
│ │ │ ├── basic/
│ │ │ │ ├── env
│ │ │ │ ├── shellrc
│ │ │ │ └── shellrc.golden
│ │ │ ├── noshellrc/
│ │ │ │ └── shellrc.golden
│ │ │ └── zsh_zdotdir/
│ │ │ ├── env
│ │ │ ├── shellrc
│ │ │ └── shellrc.golden
│ │ ├── update.go
│ │ ├── update_test.go
│ │ └── util.go
│ ├── devconfig/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── configfile/
│ │ │ ├── ast.go
│ │ │ ├── env.go
│ │ │ ├── field.go
│ │ │ ├── file.go
│ │ │ ├── file_test.go
│ │ │ ├── packages.go
│ │ │ ├── packages_test.go
│ │ │ └── scripts.go
│ │ └── init.go
│ ├── devpkg/
│ │ ├── narinfo_cache.go
│ │ ├── outputs.go
│ │ ├── package.go
│ │ ├── package_test.go
│ │ ├── pkgtype/
│ │ │ ├── flake.go
│ │ │ └── runx.go
│ │ └── validation.go
│ ├── envir/
│ │ ├── env.go
│ │ └── util.go
│ ├── fileutil/
│ │ ├── dir.go
│ │ ├── fileutil.go
│ │ ├── fileutil_test.go
│ │ └── untar.go
│ ├── goutil/
│ │ ├── goutil.go
│ │ └── sync.go
│ ├── lock/
│ │ ├── interfaces.go
│ │ ├── lockfile.go
│ │ ├── package.go
│ │ ├── resolve.go
│ │ └── statehash.go
│ ├── nix/
│ │ ├── build.go
│ │ ├── cache.go
│ │ ├── command.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── doc.go
│ │ ├── eval.go
│ │ ├── flake.go
│ │ ├── install.go
│ │ ├── install_test.go
│ │ ├── instance.go
│ │ ├── nix.go
│ │ ├── nix_test.go
│ │ ├── nixpkgs.go
│ │ ├── nixprofile/
│ │ │ ├── item.go
│ │ │ ├── profile.go
│ │ │ ├── profile_test.go
│ │ │ └── upgrade.go
│ │ ├── profiles.go
│ │ ├── run.go
│ │ ├── search.go
│ │ ├── search_test.go
│ │ ├── shim.go
│ │ ├── store.go
│ │ ├── store_test.go
│ │ ├── storepath.go
│ │ ├── storepath_test.go
│ │ ├── upgrade.go
│ │ └── writer.go
│ ├── patchpkg/
│ │ ├── builder.go
│ │ ├── elf.go
│ │ ├── glibc-patch.bash
│ │ ├── patch.go
│ │ └── search.go
│ ├── plugin/
│ │ ├── files.go
│ │ ├── git.go
│ │ ├── git_test.go
│ │ ├── github.go
│ │ ├── github_test.go
│ │ ├── includable.go
│ │ ├── includes.go
│ │ ├── info.go
│ │ ├── local.go
│ │ ├── manager.go
│ │ ├── plugin.go
│ │ ├── rm.go
│ │ ├── services.go
│ │ └── update.go
│ ├── pullbox/
│ │ ├── config.go
│ │ ├── download.go
│ │ ├── files.go
│ │ ├── git/
│ │ │ ├── git.go
│ │ │ └── push.go
│ │ ├── pullbox.go
│ │ ├── s3/
│ │ │ ├── config.go
│ │ │ ├── pull.go
│ │ │ └── push.go
│ │ └── tar/
│ │ └── tar.go
│ ├── redact/
│ │ ├── redact.go
│ │ └── redact_test.go
│ ├── searcher/
│ │ ├── client.go
│ │ ├── model.go
│ │ ├── parse.go
│ │ └── parse_test.go
│ ├── services/
│ │ ├── client.go
│ │ ├── config.go
│ │ ├── manager.go
│ │ ├── ports.go
│ │ ├── services.go
│ │ └── status.go
│ ├── setup/
│ │ ├── setup.go
│ │ └── setup_test.go
│ ├── shellgen/
│ │ ├── doc.go
│ │ ├── flake_input.go
│ │ ├── flake_plan.go
│ │ ├── flake_plan_test.go
│ │ ├── generate.go
│ │ ├── generate_test.go
│ │ ├── nixpkgs.go
│ │ ├── path.go
│ │ ├── scripts.go
│ │ ├── testdata/
│ │ │ ├── flake-empty.nix.golden
│ │ │ └── flake.nix.golden
│ │ └── tmpl/
│ │ ├── .gitignore.tmpl
│ │ ├── flake.nix.tmpl
│ │ ├── glibc-patch.nix.tmpl
│ │ ├── script-wrapper.tmpl
│ │ └── shell.nix.tmpl
│ ├── telemetry/
│ │ ├── segment.go
│ │ ├── sentry.go
│ │ ├── telemetry.go
│ │ └── telemetry_test.go
│ ├── templates/
│ │ ├── template.go
│ │ ├── templates.go
│ │ └── templates_test.go
│ ├── ux/
│ │ └── messages.go
│ ├── vercheck/
│ │ ├── vercheck.go
│ │ └── vercheck_test.go
│ └── xdg/
│ └── xdg.go
├── nix/
│ ├── command.go
│ ├── flake/
│ │ ├── flakeref.go
│ │ └── flakeref_test.go
│ ├── install.go
│ ├── nix.go
│ └── nix_test.go
├── pkg/
│ └── autodetect/
│ ├── autodetect.go
│ └── detector/
│ ├── detector.go
│ ├── go.go
│ ├── go_test.go
│ ├── nodejs.go
│ ├── nodejs_test.go
│ ├── php.go
│ ├── php_test.go
│ ├── poetry.go
│ └── python.go
├── plugins/
│ ├── README.md
│ ├── apache/
│ │ ├── httpd.conf
│ │ └── process-compose.yaml
│ ├── apacheHttpd.json
│ ├── builtins.go
│ ├── builtins_test.go
│ ├── caddy/
│ │ ├── Caddyfile
│ │ └── process-compose.yaml
│ ├── caddy.json
│ ├── elixir.json
│ ├── gradle.json
│ ├── haskell/
│ │ └── flake.nix
│ ├── haskell.json
│ ├── mariadb/
│ │ ├── flake.nix
│ │ ├── my.cnf
│ │ ├── process-compose.yaml
│ │ └── setup_db.sh
│ ├── mariadb.json
│ ├── mysql/
│ │ ├── flake.nix
│ │ ├── my.cnf
│ │ ├── process-compose.yaml
│ │ └── setup_db.sh
│ ├── mysql.json
│ ├── nginx/
│ │ ├── fastcgi.conf
│ │ ├── nginx.conf
│ │ ├── nginx.template
│ │ └── process-compose.yaml
│ ├── nginx.json
│ ├── nodejs.json
│ ├── php/
│ │ ├── flake.nix
│ │ ├── php-fpm.conf
│ │ ├── php.ini
│ │ └── process-compose.yaml
│ ├── php.json
│ ├── poetry/
│ │ └── initHook.sh
│ ├── poetry.json
│ ├── postgresql/
│ │ └── process-compose.yaml
│ ├── postgresql.json
│ ├── python/
│ │ └── venvShellHook.sh
│ ├── python.json
│ ├── redis/
│ │ ├── process-compose.yaml
│ │ └── redis.conf
│ ├── redis.json
│ ├── ruby.json
│ ├── rustc.json
│ ├── rustup.json
│ ├── valkey/
│ │ ├── process-compose.yaml
│ │ └── valkey.conf
│ ├── valkey.json
│ └── web/
│ └── index.html
├── scripts/
│ └── gofumpt.sh
├── testscripts/
│ ├── Dockerfile
│ ├── README.md
│ ├── add/
│ │ ├── add.test.txt
│ │ ├── add_insecure.tst.txt
│ │ ├── add_outputs.test.txt
│ │ ├── add_platforms.test.txt
│ │ ├── add_platforms_flakeref.test.txt
│ │ ├── add_replace.test.txt
│ │ └── global_add.test.txt
│ ├── assert/
│ │ └── assert.test.txt
│ ├── basic/
│ │ ├── default_test_env.test.txt
│ │ ├── install_hello.test.txt
│ │ └── path_whitespace.test.txt
│ ├── generate/
│ │ ├── devcontainer.test.txt
│ │ ├── direnv-config-envflag.test.txt
│ │ ├── direnv-config.test.txt
│ │ ├── direnv-envflag.test.txt
│ │ ├── direnv-envrcdir-config-parent.test.txt
│ │ ├── direnv-envrcdir-config-sibling.test.txt
│ │ ├── direnv-envrcdir-config-subdir-envflag.test.txt
│ │ ├── direnv-envrcdir-config-subdir.test.txt
│ │ ├── direnv-envrcdir-current-config-sub.test.txt
│ │ ├── direnv-envrcdir-fail-no-config.test.txt
│ │ ├── direnv-envrcdir-parent-no-config.test.txt
│ │ ├── direnv-envrcdir-parent.test.txt
│ │ ├── direnv-envrcdir.test.txt
│ │ ├── direnv-printenvrc-config.test.txt
│ │ ├── direnv-printenvrc-envrcdir.test.txt
│ │ ├── direnv-printenvrc.test.txt
│ │ ├── direnv.test.txt
│ │ └── dockerfile.test.txt
│ ├── info/
│ │ └── info.test.txt
│ ├── init/
│ │ └── empty.test.txt
│ ├── languages/
│ │ ├── php.test.txt
│ │ ├── python_patch_cuda.test.txt
│ │ ├── python_patch_missing_ref.test.txt
│ │ ├── python_patch_missing_so.test.txt
│ │ └── python_patch_old_glibc.test.txt
│ ├── lockfile/
│ │ ├── lockfile_tidy.test.txt
│ │ └── nopaths.txt
│ ├── packages/
│ │ ├── flakes.test.txt
│ │ └── unfree.test.txt
│ ├── plugin/
│ │ ├── disable-plugin.test.txt
│ │ ├── plugin.cycle.test.txt
│ │ └── plugin.test.txt
│ ├── rm/
│ │ ├── add-rm.test.txt
│ │ ├── manual.test.txt
│ │ ├── multi.test.txt
│ │ └── rm.test.txt
│ ├── run/
│ │ ├── args.test.txt
│ │ ├── env.test.txt
│ │ ├── envfrom.test.txt
│ │ ├── path.test.txt
│ │ ├── pure.test.txt
│ │ ├── quote_escaping.test.txt
│ │ ├── script.test.txt
│ │ ├── script_exit_on_error.test.txt
│ │ └── shellception.test.txt
│ ├── shell/
│ │ └── shellenv.test.txt
│ ├── shellenv/
│ │ └── node/
│ │ ├── README.md
│ │ ├── devbox.json
│ │ ├── less-out/
│ │ │ └── style.css
│ │ ├── less-src/
│ │ │ └── style.less
│ │ └── package.json
│ ├── testrunner/
│ │ ├── assert.go
│ │ ├── examplesrunner.go
│ │ ├── run_test.test.txt
│ │ ├── setupenv.go
│ │ ├── source.go
│ │ ├── testrunner.go
│ │ └── updater/
│ │ └── main.go
│ ├── testscripts_test.go
│ └── update/
│ └── update.test.txt
├── typos.toml
├── vendor-hash
└── vscode-extension/
├── .eslintrc.json
├── .gitignore
├── .vscodeignore
├── .yarnrc
├── CHANGELOG.md
├── LICENSE
├── README.md
├── package.json
├── src/
│ ├── devbox.ts
│ ├── extension.ts
│ ├── openinvscode.ts
│ └── test/
│ ├── runTest.ts
│ └── suite/
│ ├── extension.test.ts
│ └── index.ts
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .envrc
================================================
#!/usr/bin/env bash
# Automatically sets up your devbox environment whenever you cd into this
# directory via our direnv integration:
eval "$(devbox generate direnv --print-envrc)"
# check out https://www.jetify.com/docs/devbox/ide_configuration/direnv/
# for more details
================================================
FILE: .gitattributes
================================================
*.go diff=golang
*.sh diff=bash
*.md diff=markdown
*.py diff=python
*.sql diff=sql
devbox.json linguist-language=json5
go.sum -diff linguist-generated
================================================
FILE: .github/ISSUE_TEMPLATE/01-bug.yaml
================================================
name: Bug Report
description: File a bug report
labels:
- bug
- triage
body:
- type: textarea
id: description
attributes:
label: What happened?
description: >-
Also include what you expected to happen and any other relevant details.
validations:
required: true
- type: textarea
id: repro
attributes:
label: Steps to reproduce
description: >-
What specific steps can we take to reproduce this issue?
Including a script would be much appreciated!
value: |
1.
2.
3.
- type: dropdown
id: commands
attributes:
label: Command
description: What Devbox command were you running when the bug occurred?
multiple: true
options:
- add
- auth
- create
- generate
- global
- info
- init
- install
- rm
- run
- search
- services
- shell
- shellenv
- update
- version
- type: textarea
id: devbox-json
attributes:
label: devbox.json
description: Please include a copy of your devbox.json file.
render: "jsonc"
- type: input
id: devbox-version
attributes:
label: Devbox version
description: "Paste the output of `devbox version`."
validations:
required: true
- type: input
id: nix-version
attributes:
label: Nix version
description: "Paste the output of `nix --version`."
- type: dropdown
id: system
attributes:
label: What system does this bug occur on?
options:
- macOS (Intel)
- macOS (Apple Silicon)
- Linux (x86-64)
- Linux (ARM64)
- Other (please include in the description above)
validations:
required: true
- type: textarea
id: logs
attributes:
label: Debug logs
description: >-
If possible, reproduce the bug with the `DEVBOX_DEBUG=1` environment
variable set and paste any output here.
For example: `DEVBOX_DEBUG=1 devbox run -- mycrash.sh`.
================================================
FILE: .github/ISSUE_TEMPLATE/02-feature.yaml
================================================
name: Feature Request
description: Suggest an idea or new feature
labels:
- feature
- triage
body:
- type: textarea
id: problem
attributes:
label: What problem are you trying to solve?
description: >-
Describe the problem you're trying to solve with this feature.
placeholder: I'm always frustrated when...
validations:
required: true
- type: textarea
id: solution
attributes:
label: What solution would you like?
description: >-
Describe the feature you would like to see implemented and explain how
it would address the problem you described above.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives you've considered
description: >-
Describe any alternative solutions or features you've considered. If you
know of any similar features requested before, please include links to
them.
================================================
FILE: .github/ISSUE_TEMPLATE/03-package-bug.yaml
================================================
name: Package Issue
description: Report a problem with an existing package on either Devbox or Nixhub
labels:
- package
- bug
- triage
body:
- type: input
id: name
attributes:
label: Package name
placeholder: go@1.21.6, python@3.10.13, etc.
validations:
required: true
- type: textarea
id: solution
attributes:
label: What changes are you requesting?
description: >-
Describe what's going wrong or what changes you'd like to see to the
package.
validations:
required: true
- type: input
id: link
attributes:
label: Nixhub link
placeholder: https://www.nixhub.io/packages/go
================================================
FILE: .github/ISSUE_TEMPLATE/04-package-request.yaml
================================================
name: Package Request
description: Request a new package to be added to Devbox and Nixhub
labels:
- package
- triage
body:
- type: input
id: name
attributes:
label: Package name
description: What name are you requesting for the new package?
validations:
required: true
- type: input
id: nixpkgs
attributes:
label: Nix package link
description: >-
Are you able to find the package on https://search.nixos.org/packages?
If so, please include a link to the search results. Otherwise, leave
blank.
- type: textarea
id: software
attributes:
label: Software
description: >-
Provide a description of the software that should be added to the new
package. Include any relevant links such as websites,
GitHub repositories, etc.
validations:
required: true
================================================
FILE: .github/pull_request_template.md
================================================
## Summary
## How was it tested?
## Community Contribution License
All community contributions in this pull request are licensed to the project
maintainers under the terms of the
[Apache 2 License](https://www.apache.org/licenses/LICENSE-2.0).
By creating this pull request, I represent that I have the right to license the
contributions to the project maintainers under the Apache 2 License as stated in
the
[Community Contribution License](https://github.com/jetify-com/opensource/blob/main/CONTRIBUTING.md#community-contribution-license).
================================================
FILE: .github/workflows/cache-upload.yml
================================================
name: cache-upload
# Uploads devbox nix dependencies to cache
on:
push:
branches:
- main
workflow_dispatch:
schedule:
- cron: '30 8 * * *' # Run nightly at 8:30 UTC
permissions:
contents: read
pull-requests: read
defaults:
run:
shell: bash
env:
DEVBOX_API_TOKEN: ${{ secrets.DEVBOX_API_TOKEN }}
DEVBOX_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DEVBOX_DEBUG: 1
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# I think this should be added to individual nix commands within devbox, but this is quick fix for now
NIX_CONFIG: |
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
jobs:
upload-cache:
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
# Build devbox from scratch because released devbox has a bug that prevents
# DEVBOX_API_TOKEN use
# we can remove this after 0.10.6 is out.
- uses: actions/setup-go@v5
with:
go-version-file: ./go.mod
- name: Build devbox
run: |
go build -o dist/devbox ./cmd/devbox
sudo mv ./dist/devbox /usr/local/bin/
# - name: Install devbox
# uses: jetify-com/devbox-install-action@v0.14.0
# with:
# enable-cache: true
# We upload twice, once before updating and once after. This shows a simple
# method to cache the latest current and latest dependencies.
# If we want read access to cache on multi-user nix installs (e.g. macos),
# we need to call devbox cache configure. This is currently not working
# as expected on CICD.
- name: Upload cache
run: |
devbox cache upload
devbox update
devbox cache upload
================================================
FILE: .github/workflows/cli-post-release.yml
================================================
name: cli-post-release
# Finalize and announce the release once its been published on Github.
on:
release:
types: [released]
permissions:
contents: write
pull-requests: read
id-token: write # Needed for aws-actions/configure-aws-credentials@v1
jobs:
publish:
runs-on: ubuntu-latest
environment: release
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: ${{ secrets.AWS_ROLE }}
aws-region: us-west-2
- name: Update latest version in s3
run: |
tmp_file=$(mktemp)
echo "${{ github.ref_name }}" > $tmp_file
aws s3 cp $tmp_file s3://releases.jetpack.io/devbox/stable/version
================================================
FILE: .github/workflows/cli-release.yml
================================================
name: cli-release
# Releases the Devbox CLI
concurrency: cli-release
on:
# Build/Release on demand
workflow_dispatch:
inputs:
create_edge_release:
description: "Create edge release?"
required: false
default: false
type: boolean
schedule:
- cron: "45 8 * * 4" # Create edge weekly on Thursdays.
push:
tags:
- "*" # Tags that trigger a new release version
permissions:
contents: write
pull-requests: read
id-token: write # Needed for aws-actions/configure-aws-credentials@v1
jobs:
tests:
uses: ./.github/workflows/cli-tests.yaml
report-test-failures:
runs-on: ubuntu-latest
needs: tests
if: failure() || cancelled()
steps:
- name: Notify jetpack.io slack of release status (only if tests fail)
id: slack
uses: slackapi/slack-github-action@v1.25.0
with:
payload: |
{
"status": "test ${{ needs.tests.result }}"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLI_RELEASE_WEBHOOK_URL }}
edge:
runs-on: ubuntu-latest
environment: release
needs: tests
if: ${{ inputs.create_edge_release || github.event.schedule }}
steps:
- name: Checkout source code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Needed by goreleaser to browse history.
- name: Determine edge tag
# This tag is semver and works with semver.Compare
run: echo "EDGE_TAG=0.0.0-edge.$(date +%Y-%m-%d)" >> $GITHUB_ENV
- name: Set edge tag
id: tag_version
uses: mathieudutour/github-tag-action@v6.1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
custom_tag: ${{ env.EDGE_TAG }}
tag_prefix: ""
- name: Set up go
uses: actions/setup-go@v5
with:
go-version-file: ./go.mod
- name: Build snapshot with goreleaser
uses: goreleaser/goreleaser-action@v6
with:
distribution: goreleaser
version: latest
args: release --clean --skip=announce,publish --snapshot
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TELEMETRY_KEY: ${{ secrets.TELEMETRY_KEY }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
- name: Create Sentry release
uses: getsentry/action-release@v1
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ vars.SENTRY_ORG }}
SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }}
with:
environment: development
version: ${{ env.EDGE_TAG }}
version_prefix: "devbox@"
- name: Publish snapshot release to GitHub
uses: softprops/action-gh-release@v1
with:
prerelease: true
body: "${{ env.EDGE_TAG }} edge release"
fail_on_unmatched_files: true
tag_name: ${{ env.EDGE_TAG }}
files: |
dist/checksums.txt
dist/*.tar.gz
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: ${{ secrets.AWS_ROLE }}
aws-region: us-west-2
- name: Update edge version in s3
run: |
tmp_file=$(mktemp)
echo "${{ env.EDGE_TAG }}" > $tmp_file
aws s3 cp $tmp_file s3://releases.jetpack.io/devbox/edge/version
release:
runs-on: ubuntu-latest
environment: release
needs: tests
# Only release when there's a tag for the release.
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Checkout source code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Needed by goreleaser to browse history.
- name: Set up go
uses: actions/setup-go@v5
with:
go-version-file: ./go.mod
- name: Create Sentry release
uses: getsentry/action-release@v1
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ vars.SENTRY_ORG }}
SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }}
with:
environment: production
version: ${{ github.ref }}
version_prefix: "devbox@"
- name: Release with goreleaser
uses: goreleaser/goreleaser-action@v3
with:
distribution: goreleaser
version: latest
args: release --clean
env:
DISCORD_WEBHOOK_ID: ${{ secrets.DISCORD_WEBHOOK_ID }}
DISCORD_WEBHOOK_TOKEN: ${{ secrets.DISCORD_WEBHOOK_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TELEMETRY_KEY: ${{ secrets.TELEMETRY_KEY }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
- name: Notify jetpack.io slack of release status
id: slack
if: always()
uses: slackapi/slack-github-action@v1.25.0
with:
payload: |
{
"status": "release ${{ job.status }}"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CLI_RELEASE_WEBHOOK_URL }}
================================================
FILE: .github/workflows/cli-tests.yaml
================================================
name: cli-tests
# Runs the Devbox CLI tests
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
on:
pull_request:
push:
branches:
- main
merge_group:
branches:
- main
workflow_call:
inputs:
run-mac-tests:
type: boolean
workflow_dispatch:
inputs:
run-mac-tests:
type: boolean
description: Run tests on macOS
example-debug:
type: boolean
description: Run example tests with DEVBOX_DEBUG=1 to increase verbosity
schedule:
- cron: '30 8 * * *' # Run nightly at 8:30 UTC
permissions:
contents: read
pull-requests: read
defaults:
run:
# Explicitly setting the shell to bash runs commands with
# `bash --noprofile --norc -eo pipefail` instead of `bash -e`.
shell: bash
env:
DEVBOX_DEBUG: 1
DEVBOX_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HOMEBREW_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HOMEBREW_NO_ANALYTICS: 1
HOMEBREW_NO_AUTO_UPDATE: 1
HOMEBREW_NO_EMOJI: 1
HOMEBREW_NO_ENV_HINTS: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
NIX_CONFIG: |
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
jobs:
build-devbox:
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: ./go.mod
- name: Build devbox
run: go build -o dist/devbox ./cmd/devbox
- name: Upload devbox artifact
uses: actions/upload-artifact@v4
with:
name: devbox-${{ runner.os }}-${{ runner.arch }}
path: ./dist/devbox
retention-days: 7
typos:
name: Spell Check with Typos
if: github.ref != 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: crate-ci/typos@v1.16.26
flake-test:
name: Test Flake Build
if: github.ref != 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install devbox
uses: jetify-com/devbox-install-action@jl/migrate-installer
with:
enable-cache: true
- name: Build flake
run: |
if ! devbox run build-flake; then
echo "::warning::If this fails, you probably have to run 'devbox run update-hash'"
exit 1
fi
- run: ./result/bin/devbox version
golangci-lint:
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Install devbox
uses: jetify-com/devbox-install-action@jl/migrate-installer
with:
enable-cache: true
- name: Mount golang cache
uses: actions/cache@v4
with:
path: |
~/.cache/golangci-lint
~/.cache/go-build
~/go/pkg
key: go-${{ runner.os }}-${{ hashFiles('go.sum') }}
- run: devbox run lint
test:
needs: build-devbox
strategy:
matrix:
is-main:
- ${{ github.ref == 'refs/heads/main' && 'is-main' || 'not-main' }}
os: [ubuntu-latest, macos-latest]
# This is an optimization that runs tests twice, with and without
# the devbox.json tests. We can require the other tests to complete before
# merging, while keeping the others as an additional non-required signal
run-project-tests: ["project-tests-only", "project-tests-off"]
# Run tests on:
# 1. the oldest supported nix version (Nixpkgs requires >= 2.18 as of 2026)
# 2. nix 2.19.2: version before nix profile changes
# 3. latest nix version (note, 2.20.1 introduced a new profile change)
nix-version: ["2.18.0", "2.19.2", "2.30.2"]
exclude:
# Only runs tests on macos if explicitly requested, or on a schedule
- os: "${{ (inputs.run-mac-tests || github.event.schedule != '') && 'dummy' || 'macos-latest' }}"
runs-on: ${{ matrix.os }}
timeout-minutes: 60
env:
# For devbox.json tests, we default to non-debug mode since the debug output is less useful than for unit testscripts.
# But we allow overriding via inputs.example-debug
DEVBOX_DEBUG: ${{ (matrix.run-project-tests == 'project-tests-off' || inputs.example-debug) && '1' || '0' }}
DEVBOX_GOLANG_TEST_TIMEOUT: "${{ (github.ref == 'refs/heads/main' || inputs.run-mac-tests) && '1h' || '30m' }}"
steps:
- name: clear directories to reduce disk usage
# https://github.com/actions/runner-images/issues/2840#issuecomment-1284059930
run: |
sudo rm -rf /usr/share/dotnet
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
- uses: actions/checkout@v4
- name: Mount golang cache
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg
key: go-devbox-tests-${{ runner.os }}-${{ hashFiles('go.sum') }}
- name: Install additional shells (dash, zsh)
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt-get update
sudo apt-get install dash zsh
elif [ "$RUNNER_OS" == "macOS" ]; then
brew update
brew install dash zsh
fi
- name: Install devbox
uses: jetify-com/devbox-install-action@jl/migrate-installer
with:
enable-cache: true
- name: Setup Nix GitHub authentication
run: |
# Setup github authentication to ensure Github's rate limits are not hit
# For macOS, we need to configure the system-wide nix.conf because the Nix daemon
# runs as a different user and doesn't read the user's ~/.config/nix/nix.conf
if [ "$RUNNER_OS" == "macOS" ]; then
echo "Configuring system-wide Nix config for macOS daemon"
# Ensure /etc/nix directory exists
if [ ! -d /etc/nix ]; then
sudo mkdir -p /etc/nix
fi
# Check if file exists, create it if not
if [ ! -f /etc/nix/nix.conf ]; then
echo "# Nix configuration" | sudo tee /etc/nix/nix.conf > /dev/null
fi
echo "access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}" | sudo tee -a /etc/nix/nix.conf
# Restart nix daemon to pick up the new configuration
sudo launchctl stop org.nixos.nix-daemon || true
sudo launchctl start org.nixos.nix-daemon || true
sleep 2 # Give daemon time to restart
fi
# For Linux and as a backup for macOS, also configure user config
mkdir -p ~/.config/nix
echo "access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}" > ~/.config/nix/nix.conf
- name: Run fast tests
if: matrix.run-project-tests == 'project-tests-off'
run: |
echo "::group::Nix version"
nix --version
echo "::endgroup::"
echo "::group::Contents of /etc/nix/nix.conf"
cat /etc/nix/nix.conf || true
echo "::endgroup::"
echo "::group::Resolved Nix config"
nix show-config --extra-experimental-features nix-command
echo "::endgroup::"
devbox run go test -v -timeout $DEVBOX_GOLANG_TEST_TIMEOUT ./...
- name: Run project (slow) tests
if: matrix.run-project-tests == 'project-tests-only'
run: devbox run test-projects-only
auto-nix-install: # ensure Devbox installs nix and works properly after installation.
needs: build-devbox
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
use-detsys: [true, false]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Download devbox
uses: actions/download-artifact@v4
with:
name: devbox-${{ runner.os }}-${{ runner.arch }}
- name: Add devbox to path
run: |
chmod +x ./devbox
sudo mv ./devbox /usr/local/bin/
- name: Install nix and devbox packages
run: |
export NIX_INSTALLER_NO_CHANNEL_ADD=1
export DEVBOX_FEATURE_DETSYS_INSTALLER=${{ matrix.use-detsys }}
# Setup github authentication BEFORE running devbox to ensure Github's rate limits are not hit.
# Configure user config first (Nix installer will respect this)
mkdir -p ~/.config/nix
echo "access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}" > ~/.config/nix/nix.conf
# Run devbox which will auto-install Nix if needed
devbox run echo "Installing packages..."
# After Nix is installed, configure system-wide config for the daemon on macOS
if [ "$RUNNER_OS" == "macOS" ]; then
echo "Configuring system-wide Nix config for macOS daemon"
# Check if file exists, create directory if needed
if [ ! -f /etc/nix/nix.conf ]; then
sudo mkdir -p /etc/nix
echo "# Nix configuration" | sudo tee /etc/nix/nix.conf > /dev/null
fi
echo "access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}" | sudo tee -a /etc/nix/nix.conf
# Restart nix daemon to pick up the new configuration
sudo launchctl stop org.nixos.nix-daemon || true
sudo launchctl start org.nixos.nix-daemon || true
sleep 2 # Give daemon time to restart
fi
- name: Test removing package
run: devbox rm go
# Run a sanity test to make sure Devbox can install and remove packages with
# the last few Nix releases.
test-nix-versions:
needs: build-devbox
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
nix-version: [2.18.0, 2.19.2, 2.24.7, 2.30.2]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Download devbox
uses: actions/download-artifact@v4
with:
name: devbox-${{ runner.os }}-${{ runner.arch }}
- name: Add devbox to path
run: |
chmod +x ./devbox
sudo mv ./devbox /usr/local/bin/
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@v4
with:
logger: pretty
extra-conf: experimental-features = ca-derivations fetch-closure
nix-package-url: https://releases.nixos.org/nix/nix-${{ matrix.nix-version }}/nix-${{ matrix.nix-version }}-${{ runner.arch == 'X64' && 'x86_64' || 'aarch64' }}-${{ runner.os == 'macOS' && 'darwin' || 'linux' }}.tar.xz
- name: Run devbox install, devbox run, devbox rm
run: |
echo "::group::Nix version"
nix --version
echo "::endgroup::"
echo "::group::Contents of /etc/nix/nix.conf"
cat /etc/nix/nix.conf || true
echo "::endgroup::"
echo "::group::Resolved Nix config"
nix show-config --extra-experimental-features nix-command
echo "::endgroup::"
devbox install
devbox run -- echo "Hello from devbox!"
devbox rm go
================================================
FILE: .github/workflows/debug.yaml
================================================
name: debug
on:
workflow_dispatch:
inputs:
runner:
description: "Runner type to debug on"
required: true
default: "ubuntu-latest"
type: choice
options:
- macos-latest
- ubuntu-latest
permissions:
contents: read
env:
HOMEBREW_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}"
HOMEBREW_NO_ANALYTICS: 1
HOMEBREW_NO_AUTO_UPDATE: 1
HOMEBREW_NO_EMOJI: 1
HOMEBREW_NO_ENV_HINTS: 1
HOMEBREW_NO_INSTALL_CLEANUP: 1
jobs:
debug:
runs-on: ${{ inputs.runner }}
timeout-minutes: 10
steps:
- name: Get rate limits
run: |
curl https://api.github.com/rate_limit \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
--show-error \
--silent \
| jq .
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: ./go.mod
- run: |
echo "Starting a tmate session for 10 minutes."
echo
echo "You can connect using the SSH command printed below to get an interactive shell"
echo "on this GitHub Actions runner. Access is limited to the public SSH keys"
echo "associated with your GitHub account."
curl https://api.github.com/users/${{ github.actor }}/keys \
-H "Accept: application/vnd.github+json" \
--show-error \
--silent \
| jq .
- uses: mxschmitt/action-tmate@v3
with:
limit-access-to-actor: true
================================================
FILE: .github/workflows/docker-image-release.yml
================================================
name: docker-image-release
on:
release:
types:
- published
workflow_dispatch:
inputs:
tag:
description: 'tag name'
required: true
default: ''
type: string
jobs:
docker-image-build-push:
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: |
jetpackio/devbox
tags: |
type=raw,value=${{ inputs.tag || github.ref_name }}
flavor: |
latest=false
- name: Docker meta root
id: metaroot
uses: docker/metadata-action@v5
with:
images: |
jetpackio/devbox-root-user
tags: |
type=raw,value=${{ inputs.tag || github.ref_name }}
flavor: |
latest=false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build and push default
uses: docker/build-push-action@v5
with:
context: ./internal/devbox/generate/tmpl/
file: ./internal/devbox/generate/tmpl/DevboxImageDockerfile
build-args: |
DEVBOX_USE_VERSION=${{ inputs.tag || github.ref_name }}
push: true
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
- name: Build and push root user
uses: docker/build-push-action@v5
with:
context: ./internal/devbox/generate/tmpl/
file: ./internal/devbox/generate/tmpl/DevboxImageDockerfileRootUser
build-args: |
DEVBOX_USE_VERSION=${{ inputs.tag || github.ref_name }}
push: true
platforms: linux/amd64,linux/arm64
tags: ${{ steps.metaroot.outputs.tags }}
- name: Docker meta latest
id: metalatest
uses: docker/metadata-action@v5
with:
images: |
jetpackio/devbox
tags: |
type=raw,value=latest
flavor: |
latest=true
- name: Build and push latest
uses: docker/build-push-action@v5
with:
context: ./internal/devbox/generate/tmpl/
file: ./internal/devbox/generate/tmpl/DevboxImageDockerfile
push: true
platforms: linux/amd64,linux/arm64
tags: ${{ steps.metalatest.outputs.tags }}
- name: Docker meta root latest
id: metarootlatest
uses: docker/metadata-action@v5
with:
images: |
jetpackio/devbox-root-user
tags: |
type=raw,value=latest
flavor: |
latest=true
- name: Build and push root user latest
uses: docker/build-push-action@v5
with:
context: ./internal/devbox/generate/tmpl/
file: ./internal/devbox/generate/tmpl/DevboxImageDockerfileRootUser
push: true
platforms: linux/amd64,linux/arm64
tags: ${{ steps.metarootlatest.outputs.tags }}
================================================
FILE: .github/workflows/random-reviewer-assignment.yml
================================================
name: Random Reviewer Assignment
on:
pull_request:
types: [opened]
permissions:
contents: read
pull-requests: write
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN_FOR_PR_ASSIGNMENT }}
jobs:
assign-reviewer:
runs-on: ubuntu-latest
steps:
- name: Randomly assign reviewer from team
uses: actions/github-script@v6
with:
script: |
const TRIAGE_USERNAME = 'Lagoja';
const EXCLUDE_USERNAMES = ['jetpack-io-bot'];
try {
const authenticatedUser = await github.rest.users.getAuthenticated();
const teamMembers = await github.rest.teams.listMembersInOrg({
org: 'jetify-com',
team_slug: 'eng'
});
const prAuthor = context.payload.pull_request.user.login.toLowerCase();
const prAuthorId = context.payload.pull_request.user.id;
const authenticatedUserLower = authenticatedUser.data.login.toLowerCase();
// If the PR author is already a member of the team, we can skip random assignment
const isPrAuthorInTeam = teamMembers.data.some(member =>
member.login.toLowerCase() === prAuthor && member.id === prAuthorId
);
if (isPrAuthorInTeam) {
console.log(`PR author ${prAuthor} is already a team member, skipping random assignment.`);
return;
}
// Get eligible reviewers (excluding PR author, authenticated user, and lagoja)
const eligibleReviewers = teamMembers.data
.filter(member => {
const loginLower = member.login.toLowerCase();
// Exclude authenticated user
const isNotAuthenticatedUser = member.id !== authenticatedUser.data.id;
const isNotTriage = loginLower !== TRIAGE_USERNAME.toLowerCase();
const isNotExcludedUsername = !EXCLUDE_USERNAMES.includes(loginLower);
return isNotAuthenticatedUser && isNotTriage && isNotExcludedUsername;
})
.map(member => member.login);
console.log(`Eligible reviewers: ${eligibleReviewers.join(', ')}`);
if (eligibleReviewers.length === 0) {
console.log('No eligible reviewers found');
return;
}
const randomReviewer = eligibleReviewers[Math.floor(Math.random() * eligibleReviewers.length)];
const reviewers = [randomReviewer];
// Only add TRIAGE_USERNAME if they're not the PR author and not the authenticated user
if (prAuthor !== TRIAGE_USERNAME.toLowerCase() &&
authenticatedUserLower !== TRIAGE_USERNAME.toLowerCase()) {
reviewers.push(TRIAGE_USERNAME);
}
console.log(`Final reviewers: ${reviewers.join(', ')}`);
console.log(`Assigning reviewers: ${reviewers.join(', ')}`);
await github.rest.pulls.requestReviewers({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
reviewers
});
} catch (error) {
console.error('Error assigning reviewer:', error);
}
================================================
FILE: .github/workflows/stale-issue-cleanup.yml
================================================
name: close-stale-issues
# Marks issues and PRs as stale after 30 days, then closes them if marked stale for 5 days
on:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v7
with:
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove the `stale` label or add a comment, otherwise this issue will be closed in 5 days.'
stale-pr-message: 'This PR is stale because it has been open 30 days with no activity. Remove the `stale` label or add a comment, otherwise this PR will be closed in 5 days.'
exempt-issue-labels: 'future'
exempt-pr-labels: 'awaiting-approval, work-in-progress'
days-before-stale: 45
days-before-close: 5
operations: 100
================================================
FILE: .github/workflows/vscode-ext-release.yaml
================================================
name: vscode-ext-release
# Releases the Devbox VSCode extension to the marketplace
concurrency: vscode-ext-release
on: workflow_dispatch
jobs:
build-publish:
runs-on: ubuntu-latest
environment: release
steps:
- name: Checkout
uses: actions/checkout@v5
- name: Setup NodeJS 24
uses: actions/setup-node@v5
with:
node-version: 24
- name: Install dependencies
run: |
npm install -g yarn
npm install -g vsce
npm install -g ovsx
yarn install
working-directory: vscode-extension
- name: publish-vs
run: |
vsce publish -p ${{ secrets.VS_MARKETPLACE_TOKEN }} --yarn --skip-duplicate
working-directory: vscode-extension
- name: publish-ovsx
run: |
sed -i 's/"publisher": "jetpack-io"/"publisher": "Jetify"/g' package.json
ovsx publish --pat ${{ secrets.OVSX_MARKETPLACE_TOKEN }} --yarn --skip-duplicate
working-directory: vscode-extension
================================================
FILE: .gitignore
================================================
# Global gitignore for the entire monorepo. Only add things here that truly
# need to always be ignored regardless of project.
#
# If something is more specific to a particular project, add a gitignore in the
# corresponding subdirectory.
# MacOS filesystem
.DS_Store
# Editors
.idea
.vscode
.zed
# NodeJS
node_modules
.yalc
dist
# Python
*.pyc
__pycache__/
*.py[cod]
*$py.class
# Java
*.class
*.jar
# devcontainer
*.devcontainer
# test specific files
.test_tmp_*
# deployment
.vercel
.yarn
# Nix
vendor/
result
================================================
FILE: .golangci.yml
================================================
linters:
disable-all: true
enable:
- dupl
- errcheck
- errorlint
- gofmt
- goimports
- gosimple
- govet
- importas
- ineffassign
- misspell
- nilerr
- reassign
- revive
- staticcheck
- stylecheck
- typecheck
- unconvert
- unparam
- unused
- usestdlibvars
- usetesting
- varnamelen
# - wrapcheck If we're going to use github.com/pkg/errors we should probably turn this on?
# We'd like to have the following linter enabled, but it's broken for Go
# 1.19 as of golangci-lint v1.48.0. Re-enable it when this issue is
# fixed: https://github.com/golangci/golangci-lint/issues/2649
# - structcheck
linters-settings:
errorlint:
errorf: false
revive:
rules: # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md
- name: atomic
- name: bare-return
- name: bool-literal-in-expr
- name: cognitive-complexity
exclude:
- "**_test.go"
arguments:
- 32 # TODO: gradually reduce it
- name: datarace
- name: duplicated-imports
- name: early-return
- name: error-return
- name: error-strings
- name: if-return
- name: indent-error-flow
- name: range-val-address
- name: receiver-naming
- name: time-naming
- name: var-naming
- name: unreachable-code
varnamelen:
max-distance: 10
ignore-decls:
- a []any
- c echo.Context
- const C
- e error
- e watch.Event
- f *foo.Bar
- f fmt.State
- i int
- id string
- m map[string]any
- m map[string]int
- n int
- ns string
- ok bool
- r *http.Request
- r io.Reader
- r *os.File
- re *regexp.Regexp
- sh *Shell
- sh *shell
- sh *shell.Shell
- sh shell
- T any
- t testing.T
- w http.ResponseWriter
- w io.Writer
- w *os.File
wrapcheck:
ignorePackageGlobs:
- go.jetify.com/devbox/*
misspell:
ignore-words:
- substituters
================================================
FILE: .goreleaser.yaml
================================================
project_name: devbox
before:
hooks:
- go mod tidy
builds:
- main: ./cmd/devbox/main.go
binary: devbox
flags:
- -trimpath
mod_timestamp: "{{ .CommitTimestamp }}" # For reproducible builds
ldflags:
- -s -w
- -X go.jetify.com/devbox/internal/build.Version={{.Version}}
- -X go.jetify.com/devbox/internal/build.Commit={{.Commit}}
- -X go.jetify.com/devbox/internal/build.CommitDate={{.CommitDate}}
- -X go.jetify.com/devbox/internal/build.SentryDSN={{ .Env.SENTRY_DSN }}
- -X go.jetify.com/devbox/internal/build.TelemetryKey={{ .Env.TELEMETRY_KEY }}
env:
- CGO_ENABLED=0
- GO111MODULE=on
goos:
- linux
- darwin
goarch:
- 386
- amd64
- arm64
- arm
goarm:
- 7
archives:
- files:
- no-files-will-match-* # Glob that does not match to create archive with only binaries.
name_template: '{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if eq .Arch "arm" }}v{{ .Arm }}l{{ end }}'
snapshot:
name_template: "{{ .Env.EDGE_TAG }}"
checksum:
name_template: "checksums.txt"
algorithm: sha256
release:
prerelease: auto
draft: true
github:
owner: jetify-com
name: devbox
announce:
discord:
# Whether its enabled or not.
# Defaults to false.
enabled: false
# Message template to use while publishing.
# Defaults to `{{ .ProjectName }} {{ .Tag }} is out! Check it out at {{ .ReleaseURL }}`
message_template: |
**New Release: Devbox {{.Tag}}**
We just released a version {{.Tag}} of `devbox`.
Description:
{{.TagBody}}
Release: {{.ReleaseURL}}
Updating:
If you installed devbox via our recommended installer
(`curl -fsSL https://get.jetpack.io/devbox | bash`) you will get the new version
_automatically_, the next time you run `devbox`
Thanks,
jetpack.io
# Set author of the embed.
# Defaults to `GoReleaser`
author: "jetpack.io"
# Color code of the embed. You have to use decimal numeral system, not hexadecimal.
# Defaults to `3888754` - the grey-ish from goreleaser
color: "2622553" #This is the Jetpack Space color
# URL to an image to use as the icon for the embed.
# Defaults to `https://goreleaser.com/static/avatar.png`
icon_url: ""
================================================
FILE: .schema/devbox-plugin.schema.json
================================================
{
"$schema": "https://json-schema.org/draft-04/schema#",
"$id": "https://github.com/jetify-com/devbox/plugins",
"title": "Devbox Plugin Schema",
"description": "Defines fields and values for public devbox plugins",
"type": "object",
"properties": {
"$schema": {
"description": "The schema version of this plugin file.",
"type": "string"
},
"name": {
"description": "The name of the plugin.",
"type": "string"
},
"version": {
"description": "The version of the plugin.",
"type": "string"
},
"description": {
"description": "A short description of the plugin and how it works. This will automatically display when the user first installs the plugin, or runs `devbox info`",
"type": "string"
},
"packages": {
"description": "Collection of packages to install",
"oneOf": [
{
"type": "array",
"items": {
"description": "Name and version of each package in name@version format.",
"type": "string"
}
},
{
"type": "object",
"description": "Name of each package in {\"name\": {\"version\": \"1.2.3\"}} format.",
"patternProperties": {
".*": {
"oneOf": [
{
"type": "object",
"description": "Version number of the specified package in {\"version\": \"1.2.3\"} format.",
"properties": {
"version": {
"type": "string",
"description": "Version of the package"
},
"platforms": {
"type": "array",
"description": "Names of platforms to install the package on. This package will be skipped for any platforms not on this list",
"items": {
"enum": [
"i686-linux",
"aarch64-linux",
"aarch64-darwin",
"x86_64-darwin",
"x86_64-linux",
"armv7l-linux"
]
}
},
"excluded_platforms": {
"type": "array",
"description": "Names of platforms to exclude the package on",
"items": {
"enum": [
"i686-linux",
"aarch64-linux",
"aarch64-darwin",
"x86_64-darwin",
"x86_64-linux",
"armv7l-linux"
]
}
},
"glibc_patch": {
"type": "boolean",
"description": "Whether to patch glibc to the latest available version for this package"
}
}
},
{
"type": "string",
"description": "Version of the package to install."
}
]
}
}
}
]
},
"env": {
"type": "object",
"description": "List of additional environment variables to be set in the Devbox environment. These can be overridden by environment variables set in the user's devbox.json",
"patternProperties": {
".*": {
"type": "string",
"description": "Value of the environment variable."
}
}
},
"create_files": {
"type": "object",
"description": "List of files to create in the user's project directory when the plugin is activated. The key points to the file path where the file will be created. The value points to the default file that should be copied to that location",
"patternProperties": {
".*": {
"type": "string",
"description": "Contents of the file."
}
}
},
"shell": {
"type": "object",
"description": "Shell specific options and hooks for the plugin.",
"items": {
"init_hook": {
"type": ["array", "string"],
"description": "Shell command to run right before initializing the user's shell, running a script, or starting a service"
},
"scripts": {
"description": "List of command/script definitions to run with `devbox run <script_name>`.",
"type": "object",
"patternProperties": {
".*": {
"description": "Alias name for the script.",
"type": ["array", "string"],
"items": {
"type": "string",
"description": "The script's shell commands."
}
}
}
}
}
},
"include": {
"description": "List of additional plugins to activate within your devbox shell",
"type": "array",
"items": {
"description": "Name of the plugin to activate.",
"type": "string"
}
}
},
"required": ["name", "version", "description"]
}
================================================
FILE: .schema/devbox.schema.json
================================================
{
"$schema": "http://json-schema.org/draft-04/schema#",
"$id": "https://github.com/jetify-com/devbox",
"title": "Devbox json definition",
"description": "Defines fields and acceptable values of devbox.json",
"type": "object",
"properties": {
"$schema": {
"description": "The schema version of this devbox.json file.",
"type": "string"
},
"name": {
"description": "The name of the Devbox development environment.",
"type": "string"
},
"description": {
"description": "A description of the Devbox development environment.",
"type": "string"
},
"packages": {
"description": "Collection of packages to install",
"oneOf": [
{
"type": "array",
"items": {
"description": "Name and version of each package in name@version format.",
"type": "string"
}
},
{
"type": "object",
"description": "Name of each package in {\"name\": {\"version\": \"1.2.3\"}} format.",
"patternProperties": {
".*": {
"oneOf": [
{
"type": "object",
"description": "Version number of the specified package in {\"version\": \"1.2.3\"} format.",
"properties": {
"version": {
"type": "string",
"description": "Version of the package"
},
"platforms": {
"type": "array",
"description": "Names of platforms to install the package on. This package will be skipped for any platforms not on this list",
"items": {
"enum": [
"i686-linux",
"aarch64-linux",
"aarch64-darwin",
"x86_64-darwin",
"x86_64-linux",
"armv7l-linux"
]
}
},
"excluded_platforms": {
"type": "array",
"description": "Names of platforms to exclude the package on",
"items": {
"enum": [
"i686-linux",
"aarch64-linux",
"aarch64-darwin",
"x86_64-darwin",
"x86_64-linux",
"armv7l-linux"
]
}
},
"glibc_patch": {
"type": "boolean",
"description": "Whether to patch glibc to the latest available version for this package"
}
}
},
{
"type": "string",
"description": "Version of the package to install."
}
]
}
}
}
]
},
"env": {
"description": "List of additional environment variables to be set in the Devbox environment. Values containing $PATH or $PWD will be expanded. No other variable expansion or command substitution will occur.",
"type": "object",
"patternProperties": {
".*": {
"type": "string",
"description": "Value of the environment variable."
}
}
},
"shell": {
"description": "Definitions of scripts and actions to take when in devbox shell.",
"type": "object",
"properties": {
"init_hook": {
"type": [
"array",
"string"
],
"items": {
"description": "List of shell commands/scripts to run right after devbox shell starts.",
"type": "string"
}
},
"scripts": {
"description": "List of command/script definitions to run with `devbox run <script_name>`.",
"type": "object",
"patternProperties": {
".*": {
"description": "Alias name for the script.",
"type": [
"array",
"string"
],
"items": {
"type": "string",
"description": "The script's shell commands."
}
}
}
}
},
"additionalProperties": false
},
"include": {
"description": "List of additional plugins to activate within your devbox shell",
"type": "array",
"items": {
"description": "Name of the plugin to activate.",
"type": "string"
}
},
"env_from": {
"type": "string"
},
"nixpkgs": {
"type": "object",
"properties": {
"commit": {
"type": "string",
"description": "The commit hash of the nixpkgs repository to use"
}
}
}
},
"additionalProperties": false
}
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or advances of
any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address,
without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement. Use the "Report
to repository admins" functionality on GitHub to report.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][mozilla coc].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][faq]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[mozilla coc]: https://github.com/mozilla/diversity
[faq]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
When contributing to this repository, please describe the change you wish to
make via a related issue, or a pull request.
Please note we have a [code of conduct](CODE_OF_CONDUCT.md), please follow it in
all your interactions with the project.
## Setting Up Development Environment
Before making any changes to the source code (documentation excluded) make sure
you have installed all the required tools.
### With Devbox
The easiest way to develop Devbox is with Devbox!
1. Install Devbox:
curl -fsSL https://get.jetify.com/devbox | bash
2. Clone this repository:
git clone https://github.com/jetify-com/devbox.git go.jetify.com/devbox
cd go.jetify.com/devbox
3. Build the Devbox CLI. If you don't have Nix installed, Devbox will
automatically install it for you before building:
devbox run build
4. Start a development shell using your build of Devbox:
dist/devbox shell
Tip: you can also start VSCode from inside your Devbox shell with
`devbox run code`.
- If you encounter an error similar to: `line 3: command 'code' not found`, it
means you do not have the Visual Studio Code "Shell Command" installed. Follow
the official guide at https://code.visualstudio.com/docs/setup/mac. Please
refer to the section under: "Launching from the command line".
### Setting up the Environment Without Devbox
If you are unable to install or use Devbox, you can manually replicate the
environment by following the steps below.
1. Install Nix Package Manager. We recommend using the
[Determinate Systems installer](https://github.com/DeterminateSystems/nix-installer):
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
Alternatively, you can also use
[the official installer](https://nixos.org/download.html).
2. Install [Go](https://go.dev/doc/install) (current version: 1.20)
3. Clone this repository and build Devbox:
git clone https://github.com/jetify-com/devbox.git go.jetify.com/devbox
cd go.jetify.com/devbox
go build ./cmd/devbox
./devbox run -- echo hello, world
## Pull Request Process
1. For new features or non-trivial changes, consider first filing an issue to
discuss what changes you intend to make. This will let us help you with
implementation details and to make sure we don't duplicate any work.
2. Ensure any new feature or functionality includes tests to verify its
correctness.
3. Run `devbox run lint` and `devbox run test`.
4. Run `go mod tidy` if you added any new dependencies.
5. Submit your pull request and someone will take a look!
### Style Guide
We don't expect you to read through a long style guide or be an expert in Go
before contributing. When necessary, a reviewer will be happy to help out with
any suggestions around code style when you submit your PR. Otherwise, the Devbox
codebase generally follows common Go idioms and patterns:
- If you're unfamiliar with idiomatic Go,
[Effective Go](https://go.dev/doc/effective_go) and the
[Google Go Style Guide](https://google.github.io/styleguide/go) are good
resources.
- There's no strict commit message format, but a good practice is to start the
subject with the name of the Go packages you add/modified. For example,
`boxcli: update help for add command`.
## Community Contribution License
Contributions made to this project must be made under the terms of the
[Apache 2 License](https://www.apache.org/licenses/LICENSE-2.0).
```
By making a contribution to this project, you certify that:
a. The contribution was created in whole or in part by you and you have the right
to submit it under the Apache 2 License; or
b. The contribution is based upon previous work that, to the best of your
knowledge, is covered under an appropriate open source license and you have the
right under that license to submit that work with modifications, whether
created in whole or in part by you, under the Apache 2 License; or
c. The contribution was provided directly to you by some other person who
certified (a), (b) or (c) and you have not modified it.
d. You understand and agree that this project and the contribution are public
and that a record of the contribution (including all personal information you
submit with it, including your sign-off) is maintained indefinitely and may be
redistributed consistent with this project or the open source license(s)
involved.
```
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: NUSHELL.md
================================================
# Using Devbox with Nushell
Devbox now supports [nushell](https://github.com/nushell/nushell) through the `--format` flag on the `shellenv` command.
## Quick Start
**Add this to `~/.config/nushell/env.nu`:**
```nushell
devbox global shellenv --format nushell --preserve-path-stack -r
| lines
| parse "$env.{name} = \"{value}\""
| where name != null
| transpose -r
| into record
| load-env
```
This is equivalent to bash's `eval "$(devbox global shellenv)"` and runs on every fresh shell start.
---
## Global Configuration
To use devbox global packages with nushell, you need to load the environment similar to how bash/zsh use `eval "$(devbox global shellenv)"`.
### Dynamic loading with `load-env` - eval equivalent
Add this to `~/.config/nushell/env.nu` to regenerate and load devbox environment fresh every time, just like bash's `eval`:
```nushell
# Load devbox global environment dynamically (equivalent to bash eval)
devbox global shellenv --format nushell --preserve-path-stack -r
| lines
| parse "$env.{name} = \"{value}\""
| where name != null
| transpose -r
| into record
| load-env
```
- `--format nushell` - Output in nushell syntax
- `--preserve-path-stack` - Maintain existing PATH order if devbox is already active
- `-r` (recompute) - Always recompute the environment, prevents "out of date" warnings
================================================
FILE: README.md
================================================
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/app/static/img/devbox_logo_dark.svg">
<source media="(prefers-color-scheme: light)" srcset="docs/app/static/img/devbox_logo_light.svg">
<img alt="Devbox logo." src="docs/app/static/img/devbox_logo_light.svg">
</picture>
# Devbox
### Instant, easy, and predictable development environments
[](https://discord.gg/jetify)

[](https://github.com/jetify-com/devbox/releases)
[](https://github.com/jetify-com/devbox/actions/workflows/cli-release.yml?branch=main)
[](https://www.jetify.com/devbox/docs/contributor-quickstart/)
## What is it?
[Devbox](https://www.jetify.com/devbox/) is a command-line tool that lets you
easily create isolated shells for development. You start by defining the list of
packages required by your development environment, and devbox uses that
definition to create an isolated environment just for your application.
In practice, Devbox works similar to a package manager like `yarn` – except the
packages it manages are at the operating-system level (the sort of thing you
would normally install with `brew` or `apt-get`). With Devbox, you can install
over [400,000 package versions](https://www.nixhub.io) from the Nix Package
Registry
Devbox was originally developed by [Jetify](https://www.jetify.com) and is
internally powered by `nix`.
## Demo
The example below creates a development environment with `python 2.7` and
`go 1.18`, even though those packages are not installed in the underlying
machine:

## Installing Devbox
Use the following install script to get the latest version of Devbox:
```sh
curl -fsSL https://get.jetify.com/devbox | bash
```
Read more on the
[Devbox docs](https://www.jetify.com/devbox/docs/installing-devbox/).
## Benefits
### A consistent shell for everyone on the team
Declare the list of tools needed by your project via a `devbox.json` file and
run `devbox shell`. Everyone working on the project gets a shell environment
with the exact same version of those tools.
### Try new tools without polluting your laptop
Development environments created by Devbox are isolated from everything else in
your laptop. Is there a tool you want to try without making a mess? Add it to a
Devbox shell, and remove it when you don't want it anymore – all while keeping
your laptop pristine.
### Don't sacrifice speed
Devbox can create isolated environments right on your laptop, without an
extra-layer of virtualization slowing your file system or every command. When
you're ready to ship, it'll turn it into an equivalent container – but not
before.
### Goodbye conflicting versions
Are you working on multiple projects, all of which need different versions of
the same binary? Instead of attempting to install conflicting versions of the
same binary on your laptop, create an isolated environment for each project, and
use whatever version you want for each.
### Take your environment with you
Devbox's dev environments are _portable_. We make it possible to declare your
environment exactly once, and use that single definition in several different
ways, including:
- A local shell created through `devbox shell`
- A devcontainer you can use with VSCode
- A Dockerfile so you can build a production image with the exact same tools you
used for development.
- A remote development environment in the cloud that mirrors your local
environment.
## Quickstart: Fast, Deterministic Shell
In this quickstart we'll create a development shell with specific tools
installed. These tools will only be available when using this Devbox shell,
ensuring we don't pollute your machine.
1. Open a terminal in a new empty folder.
2. Initialize Devbox:
```bash
devbox init
```
This creates a `devbox.json` file in the current directory. You should commit
it to source control.
3. Add command-line tools from Nix. For example, to add Python 3.10:
```bash
devbox add python@3.10
```
Search for more packages on [Nixhub.io](https://www.nixhub.io)
4. Your `devbox.json` file keeps track of the packages you've added, it should
now look like this:
```json
{
"packages": [
"python@3.10"
]
}
```
5. Start a new shell that has these tools installed:
```bash
devbox shell
```
You can tell you're in a Devbox shell (and not your regular terminal) because
the shell prompt changed.
6. Use your favorite tools.
In this example we installed Python 3.10, so let's use it.
```bash
python --version
```
7. Your regular tools are also available including environment variables and
config settings.
```bash
git config --get user.name
```
8. To exit the Devbox shell and return to your regular shell:
```bash
exit
```
Read more on the
[Devbox docs Quickstart](https://www.jetify.com/devbox/docs/quickstart/).
## Additional commands
`devbox help` - see all commands
See the
[CLI Reference](https://www.jetify.com/devbox/docs/cli_reference/devbox/) for
the full list of commands.
## Join our Developer Community
- Chat with us by joining the [Jetify Discord Server](https://discord.gg/jetify)
– we have a #devbox channel dedicated to this project.
- File bug reports and feature requests using
[Github Issues](https://github.com/jetify-com/devbox/issues)
- Follow us on [Jetify's Twitter](https://twitter.com/jetify_com) for product
updates
## Contributing
Devbox is an opensource project, so contributions are always welcome. Please read
[our contributing guide](CONTRIBUTING.md) before submitting pull requests.
[Devbox development readme](devbox.md)
## Related Work
Thanks to [Nix](https://nixos.org/) for providing isolated shells.
## License
This project is proudly open-source under the
[Apache 2.0 License](https://github.com/jetify-com/devbox/blob/main/LICENSE)
================================================
FILE: cmd/devbox/main.go
================================================
// Copyright 2024 Jetify Inc. and contributors. All rights reserved.
// Use of this source code is governed by the license in the LICENSE file.
package main
import (
"go.jetify.com/devbox/internal/boxcli"
)
func main() {
boxcli.Main()
}
================================================
FILE: devbox.go
================================================
// Package devbox creates and configures Devbox development environments.
package devbox
import (
"context"
"io"
"go.jetify.com/devbox/internal/devbox"
"go.jetify.com/devbox/internal/devbox/devopt"
)
// Devbox is a Devbox development environment.
type Devbox struct {
dx *devbox.Devbox
}
// Open loads a Devbox environment from a config file or directory.
func Open(path string) (*Devbox, error) {
dx, err := devbox.Open(&devopt.Opts{
Dir: path,
Stderr: io.Discard,
})
if err != nil {
return nil, err
}
return &Devbox{dx: dx}, nil
}
// Install downloads and installs missing packages.
func (d *Devbox) Install(ctx context.Context) error {
return d.dx.Install(ctx)
}
================================================
FILE: devbox.json
================================================
{
"name": "devbox",
"description": "Instant, easy, and predictable development environments",
"packages": {
"fd": "latest",
"git": "latest",
"go": "latest"
},
"env": {
"GOENV": "off",
"PATH": "$PWD/dist/tools:$PATH:$PWD/dist",
// Disabling CGO is a workaround for a clang linker error in macos
// This should be okay, because Devbox doesn't require CGO
// https://github.com/NixOS/nixpkgs/issues/433688#issuecomment-3231557942
"CGO_ENABLED": "0",
},
"shell": {
"init_hook": [
// Remove Go environment variables that might've been inherited from the
// user's environment and could affect the build.
"test -z $FISH_VERSION && \\",
"unset GO111MODULE GOARCH GOFLAGS GOMOD GOOS GOROOT GOTOOLCHAIN GOWORK || \\",
"set --erase GO111MODULE GOARCH GOFLAGS GOMOD GOOS GOROOT GOTOOLCHAIN GOWORK",
"GOBIN=$PWD/dist/tools go install tool"
],
"scripts": {
// Build devbox for the current platform
"build": "go build -o dist/devbox ./cmd/devbox",
"build-darwin-amd64": "GOOS=darwin GOARCH=amd64 go build -o dist/devbox-darwin-amd64 ./cmd/devbox",
"build-darwin-arm64": "GOOS=darwin GOARCH=arm64 go build -o dist/devbox-darwin-arm64 ./cmd/devbox",
"build-linux-amd64": "GOOS=linux GOARCH=amd64 go build -o dist/devbox-linux-amd64 ./cmd/devbox",
"build-linux-arm64": "GOOS=linux GOARCH=arm64 go build -o dist/devbox-linux-arm64 ./cmd/devbox",
"build-all": [
"devbox run build-darwin-amd64",
"devbox run build-darwin-arm64",
"devbox run build-linux-amd64",
"devbox run build-linux-arm64"
],
// Open VSCode
"code": "code .",
"lint": "go tool golangci-lint run --timeout 5m && scripts/gofumpt.sh",
"fmt": "scripts/gofumpt.sh",
"test": "go test -race -cover ./...",
"test-projects-only": "DEVBOX_RUN_PROJECT_TESTS=1 go test -v -timeout ${DEVBOX_GOLANG_TEST_TIMEOUT:-30m} ./... -run \"TestExamples|TestScriptsWithProjects\"",
"update-examples": "devbox run build && go run testscripts/testrunner/updater/main.go",
// Updates the Flake's vendorHash: First run `go mod vendor` to vendor
// the dependencies, then hash the vendor directory with Nix.
// The hash is saved to the `vendor-hash` file, which is then
// read into the Nix Flake.
"update-hash": [
// realpath to work-around nix hash not liking symlinks
"vendor=$(realpath $(mktemp -d))",
"trap \"rm -rf $vendor\" EXIT",
"go mod vendor -o $vendor",
"nix hash path $vendor >vendor-hash"
],
"build-flake": "nix build .",
"tidy": ["go mod tidy", "devbox run update-hash"],
// docker-testscripts runs the testscripts with Docker to exercise
// Linux-specific tests. It invokes the test binary directly, so any extra
// test runner flags must have their "-test." prefix.
//
// For example, to only run Python tests:
//
// devbox run docker-testscripts -test.run ^TestScripts$/python
"docker-testscripts": [
"cd testscripts",
// The Dockerfile looks for a testscripts-$TARGETOS-$TARGETARCH binary
// to run the tests. Pre-compiling a static test binary lets us avoid
// polluting the container with a Go toolchain or shared libraries that
// might interfere with linker tests.
"trap 'rm -f testscripts-linux-amd64 testscripts-linux-arm64' EXIT",
"GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go test -c -o testscripts-linux-amd64",
"GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go test -c -o testscripts-linux-arm64",
"image=$(docker build --quiet --tag devbox-testscripts-ubuntu:noble --platform linux/amd64 .)",
"docker run --rm --mount type=volume,src=devbox-testscripts-amd64,dst=/nix --platform linux/amd64 -e DEVBOX_RUN_FAILING_TESTS -e DEVBOX_RUN_PROJECT_TESTS -e DEVBOX_DEBUG $image \"$@\""
]
}
}
}
================================================
FILE: devbox.md
================================================
<!-- gen-readme start - generated by https://github.com/jetify-com/devbox/ -->
# devbox
Instant, easy, and predictable development environments
## Getting Started
This project uses [devbox](https://github.com/jetify-com/devbox) to manage its
development environment.
Install devbox:
```sh
curl -fsSL https://get.jetify.com/devbox | bash
```
Start the devbox shell:
```sh
devbox shell
```
Run a script in the devbox environment:
```sh
devbox run <script>
```
## Scripts
Scripts are custom commands that can be run using this project's environment.
This project has the following scripts:
- [devbox](#devbox)
- [Getting Started](#getting-started)
- [Scripts](#scripts)
- [Environment](#environment)
- [Shell Init Hook](#shell-init-hook)
- [Packages](#packages)
- [Script Details](#script-details)
- [devbox run build](#devbox-run-build)
- [devbox run build-all](#devbox-run-build-all)
- [devbox run build-darwin-amd64](#devbox-run-build-darwin-amd64)
- [devbox run build-darwin-arm64](#devbox-run-build-darwin-arm64)
- [devbox run build-linux-amd64](#devbox-run-build-linux-amd64)
- [devbox run build-linux-arm64](#devbox-run-build-linux-arm64)
- [devbox run code](#devbox-run-code)
- [devbox run fmt](#devbox-run-fmt)
- [devbox run lint](#devbox-run-lint)
- [devbox run test](#devbox-run-test)
- [devbox run tidy](#devbox-run-tidy)
- [devbox run update-examples](#devbox-run-update-examples)
## Environment
```sh
GOENV="off"
PATH="$PATH:$PWD/dist"
```
## Shell Init Hook
The Shell Init Hook is a script that runs whenever the devbox environment is
instantiated. It runs on `devbox shell` and on `devbox run`.
```sh
test -z $FISH_VERSION && unset CGO_ENABLED GO111MODULE GOARCH GOFLAGS GOMOD GOOS GOROOT GOTOOLCHAIN GOWORK
```
## Packages
- [go@latest](https://www.nixhub.io/packages/go)
- [runx:golangci/golangci-lint@latest](https://www.github.com/golangci/golangci-lint)
- [runx:mvdan/gofumpt@latest](https://www.github.com/mvdan/gofumpt)
## Script Details
### devbox run build
Build devbox for the current platform
```sh
go build -o dist/devbox ./cmd/devbox
```
 
### devbox run build-all
```sh
devbox run build-darwin-amd64
devbox run build-darwin-arm64
devbox run build-linux-amd64
devbox run build-linux-arm64
```
 
### devbox run build-darwin-amd64
```sh
GOOS=darwin GOARCH=amd64 go build -o dist/devbox-darwin-amd64 ./cmd/devbox
```
 
### devbox run build-darwin-arm64
```sh
GOOS=darwin GOARCH=arm64 go build -o dist/devbox-darwin-arm64 ./cmd/devbox
```
 
### devbox run build-linux-amd64
```sh
GOOS=linux GOARCH=amd64 go build -o dist/devbox-linux-amd64 ./cmd/devbox
```
 
### devbox run build-linux-arm64
```sh
GOOS=linux GOARCH=arm64 go build -o dist/devbox-linux-arm64 ./cmd/devbox
```
 
### devbox run code
Open VSCode
```sh
code .
```
 
### devbox run fmt
```sh
scripts/gofumpt.sh
```
 
### devbox run lint
```sh
golangci-lint run --timeout 5m && scripts/gofumpt.sh
```
 
### devbox run test
```sh
go test -race -cover ./...
```
 
### devbox run tidy
```sh
go mod tidy
```
 
### devbox run update-examples
```sh
devbox run build && go run testscripts/testrunner/updater/main.go
```
 
<!-- gen-readme end -->
================================================
FILE: examples/.gitignore
================================================
.devbox/
.DS_STORE
.vscode/settings.json
================================================
FILE: examples/README.md
================================================
# Devbox Examples
[](https://www.jetify.com/devbox/docs/contributor-quickstart/)
Example dev environments built with Devbox:
1. `databases` - Examples of popular DBs (eg.,MariaDB, Postgres, Redis)
1. `development` - Shells for developing in different programming languages
1. `flakes` - Examples of using Nix Flakes with Devbox
1. `servers` - Examples of servers, like Apache + Nginx
1. `stacks` - Full projects and web stacks, like LAMP and Drupal
================================================
FILE: examples/cloud_development/argo-workflows/README.md
================================================
# Minikube + Argo Example
Run and test Argo Workflows on a local Minkube instance.
The init_hook in this example configures minikube to store it's data in a local `home/` directory, so your host kubeconfig is not affected by this shell. The scripts in this example do the following:
`minikube` starts minikube and tails it's logs
`install-argo` Installs Argo Workflows based on the Argo Quickstart documentation
`argo-port-forward` Forwards the port of the Argo deployment, so you can access the Argo UI at `https://localhost:2746` (note the `https`).
## Usage Instructions
Note: macOS users need to have Docker Desktop installed. This is because the Docker Daemon cannot run natively on macOS
1. Start `minikube` by running `devbox run minikube`. This will install and spin up minikube in a local shell, and then tail the logs
2. Install argo on minkube using `devbox run argo-install`
3. Forward the ports from your argo deployment using `devbox run argo-port-forward`
4. You can now run `devbox shell`, and use the Argo CLI to interact with Argo in minikube. You can also access the Argo UI at [https://localhost:2746](https://localhost:2746)
================================================
FILE: examples/cloud_development/argo-workflows/argo-patch.sh
================================================
# Patch so we don't need to login through the UI, for development purposes. See https://argoproj.github.io/argo-workflows/quick-start/ for details.
kubectl patch deployment \
argo-server \
--namespace=argo \
--type='json' \
-p='[{"op": "replace", "path": "/spec/template/spec/containers/0/args", "value": [
"server",
"--auth-mode=server"
]}]'
================================================
FILE: examples/cloud_development/argo-workflows/devbox.json
================================================
{
"packages": [
"kubectl",
"argo",
"docker",
"minikube@latest"
],
"env": {
"MINIKUBE_HOME": "$PWD/home/.minikube",
"KUBECONFIG": "$PWD/home/.kube/config"
},
"shell": {
"init_hook": [],
"scripts": {
"argo-install": [
"kubectl create namespace argo",
"kubectl apply -n argo -f https://github.com/argoproj/argo-workflows/releases/download/v3.4.5/install.yaml",
"bash argo-patch.sh"
],
"argo-port-forward": [
"kubectl -n argo port-forward deployment/argo-server 2746:2746"
],
"minikube": [
"finish() { minikube -p argo-test stop; }",
"trap finish SIGTERM SIGINT EXIT",
"minikube start -p argo-test",
"minikube -p argo-test logs -f"
]
}
}
}
================================================
FILE: examples/cloud_development/maelstrom/README.md
================================================
# Maelstrom
A Devbox for running [Maelstrom](https://github.com/jepsen-io/maelstrom) Tests. Maelstrom is a testing library for toy distributed systems built by @aphyr, useful for learning the basics and principals of building distributed systems
You should also check out the [Fly.io Distributed Systems Challenge](https://fly.io/dist-sys/)
## Prerequisites
If you don't already have [Devbox](https://www.jetify.com/docs/devbox/installing-devbox/index), you can install it by running the following command:
```bash
curl -s https://get.jetify.com/install.sh | bash
```
You can skip this step if you're running on devbox.sh
## Usage
1. Install Maelstrom by running `devbox run install`. This should install Maelstrom 0.2.2 in a `maelstrom` subdirectory
1. cd into the `maelstrom` directory and run `./maelstrom` to verify everything is working
1. You can now follow the docs and run the tests in the Maelstrom Docs + Readme. You can use `glow` from the command line to browse the docs.
This shell includes Ruby 3.10 for running the Ruby Demos. To run demos in other languages, install the appropriate runtimes using `devbox add`. For example, to run the Python demos, use `devbox add python310`.
================================================
FILE: examples/cloud_development/maelstrom/devbox.json
================================================
{
"packages": [
"graphviz",
"gnuplot",
"ruby_3_1",
"curl",
"glow",
"openjdk17@latest"
],
"shell": {
"init_hook": [
"clear",
"echo 'Welcome to the Maelstrom in Devbox Shell! \n * Type `devbox run help` to get started.\n * Type `devbox run install` to install Maelstrom.\n * After installing Maelstrom, type `devbox run docs` to browse the Maelstrom docs.'"
],
"scripts": {
"install": [
"tar xjf <(curl -L -k https://github.com/jepsen-io/maelstrom/releases/download/v0.2.2/maelstrom.tar.bz2)"
],
"help": [
"glow README.md"
],
"docs": [
"glow maelstrom/doc"
]
}
}
}
================================================
FILE: examples/cloud_development/minikube/README.md
================================================
# Minikube + Helm + Kubectl Example
Run Helm + Kubernetes locally using Minikube in a Devbox shell.
The init_hook in this example configures minikube + helm to store their data in a local `home/` directory, so your host kubeconfig and helm repos are not affected by this shell.
## Usage Instructions
Note: macOS users need to have Docker Desktop installed. This is because the Docker Daemon cannot run natively on macOS
1. Start `minikube` by running `devbox run minikube`. This will install and spin up minikube in a local shell, and then tail the logs
2. In a different terminal, create a new shell with `devbox shell`.
3. You can now deploy to minikube using `kubectl` or `helm`.
4. To shutdown minikube, use CTRL-C to terminate the shell where you started minikube.
================================================
FILE: examples/cloud_development/minikube/devbox.json
================================================
{
"packages": [
"kubectl",
"kubernetes-helm-wrapped",
"docker",
"minikube@latest"
],
"env": {
"MINIKUBE_HOME": "$PWD/home/.minkube",
"KUBECONFIG": "$PWD/home/.kube/config"
},
"shell": {
"init_hook": [
"helm repo add my-repo https://charts.bitnami.com/bitnami"
],
"scripts": {
"minikube": [
"finish() { minikube stop; }",
"trap finish SIGTERM SIGINT EXIT",
"minikube start",
"minikube logs -f"
]
}
}
}
================================================
FILE: examples/cloud_development/temporal/.envrc
================================================
# Automatically sets up your devbox environment whenever you cd into this
# directory via our direnv integration:
use_devbox() {
watch_file devbox.json
if [ -f .devbox/gen/flake/flake.nix ]; then
DEVBOX_SHELL_ENABLED_BACKUP=$DEVBOX_SHELL_ENABLED
eval "$(devbox shellenv --init-hook)"
export DEVBOX_SHELL_ENABLED=$DEVBOX_SHELL_ENABLED_BACKUP
fi
}
use devbox
# check out https://www.jetify.com/docs/devbox/ide_configuration/direnv/
# for more details
================================================
FILE: examples/cloud_development/temporal/.gitignore
================================================
.venv/
================================================
FILE: examples/cloud_development/temporal/README.md
================================================
# Temporal
[](https://www.jetify.com/devbox/docs/contributor-quickstart/)
Example devbox for testing and developing Temporal workflows using Temporalite and the Python Temporal SDK.
For more details, check out:
* [Temporal.io](https://temporal.io/)
* [Temporalite](https://github.com/temporalio/temporalite)
* [Temporal Python SDK](https://github.com/temporalio/sdk-python)
* [Temporal Python Samples](https://github.com/temporalio/samples-python)
## Starting Temporal
```bash
devbox run start-temporal
```
This will start the temporalite server for testing.
* You can view the WebUI at `localhost:8233`
* By default, Temporal will listen for activities/requests on port `7233`
## Starting a Devbox Shell
```bash
devbox shell
```
This will activate a virtual environment and install the Temporal Python SDK.
## Testing the Temporal Workflows
From inside your `devbox shell`
```bash
cd temporal_example/hello
python run hello_activity.py
```
This should start the workflow using temporalite.
================================================
FILE: examples/cloud_development/temporal/devbox.json
================================================
{
"packages": [
"python310Packages.pip",
"python310Packages.pylint",
"python310Packages.black",
"python310Packages.isort",
"python310Packages.mypy",
"temporalite",
"temporal-cli",
"python310@latest"
],
"shell": {
"init_hook": [
"echo 'Setting flags to allow Python C extension compilation'",
"export NIX_CFLAGS_COMPILE=\"$NIX_CFLAGS_COMPILE $(cat $(dirname $(command -v clang))/../nix-support/libcxx-cxxflags)\"",
"echo 'Setting up virtual environment'",
". $VENV_DIR/bin/activate"
],
"scripts": {
"start-temporal": "temporalite start --namespace default --log-level warn --log-format pretty --ephemeral"
}
}
}
================================================
FILE: examples/cloud_development/temporal/hello/.gitignore
================================================
__pycache__
.poetry-cache/
================================================
FILE: examples/cloud_development/temporal/hello/__init__.py
================================================
================================================
FILE: examples/cloud_development/temporal/hello/hello_activity.py
================================================
import asyncio
import logging
from dataclasses import dataclass
from datetime import timedelta
from temporalio import activity, workflow
from temporalio.client import Client
from temporalio.worker import Worker
# While we could use multiple parameters in the activity, Temporal strongly
# encourages using a single dataclass instead which can have fields added to it
# in a backwards-compatible way.
@dataclass
class ComposeGreetingInput:
greeting: str
name: str
# Basic activity that logs and does string concatenation
@activity.defn
async def compose_greeting(input: ComposeGreetingInput) -> str:
activity.logger.info("Running activity with parameter %s" % input)
return f"{input.greeting}, {input.name}!"
# Basic workflow that logs and invokes an activity
@workflow.defn
class GreetingWorkflow:
@workflow.run
async def run(self, name: str) -> str:
workflow.logger.info("Running workflow with parameter %s" % name)
return await workflow.execute_activity(
compose_greeting,
ComposeGreetingInput("Hello", name),
start_to_close_timeout=timedelta(seconds=10),
)
async def main():
# Uncomment the line below to see logging
# logging.basicConfig(level=logging.INFO)
# Start client
client = await Client.connect("localhost:7233")
# Run a worker for the workflow
async with Worker(
client,
task_queue="hello-activity-task-queue",
workflows=[GreetingWorkflow],
activities=[compose_greeting],
):
# While the worker is running, use the client to run the workflow and
# print out its result. Note, in many production setups, the client
# would be in a completely separate process from the worker.
result = await client.execute_workflow(
GreetingWorkflow.run,
"World",
id="hello-activity-workflow-id",
task_queue="hello-activity-task-queue",
)
print(f"Result: {result}")
if __name__ == "__main__":
asyncio.run(main())
================================================
FILE: examples/cloud_development/temporal/hello/hello_cron.py
================================================
import asyncio
from dataclasses import dataclass
from datetime import timedelta
from temporalio import activity, workflow
from temporalio.client import Client
from temporalio.worker import Worker
@dataclass
class ComposeGreetingInput:
greeting: str
name: str
@activity.defn
async def compose_greeting(input: ComposeGreetingInput) -> str:
return f"{input.greeting}, {input.name}!"
@workflow.defn
class GreetingWorkflow:
@workflow.run
async def run(self, name: str) -> None:
result = await workflow.execute_activity(
compose_greeting,
ComposeGreetingInput("Hello", name),
start_to_close_timeout=timedelta(seconds=10),
)
workflow.logger.info("Result: %s", result)
async def main():
# Start client
client = await Client.connect("localhost:7233")
# Run a worker for the workflow
async with Worker(
client,
task_queue="hello-cron-task-queue",
workflows=[GreetingWorkflow],
activities=[compose_greeting],
):
print("Running workflow once a minute")
# While the worker is running, use the client to start the workflow.
# Note, in many production setups, the client would be in a completely
# separate process from the worker.
await client.start_workflow(
GreetingWorkflow.run,
"World",
id="hello-cron-workflow-id",
task_queue="hello-cron-task-queue",
cron_schedule="* * * * *",
)
# Wait forever
await asyncio.Future()
if __name__ == "__main__":
asyncio.run(main())
================================================
FILE: examples/cloud_development/temporal/requirements.txt
================================================
temporalio==0.1b4
cython
================================================
FILE: examples/cloud_development/temporal/tests/__init__.py
================================================
================================================
FILE: examples/cloud_development/temporal/venvShellHook.sh
================================================
SOURCE_DATE_EPOCH=$(date +%s)
if [ -d "$VENV_DIR" ]; then
echo "Skipping venv creation, '${VENV_DIR}' already exists"
else
echo "Creating new venv environment in path: '${VENV_DIR}'"
# Note that the module venv was only introduced in python 3, so for 2.7
# this needs to be replaced with a call to virtualenv
which python3
python3 -m venv "$VENV_DIR"
fi
================================================
FILE: examples/data_science/R/.gitignore
================================================
.RData
.Rhistory
================================================
FILE: examples/data_science/R/README.md
================================================
# R
[R is a free software environment for statistical computing and graphics](https://www.r-project.org/).
[**Example Repo**](https://github.com/jetify-com/devbox/tree/main/examples/data_science/R)
## Adding R to your Project
`devbox add R@4.4.1`, or in your `devbox.json` add:
```json
"packages": [
"R@4.4.1"
],
```
This will install R in your shell. You can find other versions of R by running `devbox search R`.
You can also view the available versions on [Nixhub](https://www.nixhub.io/packages/R).
## Installing Packages
[CRAN](https://cran.r-project.org/) is the main repository of R packages.
All of the CRAN packages are also available on [Nixhub](https://www.nixhub.io/).
You can install packages by running `devbox add rPackages.package_name`, where `package_name` is the name of the package you would normally install with `install.packages()`.
Note that for packages with a dot in the name you will need to replace the dot with an underscore, i.e. `data.table` -> `data_table` (see example below).
```json
{
"packages": [
"R@4.4.1",
"rPackages.data_table@latest",
"rPackages.ggplot2@latest",
"rPackages.tidyverse@latest"
],
}
```
You can access these packages in your R scripts as usual with `library(data.table)``.
## Example script
In this [example repo](https://github.com/jetify-com/devbox/tree/main/examples/data_science/R), after running `devbox shell`, you can start an R repl with `R` then create an example plot with `source("src/examplePlot.R")`.
Alternatively run `Rscript src/examplePlot.R`.
This will create an `Rplots.pdf` file.
## Troubleshooting
If you get warnings like:
> During startup - Warning messages:
> 1: setting LC_CTYPE failed, using "C"
> 2: Setting LC_COLLATE failed, using "C"
> ...
then you need to set your locale.
Find your locale (outside of a devbox shell) using `locale` in your terminal. You will see something like:
> LANG=en_NZ.UTF-8
> LANGUAGE=en_NZ:en
> LC_CTYPE="en_NZ.UTF-8"
> ...
To set your locale, edit the `init_hook` array in the shell object in `devbox.json` to export two environment variables like below (using your specific locale):
```json
{
"shell": {
"init_hook": [
"export LANG=en_NZ.UTF-8",
"export LC_ALL=en_NZ.UTF-8"
]
}
}
```
================================================
FILE: examples/data_science/R/devbox.json
================================================
{
"$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.10.6/.schema/devbox.schema.json",
"packages": [
"R@4.4.1",
"rPackages.data_table@latest",
"rPackages.ggplot2@latest",
"rPackages.tidyverse@latest",
"rPackages.dplyr@latest"
],
"shell": {
"init_hook": [
"echo 'Welcome to devbox!' > /dev/null"
],
"scripts": {
"test": [
"echo \"Error: no test specified\" && exit 1"
]
}
}
}
================================================
FILE: examples/data_science/R/src/examplePlot.R
================================================
# Load the required libraries
library(data.table)
library(ggplot2)
# Create example data
data <- data.table(
x = rnorm(100), # 100 random numbers from a normal distribution
y = rnorm(100) # 100 random numbers from a normal distribution
)
# Plot the data using ggplot2
demoPlot <- ggplot(data, aes(x = x, y = y)) +
geom_point() + # Create a scatter plot
theme_minimal() + # Use a minimal theme
labs(title = "Scatter Plot of Random Data",
x = "X Axis",
y = "Y Axis")
print(demoPlot)
================================================
FILE: examples/data_science/README.md
================================================
# Data Science and ML Examples
Basic data science and ML examples. These examples are WIP
Note: Examples that require a GPU are currently configured for WSL2.0 only. Modifications are needed for them to use GPUs on Linux
================================================
FILE: examples/data_science/jupyter/.envrc
================================================
# Automatically sets up your devbox environment whenever you cd into this
# directory via our direnv integration:
use_devbox() {
watch_file devbox.json
if [ -f .devbox/gen/flake/flake.nix ]; then
DEVBOX_SHELL_ENABLED_BACKUP=$DEVBOX_SHELL_ENABLED
eval "$(devbox shellenv --init-hook)"
export DEVBOX_SHELL_ENABLED=$DEVBOX_SHELL_ENABLED_BACKUP
fi
}
use devbox
# check out https://www.jetify.com/docs/devbox/ide_configuration/direnv/
# for more details
================================================
FILE: examples/data_science/jupyter/.pdm-python
================================================
/Users/daniel/Code/jetify/devbox/examples/data_science/jupyter/.venv/bin/python
================================================
FILE: examples/data_science/jupyter/.pdm.toml
================================================
[python]
path = "/nix/store/7rjqb838snvvxcmpvck1smfxhkwzqal5-python3-3.10.10/bin/python3.10"
================================================
FILE: examples/data_science/jupyter/__pypackages__/.gitignore
================================================
*
!.gitignore
================================================
FILE: examples/data_science/jupyter/devbox.json
================================================
{
"packages": [
"pdm",
"nodePackages.pyright",
"python311Packages.jupyter",
"python311Packages.virtualenv",
"python311@latest"
],
"env": {
"PATH": "$PATH:$PWD/__pypackages__/3.11/bin",
"PDM_CHECK_UPDATE": "0",
"PYTHONPATH": "$PYTHONPATH:$PWD/__pypackages__/3.11/lib"
},
"shell": {
"init_hook": null
}
}
================================================
FILE: examples/data_science/jupyter/main.py
================================================
================================================
FILE: examples/data_science/jupyter/pyproject.toml
================================================
[project]
name = ""
version = ""
description = ""
authors = [
{name = "John Lago", email = "750845+Lagoja@users.noreply.github.com"},
]
dependencies = [
"jupyter>=1.0.0",
]
requires-python = ">=3.10"
license = {text = "MIT"}
[tool.pdm]
================================================
FILE: examples/data_science/llama/README.md
================================================
# Llama build and run
Simple Llama (generative AI) build and run with Devbox.
## Setup
- Make sure to have [devbox installed](https://www.jetify.com/devbox/docs/quickstart/#install-devbox)
- Clone this repo: `git clone https://github.com/jetify-com/devbox.git`
- `cd devbox/examples/data_science/llama/`
- `devbox shell`
- Once in devbox shell, there will be an available binary `llama` that you can use to run the built llama.cpp.
- `devbox run get_model`
- `devbox run llama`
## Updating the model
This example downloads [vicuna-7b model](https://huggingface.co/eachadea/ggml-vicuna-7b-1.1). You can change it to download another Llama model by editing the devbox.json
## Using Llama
`devbox run llama` runs the llama binary with a "hello world" prompt. To change that you can edit the prompt in devbox.json or once in devbox shell, run
```bash
llama -m ./models/vic7B/ggml-vic7b-q5_0.bin -n 512 -p "your custom prompt"
```
For more details on llama inference parameters refer to [llama.cpp docs](https://github.com/ggerganov/llama.cpp). Note that, instead of running `./main` you can run `llama` inside devbox shell.
================================================
FILE: examples/data_science/llama/devbox.json
================================================
{
"packages": [
"github:ggerganov/llama.cpp",
"wget@latest"
],
"shell": {
"init_hook": null,
"scripts": {
"get_model": [
"mkdir -p models/vic7B/",
"cd models/vic7B",
"wget https://huggingface.co/eachadea/ggml-vicuna-7b-1.1/resolve/main/ggml-vic7b-q5_0.bin"
],
"llama": "llama -m ./models/vic7B/ggml-vic7b-q5_0.bin -n 512 -p \"hello world\""
}
},
"nixpkgs": {
"commit": "f80ac848e3d6f0c12c52758c0f25c10c97ca3b62"
}
}
================================================
FILE: examples/data_science/pytorch/basic-example/README.md
================================================
# Basic Pytorch Example
This is a Devbox for running PyTorch.
Note: This demo currently only works on WSL3 with Nvidia GPUs. For Linux, additional packages and configuration may be needed.
================================================
FILE: examples/data_science/pytorch/basic-example/devbox.json
================================================
{
"packages": {
"poetry": "",
"stdenv.cc.cc.lib": "",
"cudatoolkit": {
"version": "latest",
"excluded_platforms": ["aarch64-darwin", "x86_64-darwin"]
}
},
"env": {},
"shell": {
"init_hook": [],
"scripts": {
"install": "poetry install",
"main": "poetry run python main.py"
}
}
}
================================================
FILE: examples/data_science/pytorch/basic-example/main.py
================================================
import torch
def create_arrays(n):
x = torch.ones(n, n)
y = torch.randn(n, n * 2)
return x , y
def main():
x, y = create_arrays(1000)
x = x.to("cuda")
y = y.to("cuda")
z = x @ y
print(z)
if __name__ == "__main__":
main()
================================================
FILE: examples/data_science/pytorch/basic-example/pyproject.toml
================================================
[tool.poetry]
name = "devbox-cuda-dev"
version = "0.1.0"
description = ""
authors = ["jetify.com"]
readme = "README.md"
packages = [{include = "devbox_cuda_dev"}]
[tool.poetry.dependencies]
python = "^3.10"
torch = "^2.7.0"
numpy = "^1.24.2"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
================================================
FILE: examples/data_science/pytorch/gradio/.gitignore
================================================
flagged/
================================================
FILE: examples/data_science/pytorch/gradio/README.md
================================================
# Gradio + Pytorch
This is a Devbox for running the [Pictionary](https://huggingface.co/spaces/gradio/pictionary/tree/main) demo by [@aliabd](https://github.com/aliabd) that can be found on Hugging Face Spaces.
Note: This demo currently only works on WSL3 with Nvidia GPUs. For Linux, additional packages and configuration may be needed.
================================================
FILE: examples/data_science/pytorch/gradio/class_names.txt
================================================
airplane
alarm_clock
anvil
apple
axe
baseball
baseball_bat
basketball
beard
bed
bench
bicycle
bird
book
bread
bridge
broom
butterfly
camera
candle
car
cat
ceiling_fan
cell_phone
chair
circle
clock
cloud
coffee_cup
cookie
cup
diving_board
donut
door
drums
dumbbell
envelope
eye
eyeglasses
face
fan
flower
frying_pan
grapes
hammer
hat
headphones
helmet
hot_dog
ice_cream
key
knife
ladder
laptop
light_bulb
lightning
line
lollipop
microphone
moon
mountain
moustache
mushroom
pants
paper_clip
pencil
pillow
pizza
power_outlet
radio
rainbow
rifle
saw
scissors
screwdriver
shorts
shovel
smiley_face
snake
sock
spider
spoon
square
star
stop_sign
suitcase
sun
sword
syringe
t-shirt
table
tennis_racquet
tent
tooth
traffic_light
tree
triangle
umbrella
wheel
wristwatch
================================================
FILE: examples/data_science/pytorch/gradio/devbox.json
================================================
{
"packages": [
"python310Packages.pip",
"stdenv.cc.cc.lib",
"python310@latest"
],
"env": {},
"shell": {
"init_hook": [
". $VENV_DIR/bin/activate",
"pip install -r requirements.txt"
]
},
"nixpkgs": {
"commit": "f80ac848e3d6f0c12c52758c0f25c10c97ca3b62"
}
}
================================================
FILE: examples/data_science/pytorch/gradio/requirements.txt
================================================
torch
gradio
pathlib
gdown
================================================
FILE: examples/data_science/pytorch/gradio/run.py
================================================
from pathlib import Path
import torch
import gradio as gr
from torch import nn
import gdown
url = 'https://drive.google.com/uc?id=1dsk2JNZLRDjC-0J4wIQX_FcVurPaXaAZ'
output = 'pytorch_model.bin'
gdown.download(url, output, quiet=False)
LABELS = Path('class_names.txt').read_text().splitlines()
model = nn.Sequential(
nn.Conv2d(1, 32, 3, padding='same'),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, padding='same'),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(64, 128, 3, padding='same'),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(1152, 256),
nn.ReLU(),
nn.Linear(256, len(LABELS)),
)
state_dict = torch.load('pytorch_model.bin', map_location='cpu')
model.load_state_dict(state_dict, strict=False)
model.eval()
def predict(input):
im = input
if im is None:
return None
x = torch.tensor(im, dtype=torch.float32).unsqueeze(0).unsqueeze(0) / 255.
with torch.no_grad():
out = model(x)
probabilities = torch.nn.functional.softmax(out[0], dim=0)
values, indices = torch.topk(probabilities, 5)
return {LABELS[i]: v.item() for i, v in zip(indices, values)}
interface = gr.Interface(predict, inputs=gr.templates.Sketchpad(label="Draw Here"), outputs=gr.Label(label="Guess"), theme="default", css=".footer{display:none !important}", live=True)
interface.launch(enable_queue=False)
================================================
FILE: examples/data_science/tensorflow/README.md
================================================
# Tensorflow application
Simple Tensorflow sample project with Devbox.
## Setup
- Make sure to have [devbox installed](https://www.jetify.com/devbox/docs/quickstart/#install-devbox)
- Clone this repo: `git clone https://github.com/jetify-com/devbox.git`
- `cd devbox/examples/data_science/tensorflow/`
- `devbox shell`
- `python3 main.py`
================================================
FILE: examples/data_science/tensorflow/devbox.json
================================================
{
"packages": [
"python310Packages.pip",
"stdenv.cc.cc.lib",
"python310@latest"
],
"shell": {
"init_hook": [
". $VENV_DIR/bin/activate",
"pip install -r requirements.txt"
]
},
"nixpkgs": {
"commit": "f80ac848e3d6f0c12c52758c0f25c10c97ca3b62"
}
}
================================================
FILE: examples/data_science/tensorflow/main.py
================================================
import tensorflow as tf
# Simple python script using Tensorflow
print(tf.reduce_sum(tf.random.normal([1000, 1000])))
================================================
FILE: examples/data_science/tensorflow/requirements.txt
================================================
tf-nightly
================================================
FILE: examples/databases/mariadb/.gitignore
================================================
conf/mysql/data
*.log
*.pid
*.sock
================================================
FILE: examples/databases/mariadb/README.md
================================================
# mariadb
## mariadb Notes
1. Start the mariadb server using `devbox services up`
1. Create a database using `"mysql --socket-path=$MYSQL_UNIX_PORT --password='' < setup_db.sql"`
1. You can now connect to the database from the command line by running `devbox run connect_db`
## Services
* mariadb
Use `devbox services start|stop [service]` to interact with services
## This plugin sets the following environment variables
* MYSQL_BASEDIR=/<projectDir>/.devbox/nix/profile/default
* MYSQL_HOME=/<projectDir>/.devbox/virtenv/mariadb/run
* MYSQL_DATADIR=/<projectDir>/.devbox/virtenv/mariadb/data
* MYSQL_UNIX_PORT=/<projectDir>/.devbox/virtenv/mariadb/run/mysql.sock
* MYSQL_PID_FILE=/<projectDir>/.devbox/virtenv/mariadb/run/mysql.pid
To show this information, run `devbox info mariadb`
Note that the `.sock` filepath can only be maximum 100 characters long. You can point to a different path by setting the `MYSQL_UNIX_PORT` env variable in your `devbox.json`.
================================================
FILE: examples/databases/mariadb/devbox.json
================================================
{
"packages": [
"mariadb@latest"
],
"shell": {
"init_hook": [],
"scripts": {
"connect_db": [
"mysql -u devbox_user -p -D devbox_lamp"
],
"test_db_setup": [
"mkdir -p /tmp/devbox/mariadb/run",
"devbox services up -b",
"sleep 5",
"mysql -u root --password='' < setup_db.sql",
"devbox services stop"
]
}
},
"nixpkgs": {
"commit": "f80ac848e3d6f0c12c52758c0f25c10c97ca3b62"
},
"env": {
}
}
================================================
FILE: examples/databases/mariadb/setup_db.sql
================================================
--- You should run this query using `mysql -u root < setup_db.sql`
DROP DATABASE IF EXISTS devbox_lamp;
CREATE DATABASE devbox_lamp;
USE devbox_lamp
CREATE USER 'devbox_user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON devbox_lamp.* TO 'devbox_user'@'localhost' IDENTIFIED BY 'password';
DROP TABLE IF EXISTS colors;
CREATE TABLE colors (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
hex VARCHAR(7) NOT NULL,
PRIMARY KEY (id));
INSERT INTO colors (name, hex) VALUES ('red', '#FF0000'), ('blue', '#0000FF'), ('green', '#00FF00');
================================================
FILE: examples/databases/mysql/README.md
================================================
# mysql
## mysql Notes
1. Start the mysql server using `devbox services up`
1. Create a database using `"mysql -u root --password='' < setup_db.sql"`
1. You can now connect to the database from the command line by running `devbox run connect_db`
## Services
* mysql
Use `devbox services start|stop [service]` to interact with services
## This plugin sets the following environment variables
* MYSQL_BASEDIR=<projectDir>/.devbox/nix/profile/default
* MYSQL_HOME=<projectDir>/.devbox/virtenv/mysql/run
* MYSQL_DATADIR=<projectDir>/.devbox/virtenv/mysql/data
* MYSQL_UNIX_PORT=<projectDir>/.devbox/virtenv/mysql/run/mysql.sock
* MYSQL_PID_FILE=<projectDir>/.devbox/virtenv/mysql/run/mysql.pid
To show this information, run `devbox info mysql`
Note that the `.sock` filepath can only be maximum 100 characters long. You can point to a different path by setting the `MYSQL_UNIX_PORT` env variable in your `devbox.json`.
================================================
FILE: examples/databases/mysql/devbox.d/mysql/my.cnf
================================================
# MySQL configuration file
[mariadbd]
# Change this port if 3306 is already used
#port = 3306
log_error=mysql.log
================================================
FILE: examples/databases/mysql/devbox.d/mysql80/my.cnf
================================================
# MySQL configuration file
# [mysqld]
# skip-log-bin
# Change this port if 3306 is already used
#port = 3306
================================================
FILE: examples/databases/mysql/devbox.d/mysql84/my.cnf
================================================
# MySQL configuration file
# [mysqld]
# skip-log-bin
# Change this port if 3306 is already used
#port = 3306
================================================
FILE: examples/databases/mysql/devbox.json
================================================
{
"packages": ["mysql84@latest"],
"shell": {
"init_hook": [],
"scripts": {
"connect_db": [
"mysql -u devbox_user -p -D devbox_lamp",
],
"test_db_setup": [
"mkdir -p /tmp/devbox/mariadb/run",
"devbox services up -b",
"sleep 5",
"mysql -u root --password='' < setup_db.sql",
"devbox services stop",
],
},
},
}
================================================
FILE: examples/databases/mysql/my.cnf
================================================
[mysqld]
# Use a different port to avoid conflicts
port = 3307
# Basic settings
datadir = .devbox/virtenv/mysql80/data
pid-file = .devbox/virtenv/mysql80/run/mysql.pid
log-error = .devbox/virtenv/mysql80/run/mysql-error.log
socket = .devbox/virtenv/mysql80/run/mysql.sock
lc_messages_dir = .devbox/virtenv/mysql80/share/mysql/
lc_messages = en_US
# Disable X Plugin which also causes conflicts
mysqlx = 0
# Performance settings
max_connections = 100
key_buffer_size = 16M
max_allowed_packet = 16M
[client]
socket = .devbox/virtenv/mysql80/run/mysql.sock
================================================
FILE: examples/databases/mysql/setup_db.sql
================================================
-- You should run this query using `mysql -u root < setup_db.sql`
DROP DATABASE IF EXISTS devbox_lamp;
CREATE DATABASE devbox_lamp;
USE devbox_lamp;
CREATE USER 'devbox_user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON devbox_lamp.* TO 'devbox_user'@'localhost';
DROP TABLE IF EXISTS colors;
CREATE TABLE colors (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
hex VARCHAR(7) NOT NULL,
PRIMARY KEY (id));
INSERT INTO colors (name, hex) VALUES ('red', '#FF0000'), ('blue', '#0000FF'), ('green', '#00FF00');
================================================
FILE: examples/databases/postgres/.gitignore
================================================
*.log
*.pid
*.sock
data/
================================================
FILE: examples/databases/postgres/README.md
================================================
# postgresql-14.6
## postgresql Notes
You need to initialize and create a database as part of your setup.
1. Initialize a DB by running `initdb`
1. Start the Postgres server using `devbox services up`
1. Create a database using `createdb <name_of_db>`
1. You can now connect to the database from the command line by running `psql <name_of_db>`
To start the database manually run `pg_ctl -l .devbox/conf/postgresql/logfile start`.
To stop use `pg_ctl stop`.
## Services
* postgresql
Use `devbox services start|stop [service]` to interact with services
## This plugin sets the following environment variables
* PGDATA=/<projectDir>/.devbox/conf/postgresql/data
* PGHOST=/<projectDir>/.devbox/virtenv/postgresql
To show this information, run `devbox info postgresql`
================================================
FILE: examples/databases/postgres/devbox.json
================================================
{
"packages": {
"postgresql": "latest"
},
"shell": {
"init_hook": null
}
}
================================================
FILE: examples/databases/postgres/setup_postgres_db.sql
================================================
--- You should run this query using psql < setup_db.sql`
DROP DATABASE IF EXISTS devbox_lamp;
CREATE DATABASE devbox_lamp;
CREATE USER devbox_user WITH PASSWORD 'password';
DROP TABLE IF EXISTS colors;
CREATE TABLE colors (
id SERIAL NOT NULL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
hex VARCHAR(7) NOT NULL);
INSERT INTO colors (name, hex) VALUES ('red', '#FF0000'), ('blue', '#0000FF'), ('green', '#00FF00');
GRANT ALL PRIVILEGES ON colors TO devbox_user;
================================================
FILE: examples/databases/redis/README.md
================================================
# redis-7.0.5
## redis Notes
Running `devbox services start redis` will start redis as a daemon in the background.
You can manually start Redis in the foreground by running `redis-server $REDIS_CONF --port $REDIS_PORT`.
Logs, pidfile, and data dumps are stored in `.devbox/virtenv/redis`. You can change this by modifying the `dir` directive in `devbox.d/redis/redis.conf`
## Services
* redis
Use `devbox services start|stop [service]` to interact with services
## This plugin creates the following helper files
* ./devbox.d/redis/redis.conf
## This plugin sets the following environment variables
* REDIS_PORT=6379
* REDIS_CONF=./devbox.d/redis/redis.conf
To show this information, run `devbox info redis`
================================================
FILE: examples/databases/redis/devbox.d/redis/redis.conf
================================================
# Redis configuration file example.
#
# Note that in order to read the configuration file, Redis must be
# started with the file path as first argument:
#
# ./redis-server /path/to/redis.conf
# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.
################################## INCLUDES ###################################
# Include one or more other config files here. This is useful if you
# have a standard template that goes to all Redis servers but also need
# to customize a few per-server settings. Include files can include
# other files, so use this wisely.
#
# Notice option "include" won't be rewritten by command "CONFIG REWRITE"
# from admin or Redis Sentinel. Since Redis always uses the last processed
# line as value of a configuration directive, you'd better put includes
# at the beginning of this file to avoid overwriting config change at runtime.
#
# If instead you are interested in using includes to override configuration
# options, it is better to use include as the last line.
#
# include /path/to/local.conf
# include /path/to/other.conf
################################## MODULES #####################################
# Load modules at startup. If the server is not able to load modules
# it will abort. It is possible to use multiple loadmodule directives.
#
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so
################################## NETWORK #####################################
# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the
# internet, binding to all the interfaces is dangerous and will expose the
# instance to everybody on the internet. So by default we uncomment the
# following bind directive, that will force Redis to listen only into
# the IPv4 lookback interface address (this means Redis will be able to
# accept connections only from clients running into the same computer it
# is running).
#
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1
# Protected mode is a layer of security protection, in order to avoid that
# Redis instances left open on the internet are accessed and exploited.
#
# When protected mode is on and if:
#
# 1) The server is not binding explicitly to a set of addresses using the
# "bind" directive.
# 2) No password is configured.
#
# The server only accepts connections from clients connecting from the
# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain
# sockets.
#
# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
protected-mode yes
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379
# TCP listen() backlog.
#
# In high requests-per-second environments you need an high backlog in order
# to avoid slow clients connections issues. Note that the Linux kernel
# will silently truncate it to the value of /proc/sys/net/core/somaxconn so
# make sure to raise both the value of somaxconn and tcp_max_syn_backlog
# in order to get the desired effect.
tcp-backlog 511
# Unix socket.
#
# Specify the path for the Unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#
# unixsocket /tmp/redis.sock
# unixsocketperm 700
# Close the connection after a client is idle for N seconds (0 to disable)
timeout 0
# TCP keepalive.
#
# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence
# of communication. This is useful for two reasons:
#
# 1) Detect dead peers.
# 2) Take the connection alive from the point of view of network
# equipment in the middle.
#
# On Linux, the specified value (in seconds) is the period used to send ACKs.
# Note that to close the connection the double of the time is needed.
# On other kernels the period depends on the kernel configuration.
#
# A reasonable value for this option is 300 seconds, which is the new
# Redis default starting with Redis 3.2.1.
tcp-keepalive 300
################################# GENERAL #####################################
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize no
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised no
# If a pid file is specified, Redis writes it where specified at startup
# and removes it at exit.
#
# When the server runs non daemonized, no pid file is created if none is
# specified in the configuration. When the server is daemonized, the pid file
# is used even if not specified, defaulting to "/var/run/redis.pid".
#
# Creating a pid file is best effort: if Redis is not able to create it
# nothing bad happens, the server will start and run normally.
pidfile redis.pid
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice
# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile redis.log
# To enable logging to the system logger, just set 'syslog-enabled' to yes,
# and optionally update the other syslog parameters to suit your needs.
# syslog-enabled no
# Specify the syslog identity.
# syslog-ident redis
# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7.
# syslog-facility local0
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16
# By default Redis shows an ASCII art logo only when started to log to the
# standard output and if the standard output is a TTY. Basically this means
# that normally a logo is displayed only in interactive sessions.
#
# However it is possible to force the pre-4.0 behavior and always show a
# ASCII art logo in startup logs by setting the following option to yes.
always-show-logo yes
################################ SNAPSHOTTING ################################
#
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""
save 900 1
save 300 10
save 60 10000
# By default Redis will stop accepting writes if RDB snapshots are enabled
# (at least one save point) and the latest background save failed.
# This will make the user aware (in a hard way) that data is not persisting
# on disk properly, otherwise chances are that no one will notice and some
# disaster will happen.
#
# If the background saving process will start working again Redis will
# automatically allow writes again.
#
# However if you have setup your proper monitoring of the Redis server
# and persistence, you may want to disable this feature so that Redis will
# continue to work as usual even if there are problems with disk,
# permissions, and so forth.
stop-writes-on-bgsave-error yes
# Compress string objects using LZF when dump .rdb databases?
# For default that's set to 'yes' as it's almost always a win.
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes
# Since version 5 of RDB a CRC64 checksum is placed at the end of the file.
# This makes the format more resistant to corruption but there is a performance
# hit to pay (around 10%) when saving and loading RDB files, so you can disable it
# for maximum performances.
#
# RDB files created with checksum disabled have a checksum of zero that will
# tell the loading code to skip the check.
rdbchecksum yes
# The filename where to dump the DB
dbfilename dump.rdb
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir .devbox/virtenv/redis/
################################# REPLICATION #################################
# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
#
# 1) Redis replication is asynchronous, but you can configure a master to
# stop accepting writes if it appears to be not connected with at least
# a given number of slaves.
# 2) Redis slaves are able to perform a partial resynchronization with the
# master if the replication link is lost for a relatively small amount of
# time. You may want to configure the replication backlog size (see the next
# sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
# network partition slaves automatically try to reconnect to masters
# and resynchronize with them.
#
# slaveof <masterip> <masterport>
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
# masterauth <master-password>
# When a slave loses its connection with the master, or when the replication
# is still in progress, the slave can act in two different ways:
#
# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will
# still reply to client requests, possibly with out of date data, or the
# data set may just be empty if this is the first synchronization.
#
# 2) if slave-serve-stale-data is set to 'no' the slave will reply with
# an error "SYNC with master in progress" to all the kind of commands
# but to INFO and SLAVEOF.
#
slave-serve-stale-data yes
# You can configure a slave instance to accept writes or not. Writing against
# a slave instance may be useful to store some ephemeral data (because data
# written on a slave will be easily deleted after resync with the master) but
# may also cause problems if clients are writing to it because of a
# misconfiguration.
#
# Since Redis 2.6 by default slaves are read-only.
#
# Note: read only slaves are not designed to be exposed to untrusted clients
# on the internet. It's just a protection layer against misuse of the instance.
# Still a read only slave exports by default all the administrative commands
# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve
# security of read only slaves using 'rename-command' to shadow all the
# administrative / dangerous commands.
slave-read-only yes
# Replication SYNC strategy: disk or socket.
#
# -------------------------------------------------------
# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY
# -------------------------------------------------------
#
# New slaves and reconnecting slaves that are not able to continue the replication
# process just receiving differences, need to do what is called a "full
# synchronization". An RDB file is transmitted from the master to the slaves.
# The transmission can happen in two different ways:
#
# 1) Disk-backed: The Redis master creates a new process that writes the RDB
# file on disk. Later the file is transferred by the parent
# process to the slaves incrementally.
# 2) Diskless: The Redis master creates a new process that directly writes the
# RDB file to slave sockets, without touching the disk at all.
#
# With disk-backed replication, while the RDB file is generated, more slaves
# can be queued and served with the RDB file as soon as the current child producing
# the RDB file finishes its work. With diskless replication instead once
# the transfer starts, new slaves arriving will be queued and a new transfer
# will start when the current one terminates.
#
# When diskless replication is used, the master waits a configurable amount of
# time (in seconds) before starting the transfer in the hope that multiple slaves
# will arrive and the transfer can be parallelized.
#
# With slow disks and fast (large bandwidth) networks, diskless replication
# works better.
repl-diskless-sync no
# When diskless replication is enabled, it is possible to configure the delay
# the server waits in order to spawn the child that transfers the RDB via socket
# to the slaves.
#
# This is important since once the transfer starts, it is not possible to serve
# new slaves arriving, that will be queued for the next RDB transfer, so the server
# waits a delay in order to let more slaves arrive.
#
# The delay is specified in seconds, and by default is 5 seconds. To disable
# it entirely just set it to 0 seconds and the transfer will start ASAP.
repl-diskless-sync-delay 5
# Slaves send PINGs to server in a predefined interval. It's possible to change
# this interval with the repl_ping_slave_period option. The default value is 10
# seconds.
#
# repl-ping-slave-period 10
# The following option sets the replication timeout for:
#
# 1) Bulk transfer I/O during SYNC, from the point of view of slave.
# 2) Master timeout from the point of view of slaves (data, pings).
# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings).
#
# It is important to make sure that this value is greater than the value
# specified for repl-ping-slave-period otherwise a timeout will be detected
# every time there is low traffic between the master and the slave.
#
# repl-timeout 60
# Disable TCP_NODELAY on the slave socket after SYNC?
#
# If you select "yes" Redis will use a smaller number of TCP packets and
# less bandwidth to send data to slaves. But this can add a delay for
# the data to appear on the slave side, up to 40 milliseconds with
# Linux kernels using a default configuration.
#
# If you select "no" the delay for data to appear on the slave side will
# be reduced but more bandwidth will be used for replication.
#
# By default we optimize for low latency, but in very high traffic conditions
# or when the master and slaves are many hops away, turning this to "yes" may
# be a good idea.
repl-disable-tcp-nodelay no
# Set the replication backlog size. The backlog is a buffer that accumulates
# slave data when slaves are disconnected for some time, so that when a slave
# wants to reconnect again, often a full resync is not needed, but a partial
# resync is enough, just passing the portion of data the slave missed while
# disconnected.
#
# The bigger the replication backlog, the longer the time the slave can be
# disconnected and later be able to perform a partial resynchronization.
#
# The backlog is only allocated once there is at least a slave connected.
#
# repl-backlog-size 1mb
# After a master has no longer connected slaves for some time, the backlog
# will be freed. The following option configures the amount of seconds that
# need to elapse, starting from the time the last slave disconnected, for
# the backlog buffer to be freed.
#
# Note that slaves never free the backlog for timeout, since they may be
# promoted to masters later, and should be able to correctly "partially
# resynchronize" with the slaves: hence they should always accumulate backlog.
#
# A value of 0 means to never release the backlog.
#
# repl-backlog-ttl 3600
# The slave priority is an integer number published by Redis in the INFO output.
# It is used by Redis Sentinel in order to select a slave to promote into a
# master if the master is no longer working correctly.
#
# A slave with a low priority number is considered better for promotion, so
# for instance if there are three slaves with priority 10, 100, 25 Sentinel will
# pick the one with priority 10, that is the lowest.
#
# However a special priority of 0 marks the slave as not able to perform the
# role of master, so a slave with priority of 0 will never be selected by
# Redis Sentinel for promotion.
#
# By default the priority is 100.
slave-priority 100
# It is possible for a master to stop accepting writes if there are less than
# N slaves connected, having a lag less or equal than M seconds.
#
# The N slaves need to be in "online" state.
#
# The lag in seconds, that must be <= the specified value, is calculated from
# the last ping received from the slave, that is usually sent every second.
#
# This option does not GUARANTEE that N replicas will accept the write, but
# will limit the window of exposure for lost writes in case not enough slaves
# are available, to the specified number of seconds.
#
# For example to require at least 3 slaves with a lag <= 10 seconds use:
#
# min-slaves-to-write 3
# min-slaves-max-lag 10
#
# Setting one or the other to 0 disables the feature.
#
# By default min-slaves-to-write is set to 0 (feature disabled) and
# min-slaves-max-lag is set to 10.
# A Redis master is able to list the address and port of the attached
# slaves in different ways. For example the "INFO replication" section
# offers this information, which is used, among other tools, by
# Redis Sentinel in order to discover slave instances.
# Another place where this info is available is in the output of the
# "ROLE" command of a master.
#
# The listed IP and address normally reported by a slave is obtained
# in the following way:
#
# IP: The address is auto detected by checking the peer address
# of the socket used by the slave to connect with the master.
#
# Port: The port is communicated by the slave during the replication
# handshake, and is normally the port that the slave is using to
# list for connections.
#
# However when port forwarding or Network Address Translation (NAT) is
# used, the slave may be actually reachable via different IP and port
# pairs. The following two options can be used by a slave in order to
# report to its master a specific set of IP and port, so that both INFO
# and ROLE will report those values.
#
# There is no need to use both the options if you need to override just
# the port or the IP address.
#
# slave-announce-ip 5.5.5.5
# slave-announce-port 1234
################################## SECURITY ###################################
# Require clients to issue AUTH <PASSWORD> before processing any other
# commands. This might be useful in environments in which you do not trust
# others with access to the host running redis-server.
#
# This should stay commented out for backward compatibility and because most
# people do not need auth (e.g. they run their own servers).
#
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#
# requirepass foobared
# Command renaming.
#
# It is possible to change the name of dangerous commands in a shared
# environment. For instance the CONFIG command may be renamed into something
# hard to guess so that it will still be available for internal-use tools
# but not available for general clients.
#
# Example:
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
# rename-command CONFIG ""
#
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to slaves may cause problems.
################################### CLIENTS ####################################
# Set the max number of connected clients at the same time. By default
# this limit is set to 10000 clients, however if the Redis server is not
# able to configure the process file limit to allow for the specified limit
# the max number of allowed clients is set to the current file limit
# minus 32 (as Redis reserves a few file descriptors for internal uses).
#
# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
#
# maxclients 10000
############################## MEMORY MANAGEMENT ################################
# Set a memory usage limit to the specified amount of bytes.
# When the memory limit is reached Redis will try to remove keys
# according to the eviction policy selected (see maxmemory-policy).
#
# If Redis can't remove keys according to the policy, or if the policy is
# set to 'noeviction', Redis will start to reply with errors to commands
# that would use more memory, like SET, LPUSH, and so on, and will continue
# to reply to read-only commands like GET.
#
# This option is usually useful when using Redis as an LRU or LFU cache, or to
# set a hard memory limit for an instance (using the 'noeviction' policy).
#
# WARNING: If you have slaves attached to an instance with maxmemory on,
# the size of the output buffers needed to feed the slaves are subtracted
# from the used memory count, so that network problems / resyncs will
# not trigger a loop where keys are evicted, and in turn the output
# buffer of slaves is full with DELs of keys evicted triggering the deletion
# of more keys, and so forth until the database is completely emptied.
#
# In short... if you have slaves attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for slave
# output buffers (but this is not needed if the policy is 'noeviction').
#
# maxmemory <bytes>
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#
# volatile-lru -> Evict using approximated LRU among the keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key among the ones with an expire set.
# allkeys-random -> Remove a random key, any key.
# volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
# noeviction -> Don't evict anything, just return an error on write operations.
#
# LRU means Least Recently Used
# LFU means Least Frequently Used
#
# Both LRU, LFU and volatile-ttl are implemented using approximated
# randomized algorithms.
#
# Note: with any of the above policies, Redis will return an error on write
# operations, when there are no suitable keys for eviction.
#
# At the date of writing these commands are: set setnx setex append
# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
# getset mset msetnx exec sort
#
# The default is:
#
# maxmemory-policy noeviction
# LRU, LFU and minimal TTL algorithms are not precise algorithms but approximated
# algorithms (in order to save memory), so you can tune it for speed or
# accuracy. For default Redis will check five keys and pick the one that was
# used less recently, you can change the sample size using the following
# configuration directive.
#
# The default of 5 produces good enough results. 10 Approximates very closely
# true LRU but costs more CPU. 3 is faster but not very accurate.
#
# maxmemory-samples 5
############################# LAZY FREEING ####################################
# Redis has two primitives to delete keys. One is called DEL and is a blocking
# deletion of the object. It means that the server stops processing new commands
# in order to reclaim all the memory associated with an object in a synchronous
# way. If the key deleted is associated with a small object, the time needed
# in order to execute the DEL command is very small and comparable to most other
# O(1) or O(log_N) commands in Redis. However if the key is associated with an
# aggregated value containing millions of elements, the server can block for
# a long time (even seconds) in order to complete the operation.
#
# For the above reasons Redis also offers non blocking deletion primitives
# such as UNLINK (non blocking DEL) and the ASYNC option of FLUSHALL and
# FLUSHDB commands, in order to reclaim memory in background. Those commands
# are executed in constant time. Another thread will incrementally free the
# object in the background as fast as possible.
#
# DEL, UNLINK and ASYNC option of FLUSHALL and FLUSHDB are user-controlled.
# It's up to the design of the application to understand when it is a good
# idea to use one or the other. However the Redis server sometimes has to
# delete keys or flush the whole database as a side effect of other operations.
# Specifically Redis deletes objects independently of a user call in the
# following scenarios:
#
# 1) On eviction, because of the maxmemory and maxmemory policy configurations,
# in order to make room for new data, without going over the specified
# memory limit.
# 2) Because of expire: when a key with an associated time to live (see the
# EXPIRE command) must be deleted from memory.
# 3) Because of a side effect of a command that stores data on a key that may
# already exist. For example the RENAME command may delete the old key
# content when it is replaced with another one. Similarly SUNIONSTORE
# or SORT with STORE option may delete existing keys. The SET command
# itself removes any old content of the specified key in order to replace
# it with the specified string.
# 4) During replication, when a slave performs a full resynchronization with
# its master, the content of the whole database is removed in order to
# load the RDB file just transferred.
#
# In all the above cases the default is to delete objects in a blocking way,
# like if DEL was called. However you can configure each case specifically
# in order to instead release memory in a non-blocking way like if UNLINK
# was called, using the following configuration directives:
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
############################## APPEND ONLY MODE ###############################
# By default Redis asynchronously dumps the dataset on disk. This mode is
# good enough in many applications, but an issue with the Redis process or
# a power outage may result into a few minutes of writes lost (depending on
# the configured save points).
#
# The Append Only File is an alternative persistence mode that provides
# much better durability. For instance using the default data fsync policy
# (see later in the config file) Redis can lose just one second of writes in a
# dramatic event like a server power outage, or a single write if something
# wrong with the Redis process itself happens, but the operating system is
# still running correctly.
#
# AOF and RDB persistence can be enabled at the same time without problems.
# If the AOF is enabled on startup Redis will load the AOF, that is the file
# with the better durability guarantees.
#
# Please check http://redis.io/topics/persistence for more information.
appendonly no
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
# The fsync() call tells the Operating System to actually write data on disk
# instead of waiting for more data in the output buffer. Some OS will really flush
# data on disk, some other OS will just try to do it ASAP.
#
# Redis supports three different modes:
#
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# always: fsync after every write to the append only log. Slow, Safest.
# everysec: fsync only one time every second. Compromise.
#
# The default is "everysec", as that's usually the right compromise between
# speed and data safety. It's up to you to understand if you can relax this to
# "no" that will let the operating system flush the output buffer when
# it wants, for better performances (but if you can live with the idea of
# some data loss consider the default persistence mode that's snapshotting),
# or on the contrary, use "always" that's very slow but a bit safer than
# everysec.
#
# More details please check the following article:
# http://antirez.com/post/redis-persistence-demystified.html
#
# If unsure, use "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
# When the AOF fsync policy is set to always or everysec, and a background
# saving process (a background save or AOF log background rewriting) is
# performing a lot of I/O against the disk, in some Linux configurations
# Redis may block too long on the fsync() call. Note that there is no fix for
# this currently, as even performing fsync in a different thread will block
# our synchronous write(2) call.
#
# In order to mitigate this problem it's possible to use the following option
# that will prevent fsync() from being called in the main process while a
# BGSAVE or BGREWRITEAOF is in progress.
#
# This means that while another child is saving, the durability of Redis is
# the same as "appendfsync none". In practical terms, this means that it is
# possible to lose up to 30 seconds of log in the worst scenario (with the
# default Linux settings).
#
# If you have latency problems turn this to "yes". Otherwise leave it as
# "no" that is the safest pick from the point of view of durability.
no-appendfsync-on-rewrite no
# Automatic rewrite of the append only file.
# Redis is able to automatically rewrite the log file implicitly calling
# BGREWRITEAOF when the AOF log size grows by the specified percentage.
#
# This is how it works: Redis remembers the size of the AOF file after the
# latest rewrite (if no rewrite has happened since the restart, the size of
# the AOF at startup is used).
#
# This base size is compared to the current size. If the current size is
# bigger than the specified percentage, the rewrite is triggered. Also
# you need to specify a minimal size for the AOF file to be rewritten, this
# is useful to avoid rewriting the AOF file even if the percentage increase
# is reached but it is still pretty small.
#
# Specify a percentage of zero in order to disable the automatic AOF
# rewrite feature.
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# An AOF file may be found to be truncated at the end during the Redis
# startup process, when the AOF data gets loaded back into memory.
# This may happen when the system where Redis is running
# crashes, especially when an ext4 filesystem is mounted without the
# data=ordered option (however this can't happen when Redis itself
# crashes or aborts but the operating system still works correctly).
#
# Redis can either exit with an error when this happens, or load as much
# data as possible (the default now) and start if the AOF file is found
# to be truncated at the end. The following option controls this behavior.
#
# If aof-load-truncated is set to yes, a truncated AOF file is loaded and
# the Redis server starts emitting a log to inform the user of the event.
# Otherwise if the option is set to no, the server aborts with an error
# and refuses to start. When the option is set to no, the user requires
# to fix the AOF file using the "redis-check-aof" utility before to restart
# the server.
#
# Note that if the AOF file will be found to be corrupted in the middle
# the server will still exit with an error. This option only applies when
# Redis will try to read more data from the AOF file but not enough bytes
# will be found.
aof-load-truncated yes
# When rewriting the AOF file, Redis is able to use an RDB preamble in the
# AOF file for faster rewrites and recoveries. When this option is turned
# on the rewritten AOF file is composed of two different stanzas:
#
# [RDB file][AOF tail]
#
# When loading Redis recognizes that the AOF file starts with the "REDIS"
# string and loads the prefixed RDB file, and continues loading the AOF
# tail.
#
# This is currently turned off by default in order to avoid the surprise
# of a format change, but will at some point be used as the default.
aof-use-rdb-preamble no
################################ LUA SCRIPTING ###############################
# Max execution time of a Lua script in milliseconds.
#
# If the maximum execution time is reached Redis will log that a script is
# still in execution after the maximum allowed time and will start to
# reply to queries with an error.
#
# When a long running script exceeds the maximum execution time only the
# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be
# used to stop a script that did not yet called write commands. The second
# is the only way to shut down the server in the case a write command was
# already issued by the script but the user doesn't want to wait for the natural
# termination of the script.
#
# Set it to 0 or a negative value for unlimited execution without warnings.
lua-time-limit 5000
################################ REDIS CLUSTER ###############################
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however
# in order to mark it as "mature" we need to wait for a non trivial percentage
# of users to deploy it in production.
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# Normal Redis instances can't be part of a Redis Cluster; only nodes that are
# started as cluster nodes can. In order to start a Redis instance as a
# cluster node enable the cluster support uncommenting the following:
#
# cluster-enabled yes
# Every cluster node has a cluster configuration file. This file is not
# intended to be edited by hand. It is created and updated by Redis nodes.
# Every Redis Cluster node requires a different cluster configuration file.
# Make sure that instances running in the same system do not have
# overlapping cluster configuration file names.
#
# cluster-config-file nodes-6379.conf
# Cluster node timeout is the amount of milliseconds a node must be unreachable
# for it to be considered in failure state.
# Most other internal time limits are multiple of the node timeout.
#
# cluster-node-timeout 15000
# A slave of a failing master will avoid to start a failover if its data
# looks too old.
#
# There is no simple way for a slave to actually have an exact measure of
# its "data age", so the following two checks are performed:
#
# 1) If there are multiple slaves able to failover, they exchange messages
# in order to try to give an advantage to the slave with the best
# replication offset (more data from the master processed).
# Slaves will try to get their rank by offset, and apply to the start
# of the failover a delay proportional to their rank.
#
# 2) Every single slave computes the time of the last interaction with
# its master. This can be the last ping or command received (if the master
# is still in the "connected" state), or the time that elapsed since the
# disconnection with the master (if the replication link is currently down).
# If the last interaction is too old, the slave will not try to failover
# at all.
#
# The point "2" can be tuned by user. Specifically a slave will not perform
# the failover if, since the last interaction with the master, the time
# elapsed is greater than:
#
# (node-timeout * slave-validity-factor) + repl-ping-slave-period
#
# So for example if node-timeout is 30 seconds, and the slave-validity-factor
# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the
# slave will not try to failover if it was not able to talk with the master
# for longer than 310 seconds.
#
# A large slave-validity-factor may allow slaves with too old data to failover
# a master, while a too small value may prevent the cluster from being able to
# elect a slave at all.
#
# For maximum availability, it is possible to set the slave-validity-factor
# to a value of 0, which means, that slaves will always try to failover the
# master regardless of the last time they interacted with the master.
# (However they'll always try to apply a delay proportional to their
# offset rank).
#
# Zero is the only value able to guarantee that when all the partitions heal
# the cluster will always be able to continue.
#
# cluster-slave-validity-factor 10
# Cluster slaves are able to migrate to orphaned masters, that are masters
# that are left without working slaves. This improves the cluster ability
# to resist to failures as otherwise an orphaned master can't be failed over
# in case of failure if it has no working slaves.
#
# Slaves migrate to orphaned masters only if there are still at least a
# given number of other working slaves for their old master. This number
# is the "migration barrier". A migration barrier of 1 means that a slave
# will migrate only if there is at least 1 other working slave for its master
# and so forth. It usually reflects the number of slaves you want for every
# master in your cluster.
#
# Default is 1 (slaves migrate only if their masters remain with at least
# one slave). To disable migration just set it to a very large value.
# A value of 0 can be set but is useful only for debugging and dangerous
# in production.
#
# cluster-migration-barrier 1
# By default Redis Cluster nodes stop accepting queries if they detect there
# is at least an hash slot uncovered (no available node is serving it).
# This way if the cluster is partially down (for example a range of hash slots
# are no longer covered) all the cluster becomes, eventually, unavailable.
# It automatically returns available as soon as all the slots are covered again.
#
# However sometimes you want the subset of the cluster which is working,
# to continue to accept queries for the part of the key space that is still
# covered. In order to do so, just set the cluster-require-full-coverage
# option to no.
#
# cluster-require-full-coverage yes
# This option, when set to yes, prevents slaves from trying to failover its
# master during master failures. However the master can still perform a
# manual failover, if forced to do so.
#
# This is useful in different scenarios, especially in the case of multiple
# data center operations, where we want one side to never be promoted if not
# in the case of a total DC failure.
#
# cluster-slave-no-failover no
# In order to setup your cluster make sure to read the documentation
# available at http://redis.io web site.
########################## CLUSTER DOCKER/NAT support ########################
# In certain deployments, Redis Cluster nodes address discovery fails, because
# addresses are NAT-ted or because ports are forwarded (the typical case is
# Docker and other containers).
#
# In order to make Redis Cluster working in such environments, a static
# configuration where each node knows its public address is needed. The
# following two options are used for this scope, and are:
#
# * cluster-announce-ip
# * cluster-announce-port
# * cluster-announce-bus-port
#
# Each instruct the node about its address, client port, and cluster message
# bus port. The information is then published in the header of the bus packets
# so that other nodes will be able to correctly map the address of the node
# publishing the information.
#
# If the above options are not used, the normal Redis Cluster auto-detection
# will be used instead.
#
# Note that when remapped, the bus port may not be at the fixed offset of
# clients port + 10000, so you can specify any port and bus-port depending
# on how they get remapped. If the bus-port is not set, a fixed offset of
# 10000 will be used as usually.
#
# Example:
#
# cluster-announce-ip 10.1.1.5
# cluster-announce-port 6379
# cluster-announce-bus-port 6380
################################## SLOW LOG ###################################
# The Redis Slow Log is a system to log queries that exceeded a specified
# execution time. The execution time does not include the I/O operations
# like talking with the client, sending the reply and so forth,
# but just the time needed to actually execute the command (this is the only
# stage of command execution where the thread is blocked and can not serve
# other requests in the meantime).
#
# You can configure the slow log with two parameters: one tells Redis
# what is the execution time, in microseconds, to exceed in order for the
# command to get logged, and the other parameter is the length of the
# slow log. When a new command is logged the oldest one is removed from the
# queue of logged commands.
# The following time is expressed in microseconds, so 1000000 is equivalent
# to one second. Note that a negative number disables the slow log, while
# a value of zero forces the logging of every command.
slowlog-log-slower-than 10000
# There is no limit to this length. Just be aware that it will consume memory.
# You can reclaim memory used by the slow log with SLOWLOG RESET.
slowlog-max-len 128
################################ LATENCY MONITOR ##############################
# The Redis latency monitoring subsystem samples different operations
# at runtime in order to collect data related to possible sources of
# latency of a Redis instance.
#
# Via the LATENCY command this information is available to the user that can
# print graphs and obtain reports.
#
# The system only logs operations that were performed in a time equal or
# greater than the amount of milliseconds specified via the
# latency-monitor-threshold configuration directive. When its value is set
# to zero, the latency monitor is turned off.
#
# By default latency monitoring is disabled since it is mostly not needed
# if you don't have latency issues, and collecting data has a performance
# impact, that while very small, can be measured under big load. Latency
# monitoring can easily be enabled at runtime using the command
# "CONFIG SET latency-monitor-threshold <milliseconds>" if needed.
latency-monitor-threshold 0
############################# EVENT NOTIFICATION ##############################
# Redis can notify Pub/Sub clients about events happening in the key space.
# This feature is documented at http://redis.io/topics/notifications
#
# For instance if keyspace events notification is enabled, and a client
# performs a DEL operation on key "foo" stored in the Database 0, two
# messages will be published via Pub/Sub:
#
# PUBLISH __keyspace@0__:foo del
# PUBLISH __keyevent@0__:del foo
#
# It is possible to select the events that Redis will notify among a set
# of classes. Every class is identified by a single character:
#
# K Keyspace events, published with __keyspace@<db>__ prefix.
# E Keyevent events, published with __keyevent@<db>__ prefix.
# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
# $ String commands
# l List commands
# s Set commands
# h Hash commands
# z Sorted set commands
# x Expired events (events generated every time a key expires)
# e Evicted events (events generated when a key is evicted for maxmemory)
# A Alias for g$lshzxe, so that the "AKE" string means all the events.
#
# The "notify-keyspace-events" takes as argument a string that is composed
# of zero or multiple characters. The empty string means that notifications
# are disabled.
#
# Example: to enable list and generic events, from the point of view of the
# event name, use:
#
# notify-keyspace-events Elg
#
# Example 2: to get the stream of the expired keys subscribing to channel
# name __keyevent@0__:expired use:
#
# notify-keyspace-events Ex
#
# By default all notifications are disabled because most users don't need
# this feature and the feature has some overhead. Note that if you don't
# specify at least one of K or E, no events will be delivered.
notify-keyspace-events ""
############################### ADVANCED CONFIG ###############################
# Hashes are encoded using a memory efficient data structure when they have a
# small number of entries, and the biggest entry does not exceed a given
# threshold. These thresholds can be configured using the following directives.
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# Lists are also encoded in a special way to save a lot of space.
# The number of entries allowed per internal list node can be specified
# as a fixed maximum size or a maximum number of elements.
# For a fixed maximum size, use -5 through -1, meaning:
# -5: max size: 64 Kb <-- not recommended for normal workloads
# -4: max size: 32 Kb <-- not recommended
# -3: max size: 16 Kb <-- probably not recommended
# -2: max size: 8 Kb <-- good
# -1: max size: 4 Kb <-- good
# Positive numbers mean store up to _exactly_ that number of elements
# per list node.
# The highest performing option is usually -2 (8 Kb size) or -1 (4 Kb size),
# but if your use case is unique, adjust the settings as necessary.
list-max-ziplist-size -2
# Lists may also be compressed.
# Compress depth is the number of quicklist ziplist nodes from *each* side of
# the list to *exclude* from compression. The head and tail of the list
# are always uncompressed for fast push/pop operations. Settings are:
# 0: disable all list compression
# 1: depth 1 means "don't start compressing until after 1 node into the list,
# going from either the head or tail"
# So: [head]->node->node->...->node->[tail]
# [head], [tail] will always be uncompressed; inner nodes will compress.
# 2: [head]->[next]->node->node->...->node->[prev]->[tail]
# 2 here means: don't compress head or head->next or tail->prev or tail,
# but compress all nodes between them.
# 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail]
# etc.
list-compress-depth 0
# Sets have a special encoding in just one case: when a set is composed
# of just strings that happen to be integers in radix 10 in the range
# of 64 bit signed integers.
# The following configuration setting sets the limit in the size of the
# set in order to use this special memory saving encoding.
set-max-intset-entries 512
# Similarly to hashes and lists, sorted sets are also specially encoded in
# order to save a lot of space. This encoding is only used when the length and
# elements of a sorted set are below the following limits:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# HyperLogLog sparse representation bytes limit. The limit includes the
# 16 bytes header. When an HyperLogLog using the sparse representation crosses
# this limit, it is converted into the dense representation.
#
# A value greater than 16000 is totally useless, since at that point the
# dense representation is more memory efficient.
#
# The suggested value is ~ 3000 in order to have the benefits of
# the space efficient encoding without slowing down too much PFADD,
# which is O(N) with the sparse encoding. The value can be raised to
# ~ 10000 when CPU is not a concern, but space is, and the data set is
# composed of many HyperLogLogs with cardinality in the 0 - 15000 range.
hll-sparse-max-bytes 3000
# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in
# order to help rehashing the main Redis hash table (the one mapping top-level
# keys to values). The hash table implementation Redis uses (see dict.c)
# performs a lazy rehashing: the more operation you run into a hash table
# that is rehashing, the more rehashing "steps" are performed, so if the
# server is idle the rehashing is never complete and some more memory is used
# by the hash table.
#
# The default is to use this millisecond 10 times every second in order to
# actively rehash the main dictionaries, freeing memory when possible.
#
# If unsure:
# use "activerehashing no" if you have hard latency requirements and it is
# not a good thing in your environment that Redis can reply from time to time
# to queries with 2 milliseconds delay.
#
# use "activerehashing yes" if you don't have such hard requirements but
# want to free memory asap when possible.
activerehashing yes
# The client output buffer limits can be used to force disconnection of clients
# that are not reading data from the server fast enough for some reason (a
# common reason is that a Pub/Sub client can't consume messages as fast as the
# publisher can produce them).
#
# The limit can be set differently for the three different classes of clients:
#
# normal -> normal clients including MONITOR clients
# slave -> slave clients
# pubsub -> clients subscribed to at least one pubsub channel or pattern
#
# The syntax of every client-output-buffer-limit directive is the following:
#
# client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
#
# A client is immediately disconnected once the hard limit is reached, or if
# the soft limit is reached and remains reached for the specified number of
# seconds (continuously).
# So for instance if the hard limit is 32 megabytes and the soft limit is
# 16 megabytes / 10 seconds, the client will get disconnected immediately
# if the size of the output buffers reach 32 megabytes, but will also get
# disconnected if the client reaches 16 megabytes and continuously overcomes
# the limit for 10 seconds.
#
# By default normal clients are not limited because they don't receive data
# without asking (in a push way), but just after a request, so only
# asynchronous clients may create a scenario where data is requested faster
# than it can read.
#
# Instead there is a default limit for pubsub and slave clients, since
# subscribers and slaves receive data in a push fashion.
#
# Both the hard or the soft limit can be disabled by setting them to zero.
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# Client query buffers accumulate new commands. They are limited to a fixed
# amount by default in order to avoid that a protocol desynchronization (for
# instance due to a bug in the client) will lead to unbound memory usage in
# the query buffer. However you can configure it here if you have very special
# needs, such us huge multi/exec requests or alike.
#
# client-query-buffer-limit 1gb
# In the Redis protocol, bulk requests, that are, elements representing single
# strings, are normally limited to 512 mb. However you can change this limit
# here.
#
# proto-max-bulk-len 512mb
# Redis calls an internal function to perform many background tasks, like
# closing connections of clients in timeout, purging expired keys that are
# never requested, and so forth.
#
# Not all tasks are performed with the same frequency, but Redis checks for
# tasks to perform according to the specified "hz" value.
#
# By default "hz" is set to 10. Raising the value will use more CPU when
# Redis is idle, but at the same time will make Redis more responsive when
# there are many keys expiring at the same time, and timeouts may be
# handled with more precision.
#
# The range is between 1 and 500, however a value over 100 is usually not
# a good idea. Most users should use the default of 10 and raise this up to
# 100 only in environments where very low latency is required.
hz 10
# When a child rewrites the AOF file, if the following option is enabled
# the file will be fsync-ed every 32 MB of data generated. This is useful
# in order to commit the file to the disk more incrementally and avoid
# big latency spikes.
aof-rewrite-incremental-fsync yes
# Redis LFU eviction (see maxmemory setting) can be tuned. However it is a good
# idea to start with the default settings and only change them after investigating
# how to improve the performances and how the keys LFU change over time, which
# is possible to inspect via the OBJECT FREQ command.
#
# There are two tunable parameters in the Redis LFU implementation: the
# counter logarithm factor and the counter decay time. It is important to
# understand what the two parameters mean before changing them.
#
# The LFU counter is just 8 bits per key, it's maximum value is 255, so Redis
# uses a probabilistic increment with logarithmic behavior. Given the value
# of the old counter, when a key is accessed, the counter is incremented in
# this way:
#
# 1. A random number R between 0 and 1 is extracted.
# 2. A probability P is calculated as 1/(old_value*lfu_log_factor+1).
# 3. The counter is incremented only if R < P.
#
# The default lfu-log-factor is 10. This is a table of how the frequency
# counter changes with a different number of accesses with different
# logarithmic factors:
#
# +--------+------------+------------+------------+------------+------------+
# | factor | 100 hits | 1000 hits | 100K hits | 1M hits | 10M hits |
# +--------+------------+------------+------------+------------+------------+
# | 0 | 104 | 255 | 255 | 255 | 255 |
# +--------+------------+------------+------------+------------+------------+
# | 1 | 18 | 49 | 255 | 255 | 255 |
# +--------+------------+------------+------------+------------+------------+
# | 10 | 10 | 18 | 142 | 255 | 255 |
# +--------+------------+------------+------------+------------+------------+
# | 100 | 8 | 11 | 49 | 143 | 255 |
# +--------+------------+------------+------------+------------+------------+
#
# NOTE: The above table was obtained by running the following commands:
#
# redis-benchmark -n 1000000 incr foo
# redis-cli object freq foo
#
# NOTE 2: The counter initial value is 5 in order to give new objects a chance
# to accumulate hits.
#
# The counter decay time is the time, in minutes, that must elapse in order
# for the key counter to be divided by two (or decremented if it has a value
# less <= 10).
#
# The default value for the lfu-decay-time is 1. A Special value of 0 means to
# decay the counter every time it happens to be scanned.
#
# lfu-log-factor 10
# lfu-decay-time 1
########################### ACTIVE DEFRAGMENTATION #######################
#
# WARNING THIS FEATURE IS EXPERIMENTAL. However it was stress tested
# even in production and manually tested by multiple engineers for some
# time.
#
# What is active defragmentation?
# -------------------------------
#
# Active (online) defragmentation allows a Redis server to compact the
# spaces left between small allocations and deallocations of data in memory,
# thus allowing to reclaim back memory.
#
# Fragmentation is a natural process that happens with every allocator (but
# less so with Jemalloc, fortunately) and certain workloads. Normally a server
# restart is needed in order to lower the fragmentation, or at least to flush
# away all the data and create it again. However thanks to this feature
# implemented by Oran Agra for Redis 4.0 this process can happen at runtime
# in an "hot" way, while the server is running.
#
# Basically when the fragmentation is over a certain level (see the
# configuration options below) Redis will start to create new copies of the
# values in contiguous memory regions by exploiting certain specific Jemalloc
# features (in order to understand if an allocation is causing fragmentation
# and to allocate it in a better place), and at the same time, will release the
# old copies of the data. This process, repeated incrementally for all the keys
# will cause the fragmentation to drop back to normal values.
#
# Important things to understand:
#
# 1. This feature is disabled by default, and only works if you compiled Redis
# to use the copy of Jemalloc we ship with the source code of Redis.
# This is the default with Linux builds.
#
# 2. You never need to enable this feature if you don't have fragmentation
# issues.
#
# 3. Once you experience fragmentation, you can enable this feature when
# needed with the command "CONFIG SET activedefrag yes".
#
# The configuration parameters are able to fine tune the behavior of the
# defragmentation process. If you are not sure about what they mean it is
# a good idea to leave the defaults untouched.
# Enabled active defragmentation
# activedefrag yes
# Minimum amount of fragmentation waste to start active defrag
# active-defrag-ignore-bytes 100mb
# Minimum percentage of fragmentation to start active defrag
# active-defrag-threshold-lower 10
# Maximum percentage of fragmentation at which we use maximum effort
# active-defrag-threshold-upper 100
# Minimal effort for defrag in CPU percentage
# active-defrag-cycle-min 25
# Maximal effort for defrag in CPU percentage
# active-defrag-cycle-max 75
================================================
FILE: examples/databases/redis/devbox.json
================================================
{
"packages": ["redis@latest"],
"shell": {
"init_hook": "",
"scripts": {
"redis-cli": "redis-cli"
}
}
}
================================================
FILE: examples/databases/valkey/README.md
================================================
# valkey-7.2.5
## valkey Notes
Running `devbox services start valkey` will start valkey as a daemon in the background.
You can manually start Valkey in the foreground by running `valkey-server $VALKEY_CONF --port $VALKEY_PORT`.
Logs, pidfile, and data dumps are stored in `.devbox/virtenv/valkey`. You can change this by modifying the `dir` directive in `devbox.d/valkey/valkey.conf`
## Services
* valkey
Use `devbox services start|stop [service]` to interact with services
## This plugin creates the following helper files
* ./devbox.d/valkey/valkey.conf
## This plugin sets the following environment variables
* VALKEY_PORT=6379
* VALKEY_CONF=./devbox.d/valkey/valkey.conf
To show this information, run `devbox info valkey`
================================================
FILE: examples/databases/valkey/devbox.d/valkey/valkey.conf
================================================
# Valkey configuration file example.
#
# Note that in order to read the configuration file, Valkey must be
# started with the file path as first argument:
#
# ./valkey-server /path/to/valkey.conf
# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.
################################## INCLUDES ###################################
# Include one or more other config files here. This is useful if you
# have a standard template that goes to all Valkey servers but also need
# to customize a few per-server settings. Include files can include
# other files, so use this wisely.
#
# Notice option "include" won't be rewritten by command "CONFIG REWRITE"
# from admin or Valkey Sentinel. Since Valkey always uses the last processed
# line as value of a configuration directive, you'd better put includes
# at the beginning of this file to avoid overwriting config change at runtime.
#
# If instead you are interested in using includes to override configuration
# options, it is better to use include as the last line.
#
# include /path/to/local.conf
# include /path/to/other.conf
################################## MODULES #####################################
# Load modules at startup. If the server is not able to load modules
# it will abort. It is possible to use multiple loadmodule directives.
#
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so
################################## NETWORK #####################################
# By default, if no "bind" configuration directive is specified, Valkey listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ WARNING ~~~ If the computer running Valkey is directly exposed to the
# internet, binding to all the interfaces is dangerous and will expose the
# instance to everybody on the internet. So by default we uncomment the
# following bind directive, that will force Valkey to listen only into
# the IPv4 lookback interface address (this means Valkey will be able to
# accept connections only from clients running into the same computer it
# is running).
#
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1
# Protected mode is a layer of security protection, in order to avoid that
# Valkey instances left open on the internet are accessed and exploited.
#
# When protected mode is on and if:
#
# 1) The server is not binding explicitly to a set of addresses using the
# "bind" directive.
# 2) No password is configured.
#
# The server only accepts connections from clients connecting from the
# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain
# sockets.
#
# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Valkey
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
protected-mode yes
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Valkey will not listen on a TCP socket.
port 6379
# TCP listen() backlog.
#
# In high requests-per-second environments you need an high backlog in order
# to avoid slow clients connections issues. Note that the Linux kernel
# will silently truncate it to the value of /proc/sys/net/core/somaxconn so
# make sure to raise both the value of somaxconn and tcp_max_syn_backlog
# in order to get the desired effect.
tcp-backlog 511
# Unix socket.
#
# Specify the path for the Unix socket that will be used to listen for
# incoming connections. There is no default, so Valkey will not listen
# on a unix socket when not specified.
#
# unixsocket /tmp/valkey.sock
# unixsocketperm 700
# Close the connection after a client is idle for N seconds (0 to disable)
timeout 0
# TCP keepalive.
#
# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence
# of communication. This is useful for two reasons:
#
# 1) Detect dead peers.
# 2) Take the connection alive from the point of view of network
# equipment in the middle.
#
# On Linux, the specified value (in seconds) is the period used to send ACKs.
# Note that to close the connection the double of the time is needed.
# On other kernels the period depends on the kernel configuration.
#
# A reasonable value for this option is 300 seconds, which is the new
# Valkey default starting with Valkey 3.2.1.
tcp-keepalive 300
################################# GENERAL #####################################
# By default Valkey does not run as a daemon. Use 'yes' if you need it.
# Note that Valkey will write a pid file in /var/run/valkey.pid when daemonized.
daemonize no
# If you run Valkey from upstart or systemd, Valkey can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Valkey into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised no
# If a pid file is specified, Valkey writes it where specified at startup
# and removes it at exit.
#
# When the server runs non daemonized, no pid file is created if none is
# specified in the configuration. When the server is daemonized, the pid file
# is used even if not specified, defaulting to "/var/run/valkey.pid".
#
# Creating a pid file is best effort: if Valkey is not able to create it
# nothing bad happens, the server will start and run normally.
pidfile valkey.pid
# Specif
gitextract_w04sbmq7/
├── .envrc
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── 01-bug.yaml
│ │ ├── 02-feature.yaml
│ │ ├── 03-package-bug.yaml
│ │ └── 04-package-request.yaml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── cache-upload.yml
│ ├── cli-post-release.yml
│ ├── cli-release.yml
│ ├── cli-tests.yaml
│ ├── debug.yaml
│ ├── docker-image-release.yml
│ ├── random-reviewer-assignment.yml
│ ├── stale-issue-cleanup.yml
│ └── vscode-ext-release.yaml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yaml
├── .schema/
│ ├── devbox-plugin.schema.json
│ └── devbox.schema.json
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── NUSHELL.md
├── README.md
├── cmd/
│ └── devbox/
│ └── main.go
├── devbox.go
├── devbox.json
├── devbox.md
├── examples/
│ ├── .gitignore
│ ├── README.md
│ ├── cloud_development/
│ │ ├── argo-workflows/
│ │ │ ├── README.md
│ │ │ ├── argo-patch.sh
│ │ │ └── devbox.json
│ │ ├── maelstrom/
│ │ │ ├── README.md
│ │ │ └── devbox.json
│ │ ├── minikube/
│ │ │ ├── README.md
│ │ │ └── devbox.json
│ │ └── temporal/
│ │ ├── .envrc
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── devbox.json
│ │ ├── hello/
│ │ │ ├── .gitignore
│ │ │ ├── __init__.py
│ │ │ ├── hello_activity.py
│ │ │ └── hello_cron.py
│ │ ├── requirements.txt
│ │ ├── tests/
│ │ │ └── __init__.py
│ │ └── venvShellHook.sh
│ ├── data_science/
│ │ ├── R/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── src/
│ │ │ └── examplePlot.R
│ │ ├── README.md
│ │ ├── jupyter/
│ │ │ ├── .envrc
│ │ │ ├── .pdm-python
│ │ │ ├── .pdm.toml
│ │ │ ├── __pypackages__/
│ │ │ │ └── .gitignore
│ │ │ ├── devbox.json
│ │ │ ├── main.py
│ │ │ └── pyproject.toml
│ │ ├── llama/
│ │ │ ├── README.md
│ │ │ └── devbox.json
│ │ ├── pytorch/
│ │ │ ├── basic-example/
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.json
│ │ │ │ ├── main.py
│ │ │ │ └── pyproject.toml
│ │ │ └── gradio/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── class_names.txt
│ │ │ ├── devbox.json
│ │ │ ├── requirements.txt
│ │ │ └── run.py
│ │ └── tensorflow/
│ │ ├── README.md
│ │ ├── devbox.json
│ │ ├── main.py
│ │ └── requirements.txt
│ ├── databases/
│ │ ├── mariadb/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── setup_db.sql
│ │ ├── mysql/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── mysql/
│ │ │ │ │ └── my.cnf
│ │ │ │ ├── mysql80/
│ │ │ │ │ └── my.cnf
│ │ │ │ └── mysql84/
│ │ │ │ └── my.cnf
│ │ │ ├── devbox.json
│ │ │ ├── my.cnf
│ │ │ └── setup_db.sql
│ │ ├── postgres/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── setup_postgres_db.sql
│ │ ├── redis/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ └── redis/
│ │ │ │ └── redis.conf
│ │ │ └── devbox.json
│ │ └── valkey/
│ │ ├── README.md
│ │ ├── devbox.d/
│ │ │ └── valkey/
│ │ │ └── valkey.conf
│ │ └── devbox.json
│ ├── development/
│ │ ├── bun/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── bun.lockb
│ │ │ ├── devbox.json
│ │ │ ├── index.test.ts
│ │ │ ├── index.ts
│ │ │ ├── package.json
│ │ │ └── tsconfig.json
│ │ ├── csharp/
│ │ │ └── hello-world/
│ │ │ ├── .gitignore
│ │ │ ├── Program.cs
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── hello-world.csproj
│ │ ├── elixir/
│ │ │ └── elixir_hello/
│ │ │ ├── .formatter.exs
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── lib/
│ │ │ │ ├── elixir_hello.ex
│ │ │ │ └── kv.exs
│ │ │ ├── mix.exs
│ │ │ └── test/
│ │ │ ├── elixir_hello_test.exs
│ │ │ └── test_helper.exs
│ │ ├── fsharp/
│ │ │ └── hello-world/
│ │ │ ├── .gitignore
│ │ │ ├── Program.fs
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── hello-world.fsproj
│ │ ├── go/
│ │ │ └── hello-world/
│ │ │ ├── .envrc
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── go.mod
│ │ │ └── main.go
│ │ ├── haskell/
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── my-project/
│ │ │ ├── .gitignore
│ │ │ ├── CHANGELOG.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── Setup.hs
│ │ │ ├── app/
│ │ │ │ └── Main.hs
│ │ │ ├── my-project.cabal
│ │ │ ├── package.yaml
│ │ │ ├── src/
│ │ │ │ └── Lib.hs
│ │ │ ├── stack.yaml
│ │ │ └── test/
│ │ │ └── Spec.hs
│ │ ├── java/
│ │ │ ├── README.md
│ │ │ ├── gradle/
│ │ │ │ ├── .gitignore
│ │ │ │ └── hello-world/
│ │ │ │ ├── README.md
│ │ │ │ ├── build.gradle
│ │ │ │ ├── devbox.json
│ │ │ │ ├── gradlew
│ │ │ │ ├── settings.gradle
│ │ │ │ └── src/
│ │ │ │ └── main/
│ │ │ │ └── java/
│ │ │ │ └── hello/
│ │ │ │ └── HelloWorld.java
│ │ │ └── maven/
│ │ │ ├── .gitignore
│ │ │ └── hello-world/
│ │ │ ├── README.md
│ │ │ ├── devbox-maven-app/
│ │ │ │ └── pom.xml
│ │ │ ├── devbox.json
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ └── java/
│ │ │ │ └── com/
│ │ │ │ └── devbox/
│ │ │ │ └── mavenapp/
│ │ │ │ └── App.java
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── devbox/
│ │ │ └── mavenapp/
│ │ │ └── AppTest.java
│ │ ├── nim/
│ │ │ └── spinnytest/
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── spinnytest
│ │ │ ├── spinnytest.nim
│ │ │ └── spinnytest.nimble
│ │ ├── nodejs/
│ │ │ ├── .gitignore
│ │ │ ├── nodejs-npm/
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.json
│ │ │ │ ├── index.js
│ │ │ │ └── package.json
│ │ │ ├── nodejs-pnpm/
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.json
│ │ │ │ ├── index.js
│ │ │ │ └── package.json
│ │ │ ├── nodejs-typescript/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── devbox.json
│ │ │ │ ├── index.js
│ │ │ │ ├── index.ts
│ │ │ │ ├── package.json
│ │ │ │ └── tsconfig.json
│ │ │ └── nodejs-yarn/
│ │ │ ├── .yarnrc.yml
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── index.js
│ │ │ └── package.json
│ │ ├── php/
│ │ │ └── latest/
│ │ │ ├── .envrc
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── composer.json
│ │ │ ├── devbox.d/
│ │ │ │ └── php/
│ │ │ │ ├── php-fpm.conf
│ │ │ │ └── php.ini
│ │ │ ├── devbox.json
│ │ │ └── public/
│ │ │ └── index.php
│ │ ├── python/
│ │ │ ├── pip/
│ │ │ │ ├── .envrc
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.d/
│ │ │ │ │ └── python310Packages.pip/
│ │ │ │ │ └── venvShellHook.sh
│ │ │ │ ├── devbox.json
│ │ │ │ ├── main.py
│ │ │ │ └── requirements.txt
│ │ │ ├── pipenv/
│ │ │ │ ├── Pipfile
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.json
│ │ │ │ ├── main.py
│ │ │ │ └── requirements.txt
│ │ │ └── poetry/
│ │ │ ├── poetry-demo/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── README.md
│ │ │ │ ├── devbox.json
│ │ │ │ ├── poetry_demo/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __main__.py
│ │ │ │ ├── pyproject.toml
│ │ │ │ └── tests/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_poetry_demo.py
│ │ │ └── poetry-pyproject-subdir/
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── frontend/
│ │ │ │ └── .empty
│ │ │ └── service/
│ │ │ ├── pyproject.toml
│ │ │ └── test_with_pytest.py
│ │ ├── ruby/
│ │ │ ├── .envrc
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── hello.rb
│ │ ├── rust/
│ │ │ ├── README.md
│ │ │ └── rust-stable-hello-world/
│ │ │ ├── .gitignore
│ │ │ ├── Cargo.toml
│ │ │ ├── conf/
│ │ │ │ └── set-env.sh
│ │ │ ├── devbox.json
│ │ │ └── src/
│ │ │ └── main.rs
│ │ └── zig/
│ │ ├── README.md
│ │ └── zig-hello-world/
│ │ ├── .gitignore
│ │ ├── build.zig
│ │ ├── devbox.json
│ │ └── src/
│ │ └── main.zig
│ ├── flakes/
│ │ ├── README.md
│ │ ├── go-mod/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── ory-cli/
│ │ │ └── flake.nix
│ │ ├── overlay/
│ │ │ ├── .nvmrc
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── package.json
│ │ │ └── yarn-overlay/
│ │ │ └── flake.nix
│ │ ├── php/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ └── php/
│ │ │ │ ├── php-fpm.conf
│ │ │ │ └── php.ini
│ │ │ ├── devbox.json
│ │ │ └── my-php-flake/
│ │ │ └── flake.nix
│ │ ├── php-extension/
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ └── my-php-flake/
│ │ │ └── flake.nix
│ │ └── remote/
│ │ └── devbox.json
│ ├── insecure/
│ │ └── devbox.json
│ ├── plugins/
│ │ ├── builtin/
│ │ │ ├── devbox.d/
│ │ │ │ └── php84/
│ │ │ │ ├── php-fpm.conf
│ │ │ │ └── php.ini
│ │ │ └── devbox.json
│ │ ├── git/
│ │ │ ├── devbox.d/
│ │ │ │ ├── jetify-com.devbox-plugin-example.my-github-plugin/
│ │ │ │ │ └── some-file.txt
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ ├── git-with-revision/
│ │ │ ├── devbox.d/
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ ├── github/
│ │ │ ├── devbox.d/
│ │ │ │ ├── jetify-com.devbox-plugin-example.my-github-plugin/
│ │ │ │ │ └── some-file.txt
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ ├── github-with-revision/
│ │ │ ├── devbox.d/
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ ├── local/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ └── my-plugin/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ ├── my-plugin/
│ │ │ │ ├── plugin.json
│ │ │ │ ├── process-compose.yaml
│ │ │ │ └── some-file.txt
│ │ │ └── test.sh
│ │ ├── v2-git/
│ │ │ ├── devbox.d/
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ ├── v2-github/
│ │ │ ├── devbox.d/
│ │ │ │ └── jetpack-io-devbox-plugin-example/
│ │ │ │ └── some-file.txt
│ │ │ ├── devbox.json
│ │ │ └── test.sh
│ │ └── v2-local/
│ │ ├── devbox.d/
│ │ │ └── plugin1/
│ │ │ └── foo.txt
│ │ ├── devbox.json
│ │ ├── plugin1/
│ │ │ ├── foo.txt
│ │ │ ├── plugin.json
│ │ │ ├── plugin1a/
│ │ │ │ └── plugin.json
│ │ │ └── process-compose.yaml
│ │ ├── plugin2/
│ │ │ ├── plugin.json
│ │ │ └── process-compose.yaml
│ │ └── plugin3/
│ │ └── plugin.json
│ ├── servers/
│ │ ├── apache/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── apacheHttpd/
│ │ │ │ │ └── httpd.conf
│ │ │ │ └── web/
│ │ │ │ └── index.html
│ │ │ └── devbox.json
│ │ ├── caddy/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── caddy/
│ │ │ │ │ └── Caddyfile
│ │ │ │ └── web/
│ │ │ │ └── index.html
│ │ │ └── devbox.json
│ │ └── nginx/
│ │ ├── .envrc
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── devbox.d/
│ │ │ ├── nginx/
│ │ │ │ ├── fastcgi.conf
│ │ │ │ ├── nginx.conf
│ │ │ │ └── nginx.template
│ │ │ └── web/
│ │ │ └── index.html
│ │ └── devbox.json
│ ├── stacks/
│ │ ├── django/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── process-compose.yml
│ │ │ ├── requirements.txt
│ │ │ └── todo_project/
│ │ │ ├── manage.py
│ │ │ ├── todo_app/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── admin.py
│ │ │ │ ├── apps.py
│ │ │ │ ├── migrations/
│ │ │ │ │ ├── 0001_initial.py
│ │ │ │ │ └── __init__.py
│ │ │ │ ├── models.py
│ │ │ │ ├── templates/
│ │ │ │ │ └── todo_app/
│ │ │ │ │ ├── create_todo.html
│ │ │ │ │ └── todo_list.html
│ │ │ │ ├── tests.py
│ │ │ │ └── views.py
│ │ │ └── todo_project/
│ │ │ ├── __init__.py
│ │ │ ├── asgi.py
│ │ │ ├── settings.py
│ │ │ ├── urls.py
│ │ │ └── wsgi.py
│ │ ├── drupal/
│ │ │ ├── .editorconfig
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── composer.json
│ │ │ ├── devbox.d/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── nginx/
│ │ │ │ │ ├── fastcgi.conf
│ │ │ │ │ ├── mime.conf
│ │ │ │ │ ├── nginx.conf
│ │ │ │ │ └── nginx.template
│ │ │ │ └── php/
│ │ │ │ ├── php-fpm.conf
│ │ │ │ └── php.ini
│ │ │ ├── devbox.json
│ │ │ ├── install-drupal.sh
│ │ │ ├── setup_db.sql
│ │ │ └── web/
│ │ │ ├── .csslintrc
│ │ │ ├── .eslintignore
│ │ │ ├── .eslintrc.json
│ │ │ ├── .gitignore
│ │ │ ├── .ht.router.php
│ │ │ ├── .htaccess
│ │ │ ├── INSTALL.txt
│ │ │ ├── README.md
│ │ │ ├── example.gitignore
│ │ │ ├── index.html
│ │ │ ├── index.php
│ │ │ ├── modules/
│ │ │ │ └── README.txt
│ │ │ ├── profiles/
│ │ │ │ └── README.txt
│ │ │ ├── robots.txt
│ │ │ ├── sites/
│ │ │ │ ├── README.txt
│ │ │ │ ├── default/
│ │ │ │ │ ├── default.services.yml
│ │ │ │ │ └── default.settings.php
│ │ │ │ ├── development.services.yml
│ │ │ │ ├── example.settings.local.php
│ │ │ │ └── example.sites.php
│ │ │ ├── themes/
│ │ │ │ └── README.txt
│ │ │ ├── update.php
│ │ │ └── web.config
│ │ ├── jekyll/
│ │ │ ├── .envrc
│ │ │ ├── README.md
│ │ │ ├── devbox.json
│ │ │ ├── myblog/
│ │ │ │ ├── .bundle/
│ │ │ │ │ └── config
│ │ │ │ ├── .gitignore
│ │ │ │ ├── 404.html
│ │ │ │ ├── Gemfile
│ │ │ │ ├── _config.yml
│ │ │ │ ├── _posts/
│ │ │ │ │ └── 2023-01-15-welcome-to-jekyll.markdown
│ │ │ │ ├── about.md
│ │ │ │ └── index.md
│ │ │ └── process-compose.yml
│ │ ├── lapp-stack/
│ │ │ ├── .gitignore
│ │ │ ├── .testrc
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── apache/
│ │ │ │ │ └── httpd.conf
│ │ │ │ ├── php/
│ │ │ │ │ ├── php-fpm.conf
│ │ │ │ │ └── php.ini
│ │ │ │ └── web/
│ │ │ │ └── index.html
│ │ │ ├── devbox.json
│ │ │ ├── my_app/
│ │ │ │ ├── config.php
│ │ │ │ ├── index.php
│ │ │ │ └── info.php
│ │ │ └── setup_postgres_db.sql
│ │ ├── laravel/
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── php/
│ │ │ │ │ ├── php-fpm.conf
│ │ │ │ │ └── php.ini
│ │ │ │ └── redis/
│ │ │ │ └── redis.conf
│ │ │ └── devbox.json
│ │ ├── lepp-stack/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── devbox.d/
│ │ │ │ ├── nginx/
│ │ │ │ │ ├── fastcgi.conf
│ │ │ │ │ ├── nginx.conf
│ │ │ │ │ └── nginx.template
│ │ │ │ ├── php/
│ │ │ │ │ ├── php-fpm.conf
│ │ │ │ │ └── php.ini
│ │ │ │ └── web/
│ │ │ │ └── index.html
│ │ │ ├── devbox.json
│ │ │ ├── my_app/
│ │ │ │ ├── config.php
│ │ │ │ ├── index.php
│ │ │ │ └── info.php
│ │ │ └── setup_postgres_db.sql
│ │ ├── rails/
│ │ │ ├── .ruby-version
│ │ │ ├── README.md
│ │ │ ├── blog/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .ruby-version
│ │ │ │ ├── Gemfile
│ │ │ │ ├── Rakefile
│ │ │ │ ├── app/
│ │ │ │ │ ├── assets/
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ └── manifest.js
│ │ │ │ │ │ ├── images/
│ │ │ │ │ │ │ └── .keep
│ │ │ │ │ │ └── stylesheets/
│ │ │ │ │ │ └── application.css
│ │ │ │ │ ├── channels/
│ │ │ │ │ │ └── application_cable/
│ │ │ │ │ │ ├── channel.rb
│ │ │ │ │ │ └── connection.rb
│ │ │ │ │ ├── controllers/
│ │ │ │ │ │ ├── application_controller.rb
│ │ │ │ │ │ └── concerns/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── helpers/
│ │ │ │ │ │ └── application_helper.rb
│ │ │ │ │ ├── jobs/
│ │ │ │ │ │ └── application_job.rb
│ │ │ │ │ ├── mailers/
│ │ │ │ │ │ └── application_mailer.rb
│ │ │ │ │ ├── models/
│ │ │ │ │ │ ├── application_record.rb
│ │ │ │ │ │ └── concerns/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ └── views/
│ │ │ │ │ └── layouts/
│ │ │ │ │ ├── application.html.erb
│ │ │ │ │ ├── mailer.html.erb
│ │ │ │ │ └── mailer.text.erb
│ │ │ │ ├── bin/
│ │ │ │ │ ├── bundle
│ │ │ │ │ ├── rails
│ │ │ │ │ ├── rake
│ │ │ │ │ └── setup
│ │ │ │ ├── config/
│ │ │ │ │ ├── application.rb
│ │ │ │ │ ├── boot.rb
│ │ │ │ │ ├── cable.yml
│ │ │ │ │ ├── credentials.yml.enc
│ │ │ │ │ ├── database.yml
│ │ │ │ │ ├── environment.rb
│ │ │ │ │ ├── environments/
│ │ │ │ │ │ ├── development.rb
│ │ │ │ │ │ ├── production.rb
│ │ │ │ │ │ └── test.rb
│ │ │ │ │ ├── initializers/
│ │ │ │ │ │ ├── assets.rb
│ │ │ │ │ │ ├── content_security_policy.rb
│ │ │ │ │ │ ├── filter_parameter_logging.rb
│ │ │ │ │ │ ├── inflections.rb
│ │ │ │ │ │ └── permissions_policy.rb
│ │ │ │ │ ├── locales/
│ │ │ │ │ │ └── en.yml
│ │ │ │ │ ├── puma.rb
│ │ │ │ │ ├── routes.rb
│ │ │ │ │ └── storage.yml
│ │ │ │ ├── config.ru
│ │ │ │ ├── db/
│ │ │ │ │ ├── schema.rb
│ │ │ │ │ └── seeds.rb
│ │ │ │ ├── lib/
│ │ │ │ │ ├── assets/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ └── tasks/
│ │ │ │ │ └── .keep
│ │ │ │ ├── log/
│ │ │ │ │ └── .keep
│ │ │ │ ├── public/
│ │ │ │ │ ├── 404.html
│ │ │ │ │ ├── 422.html
│ │ │ │ │ ├── 500.html
│ │ │ │ │ └── robots.txt
│ │ │ │ ├── storage/
│ │ │ │ │ └── .keep
│ │ │ │ ├── test/
│ │ │ │ │ ├── application_system_test_case.rb
│ │ │ │ │ ├── channels/
│ │ │ │ │ │ └── application_cable/
│ │ │ │ │ │ └── connection_test.rb
│ │ │ │ │ ├── controllers/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── fixtures/
│ │ │ │ │ │ └── files/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── helpers/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── integration/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── mailers/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── models/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ ├── system/
│ │ │ │ │ │ └── .keep
│ │ │ │ │ └── test_helper.rb
│ │ │ │ └── tmp/
│ │ │ │ ├── .keep
│ │ │ │ ├── pids/
│ │ │ │ │ └── .keep
│ │ │ │ └── storage/
│ │ │ │ └── .keep
│ │ │ ├── devbox.json
│ │ │ └── process-compose.yml
│ │ └── spring/
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── build.gradle
│ │ ├── devbox.json
│ │ ├── gradle/
│ │ │ └── wrapper/
│ │ │ └── gradle-wrapper.properties
│ │ ├── gradle.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── settings.gradle
│ │ ├── setup_db.sql
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── devbox/
│ │ │ │ └── example/
│ │ │ │ └── spring/
│ │ │ │ └── spring/
│ │ │ │ ├── Application.java
│ │ │ │ ├── MainController.java
│ │ │ │ ├── User.java
│ │ │ │ └── UserRepository.java
│ │ │ └── resources/
│ │ │ └── application.properties
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── devbox/
│ │ └── example/
│ │ └── spring/
│ │ └── spring/
│ │ └── ApplicationTests.java
│ └── tutorial/
│ ├── README.md
│ └── devbox.json
├── flake.nix
├── go.mod
├── go.sum
├── internal/
│ ├── boxcli/
│ │ ├── add.go
│ │ ├── args.go
│ │ ├── auth.go
│ │ ├── cache.go
│ │ ├── config.go
│ │ ├── create.go
│ │ ├── env.go
│ │ ├── featureflag/
│ │ │ ├── auth.go
│ │ │ ├── feature.go
│ │ │ ├── feature_test.go
│ │ │ ├── impure_print_dev_env.go
│ │ │ ├── resolvev2.go
│ │ │ ├── script_exit_on_error.go
│ │ │ └── tidywarning.go
│ │ ├── gen-docs.go
│ │ ├── generate.go
│ │ ├── global.go
│ │ ├── info.go
│ │ ├── init.go
│ │ ├── install.go
│ │ ├── integrate.go
│ │ ├── list.go
│ │ ├── log.go
│ │ ├── midcobra/
│ │ │ ├── debug.go
│ │ │ ├── midcobra.go
│ │ │ ├── telemetry.go
│ │ │ ├── telemetry_test.go
│ │ │ └── trace.go
│ │ ├── multi/
│ │ │ ├── multi.go
│ │ │ └── sync.go
│ │ ├── patch.go
│ │ ├── path.go
│ │ ├── pull.go
│ │ ├── push.go
│ │ ├── rm.go
│ │ ├── root.go
│ │ ├── run.go
│ │ ├── search.go
│ │ ├── secrets.go
│ │ ├── services.go
│ │ ├── setup.go
│ │ ├── shell.go
│ │ ├── shellenv.go
│ │ ├── update.go
│ │ ├── usererr/
│ │ │ ├── exiterr.go
│ │ │ └── usererr.go
│ │ └── version.go
│ ├── build/
│ │ └── build.go
│ ├── cachehash/
│ │ ├── hash.go
│ │ └── hash_test.go
│ ├── cmdutil/
│ │ ├── cmdutil.go
│ │ └── exec.go
│ ├── conf/
│ │ ├── doc.go
│ │ └── env.go
│ ├── cuecfg/
│ │ ├── cuecfg.go
│ │ ├── doc.go
│ │ ├── json.go
│ │ ├── toml.go
│ │ ├── xml.go
│ │ └── yaml.go
│ ├── debug/
│ │ ├── debug.go
│ │ └── time.go
│ ├── devbox/
│ │ ├── cache.go
│ │ ├── devbox.go
│ │ ├── devbox_test.go
│ │ ├── devopt/
│ │ │ └── devboxopts.go
│ │ ├── docgen/
│ │ │ ├── docgen.go
│ │ │ └── readme.tmpl
│ │ ├── envpath/
│ │ │ ├── pathlists.go
│ │ │ ├── pathlists_test.go
│ │ │ ├── stack.go
│ │ │ └── stack_test.go
│ │ ├── envvars.go
│ │ ├── errors.go
│ │ ├── flakes.go
│ │ ├── generate/
│ │ │ ├── devcontainer_util.go
│ │ │ └── tmpl/
│ │ │ ├── DevboxImageDockerfile
│ │ │ ├── DevboxImageDockerfileRootUser
│ │ │ ├── Dockerfile.dockerignore.tmpl
│ │ │ ├── dev.Dockerfile.tmpl
│ │ │ ├── envrc.tmpl
│ │ │ ├── envrcContent.tmpl
│ │ │ └── prod.Dockerfile.tmpl
│ │ ├── global.go
│ │ ├── nixprofile.go
│ │ ├── packages.go
│ │ ├── providers/
│ │ │ ├── identity/
│ │ │ │ └── identity.go
│ │ │ └── nixcache/
│ │ │ ├── nixcache.go
│ │ │ └── setup.go
│ │ ├── pure_shell.go
│ │ ├── pushpull.go
│ │ ├── refresh.go
│ │ ├── secrets.go
│ │ ├── services.go
│ │ ├── shell.go
│ │ ├── shell_test.go
│ │ ├── shellcmd/
│ │ │ ├── command.go
│ │ │ └── command_test.go
│ │ ├── shellrc.tmpl
│ │ ├── shellrc_fish.tmpl
│ │ ├── testdata/
│ │ │ └── shellrc/
│ │ │ ├── basic/
│ │ │ │ ├── env
│ │ │ │ ├── shellrc
│ │ │ │ └── shellrc.golden
│ │ │ ├── noshellrc/
│ │ │ │ └── shellrc.golden
│ │ │ └── zsh_zdotdir/
│ │ │ ├── env
│ │ │ ├── shellrc
│ │ │ └── shellrc.golden
│ │ ├── update.go
│ │ ├── update_test.go
│ │ └── util.go
│ ├── devconfig/
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── configfile/
│ │ │ ├── ast.go
│ │ │ ├── env.go
│ │ │ ├── field.go
│ │ │ ├── file.go
│ │ │ ├── file_test.go
│ │ │ ├── packages.go
│ │ │ ├── packages_test.go
│ │ │ └── scripts.go
│ │ └── init.go
│ ├── devpkg/
│ │ ├── narinfo_cache.go
│ │ ├── outputs.go
│ │ ├── package.go
│ │ ├── package_test.go
│ │ ├── pkgtype/
│ │ │ ├── flake.go
│ │ │ └── runx.go
│ │ └── validation.go
│ ├── envir/
│ │ ├── env.go
│ │ └── util.go
│ ├── fileutil/
│ │ ├── dir.go
│ │ ├── fileutil.go
│ │ ├── fileutil_test.go
│ │ └── untar.go
│ ├── goutil/
│ │ ├── goutil.go
│ │ └── sync.go
│ ├── lock/
│ │ ├── interfaces.go
│ │ ├── lockfile.go
│ │ ├── package.go
│ │ ├── resolve.go
│ │ └── statehash.go
│ ├── nix/
│ │ ├── build.go
│ │ ├── cache.go
│ │ ├── command.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── doc.go
│ │ ├── eval.go
│ │ ├── flake.go
│ │ ├── install.go
│ │ ├── install_test.go
│ │ ├── instance.go
│ │ ├── nix.go
│ │ ├── nix_test.go
│ │ ├── nixpkgs.go
│ │ ├── nixprofile/
│ │ │ ├── item.go
│ │ │ ├── profile.go
│ │ │ ├── profile_test.go
│ │ │ └── upgrade.go
│ │ ├── profiles.go
│ │ ├── run.go
│ │ ├── search.go
│ │ ├── search_test.go
│ │ ├── shim.go
│ │ ├── store.go
│ │ ├── store_test.go
│ │ ├── storepath.go
│ │ ├── storepath_test.go
│ │ ├── upgrade.go
│ │ └── writer.go
│ ├── patchpkg/
│ │ ├── builder.go
│ │ ├── elf.go
│ │ ├── glibc-patch.bash
│ │ ├── patch.go
│ │ └── search.go
│ ├── plugin/
│ │ ├── files.go
│ │ ├── git.go
│ │ ├── git_test.go
│ │ ├── github.go
│ │ ├── github_test.go
│ │ ├── includable.go
│ │ ├── includes.go
│ │ ├── info.go
│ │ ├── local.go
│ │ ├── manager.go
│ │ ├── plugin.go
│ │ ├── rm.go
│ │ ├── services.go
│ │ └── update.go
│ ├── pullbox/
│ │ ├── config.go
│ │ ├── download.go
│ │ ├── files.go
│ │ ├── git/
│ │ │ ├── git.go
│ │ │ └── push.go
│ │ ├── pullbox.go
│ │ ├── s3/
│ │ │ ├── config.go
│ │ │ ├── pull.go
│ │ │ └── push.go
│ │ └── tar/
│ │ └── tar.go
│ ├── redact/
│ │ ├── redact.go
│ │ └── redact_test.go
│ ├── searcher/
│ │ ├── client.go
│ │ ├── model.go
│ │ ├── parse.go
│ │ └── parse_test.go
│ ├── services/
│ │ ├── client.go
│ │ ├── config.go
│ │ ├── manager.go
│ │ ├── ports.go
│ │ ├── services.go
│ │ └── status.go
│ ├── setup/
│ │ ├── setup.go
│ │ └── setup_test.go
│ ├── shellgen/
│ │ ├── doc.go
│ │ ├── flake_input.go
│ │ ├── flake_plan.go
│ │ ├── flake_plan_test.go
│ │ ├── generate.go
│ │ ├── generate_test.go
│ │ ├── nixpkgs.go
│ │ ├── path.go
│ │ ├── scripts.go
│ │ ├── testdata/
│ │ │ ├── flake-empty.nix.golden
│ │ │ └── flake.nix.golden
│ │ └── tmpl/
│ │ ├── .gitignore.tmpl
│ │ ├── flake.nix.tmpl
│ │ ├── glibc-patch.nix.tmpl
│ │ ├── script-wrapper.tmpl
│ │ └── shell.nix.tmpl
│ ├── telemetry/
│ │ ├── segment.go
│ │ ├── sentry.go
│ │ ├── telemetry.go
│ │ └── telemetry_test.go
│ ├── templates/
│ │ ├── template.go
│ │ ├── templates.go
│ │ └── templates_test.go
│ ├── ux/
│ │ └── messages.go
│ ├── vercheck/
│ │ ├── vercheck.go
│ │ └── vercheck_test.go
│ └── xdg/
│ └── xdg.go
├── nix/
│ ├── command.go
│ ├── flake/
│ │ ├── flakeref.go
│ │ └── flakeref_test.go
│ ├── install.go
│ ├── nix.go
│ └── nix_test.go
├── pkg/
│ └── autodetect/
│ ├── autodetect.go
│ └── detector/
│ ├── detector.go
│ ├── go.go
│ ├── go_test.go
│ ├── nodejs.go
│ ├── nodejs_test.go
│ ├── php.go
│ ├── php_test.go
│ ├── poetry.go
│ └── python.go
├── plugins/
│ ├── README.md
│ ├── apache/
│ │ ├── httpd.conf
│ │ └── process-compose.yaml
│ ├── apacheHttpd.json
│ ├── builtins.go
│ ├── builtins_test.go
│ ├── caddy/
│ │ ├── Caddyfile
│ │ └── process-compose.yaml
│ ├── caddy.json
│ ├── elixir.json
│ ├── gradle.json
│ ├── haskell/
│ │ └── flake.nix
│ ├── haskell.json
│ ├── mariadb/
│ │ ├── flake.nix
│ │ ├── my.cnf
│ │ ├── process-compose.yaml
│ │ └── setup_db.sh
│ ├── mariadb.json
│ ├── mysql/
│ │ ├── flake.nix
│ │ ├── my.cnf
│ │ ├── process-compose.yaml
│ │ └── setup_db.sh
│ ├── mysql.json
│ ├── nginx/
│ │ ├── fastcgi.conf
│ │ ├── nginx.conf
│ │ ├── nginx.template
│ │ └── process-compose.yaml
│ ├── nginx.json
│ ├── nodejs.json
│ ├── php/
│ │ ├── flake.nix
│ │ ├── php-fpm.conf
│ │ ├── php.ini
│ │ └── process-compose.yaml
│ ├── php.json
│ ├── poetry/
│ │ └── initHook.sh
│ ├── poetry.json
│ ├── postgresql/
│ │ └── process-compose.yaml
│ ├── postgresql.json
│ ├── python/
│ │ └── venvShellHook.sh
│ ├── python.json
│ ├── redis/
│ │ ├── process-compose.yaml
│ │ └── redis.conf
│ ├── redis.json
│ ├── ruby.json
│ ├── rustc.json
│ ├── rustup.json
│ ├── valkey/
│ │ ├── process-compose.yaml
│ │ └── valkey.conf
│ ├── valkey.json
│ └── web/
│ └── index.html
├── scripts/
│ └── gofumpt.sh
├── testscripts/
│ ├── Dockerfile
│ ├── README.md
│ ├── add/
│ │ ├── add.test.txt
│ │ ├── add_insecure.tst.txt
│ │ ├── add_outputs.test.txt
│ │ ├── add_platforms.test.txt
│ │ ├── add_platforms_flakeref.test.txt
│ │ ├── add_replace.test.txt
│ │ └── global_add.test.txt
│ ├── assert/
│ │ └── assert.test.txt
│ ├── basic/
│ │ ├── default_test_env.test.txt
│ │ ├── install_hello.test.txt
│ │ └── path_whitespace.test.txt
│ ├── generate/
│ │ ├── devcontainer.test.txt
│ │ ├── direnv-config-envflag.test.txt
│ │ ├── direnv-config.test.txt
│ │ ├── direnv-envflag.test.txt
│ │ ├── direnv-envrcdir-config-parent.test.txt
│ │ ├── direnv-envrcdir-config-sibling.test.txt
│ │ ├── direnv-envrcdir-config-subdir-envflag.test.txt
│ │ ├── direnv-envrcdir-config-subdir.test.txt
│ │ ├── direnv-envrcdir-current-config-sub.test.txt
│ │ ├── direnv-envrcdir-fail-no-config.test.txt
│ │ ├── direnv-envrcdir-parent-no-config.test.txt
│ │ ├── direnv-envrcdir-parent.test.txt
│ │ ├── direnv-envrcdir.test.txt
│ │ ├── direnv-printenvrc-config.test.txt
│ │ ├── direnv-printenvrc-envrcdir.test.txt
│ │ ├── direnv-printenvrc.test.txt
│ │ ├── direnv.test.txt
│ │ └── dockerfile.test.txt
│ ├── info/
│ │ └── info.test.txt
│ ├── init/
│ │ └── empty.test.txt
│ ├── languages/
│ │ ├── php.test.txt
│ │ ├── python_patch_cuda.test.txt
│ │ ├── python_patch_missing_ref.test.txt
│ │ ├── python_patch_missing_so.test.txt
│ │ └── python_patch_old_glibc.test.txt
│ ├── lockfile/
│ │ ├── lockfile_tidy.test.txt
│ │ └── nopaths.txt
│ ├── packages/
│ │ ├── flakes.test.txt
│ │ └── unfree.test.txt
│ ├── plugin/
│ │ ├── disable-plugin.test.txt
│ │ ├── plugin.cycle.test.txt
│ │ └── plugin.test.txt
│ ├── rm/
│ │ ├── add-rm.test.txt
│ │ ├── manual.test.txt
│ │ ├── multi.test.txt
│ │ └── rm.test.txt
│ ├── run/
│ │ ├── args.test.txt
│ │ ├── env.test.txt
│ │ ├── envfrom.test.txt
│ │ ├── path.test.txt
│ │ ├── pure.test.txt
│ │ ├── quote_escaping.test.txt
│ │ ├── script.test.txt
│ │ ├── script_exit_on_error.test.txt
│ │ └── shellception.test.txt
│ ├── shell/
│ │ └── shellenv.test.txt
│ ├── shellenv/
│ │ └── node/
│ │ ├── README.md
│ │ ├── devbox.json
│ │ ├── less-out/
│ │ │ └── style.css
│ │ ├── less-src/
│ │ │ └── style.less
│ │ └── package.json
│ ├── testrunner/
│ │ ├── assert.go
│ │ ├── examplesrunner.go
│ │ ├── run_test.test.txt
│ │ ├── setupenv.go
│ │ ├── source.go
│ │ ├── testrunner.go
│ │ └── updater/
│ │ └── main.go
│ ├── testscripts_test.go
│ └── update/
│ └── update.test.txt
├── typos.toml
├── vendor-hash
└── vscode-extension/
├── .eslintrc.json
├── .gitignore
├── .vscodeignore
├── .yarnrc
├── CHANGELOG.md
├── LICENSE
├── README.md
├── package.json
├── src/
│ ├── devbox.ts
│ ├── extension.ts
│ ├── openinvscode.ts
│ └── test/
│ ├── runTest.ts
│ └── suite/
│ ├── extension.test.ts
│ └── index.ts
└── tsconfig.json
SYMBOL INDEX (1720 symbols across 284 files)
FILE: cmd/devbox/main.go
function main (line 10) | func main() {
FILE: devbox.go
type Devbox (line 13) | type Devbox struct
method Install (line 30) | func (d *Devbox) Install(ctx context.Context) error {
function Open (line 18) | func Open(path string) (*Devbox, error) {
FILE: examples/cloud_development/temporal/hello/hello_activity.py
class ComposeGreetingInput (line 15) | class ComposeGreetingInput:
function compose_greeting (line 22) | async def compose_greeting(input: ComposeGreetingInput) -> str:
class GreetingWorkflow (line 29) | class GreetingWorkflow:
method run (line 31) | async def run(self, name: str) -> str:
function main (line 40) | async def main():
FILE: examples/cloud_development/temporal/hello/hello_cron.py
class ComposeGreetingInput (line 11) | class ComposeGreetingInput:
function compose_greeting (line 17) | async def compose_greeting(input: ComposeGreetingInput) -> str:
class GreetingWorkflow (line 22) | class GreetingWorkflow:
method run (line 24) | async def run(self, name: str) -> None:
function main (line 33) | async def main():
FILE: examples/data_science/pytorch/basic-example/main.py
function create_arrays (line 3) | def create_arrays(n):
function main (line 9) | def main():
FILE: examples/data_science/pytorch/gradio/run.py
function predict (line 33) | def predict(input):
FILE: examples/databases/mariadb/setup_db.sql
type colors (line 12) | CREATE TABLE colors (
FILE: examples/databases/mysql/setup_db.sql
type colors (line 12) | CREATE TABLE colors (
FILE: examples/databases/postgres/setup_postgres_db.sql
type colors (line 9) | CREATE TABLE colors (
FILE: examples/development/bun/index.ts
method fetch (line 5) | fetch(req) {
FILE: examples/development/csharp/hello-world/Program.cs
class Product (line 5) | class Product
method Product (line 11) | public Product()
class Program (line 18) | class Program
method Main (line 20) | static void Main(string[] args)
FILE: examples/development/elixir/elixir_hello/lib/elixir_hello.ex
class ElixirHello (line 1) | defmodule ElixirHello
method start (line 16) | def start(_type, _args) do
FILE: examples/development/elixir/elixir_hello/lib/kv.exs
class KV (line 1) | defmodule KV
method start_link (line 2) | def start_link do
method loop (line 6) | defp loop(map) do
FILE: examples/development/elixir/elixir_hello/mix.exs
class ElixirHello.MixProject (line 1) | defmodule ElixirHello.MixProject
method project (line 4) | def project do
method application (line 15) | def application do
method deps (line 23) | defp deps do
FILE: examples/development/elixir/elixir_hello/test/elixir_hello_test.exs
class ElixirHelloTest (line 1) | defmodule ElixirHelloTest
FILE: examples/development/go/hello-world/main.go
function main (line 8) | func main() {
FILE: examples/development/java/gradle/hello-world/src/main/java/hello/HelloWorld.java
class HelloWorld (line 3) | public class HelloWorld {
method main (line 4) | public static void main(String[] args) {
FILE: examples/development/java/maven/hello-world/src/main/java/com/devbox/mavenapp/App.java
class App (line 7) | public class App {
method main (line 8) | public static void main(String[] args) {
FILE: examples/development/java/maven/hello-world/src/test/java/com/devbox/mavenapp/AppTest.java
class AppTest (line 10) | public class AppTest
method shouldAnswerWithTrue (line 15) | @Test
FILE: examples/development/nodejs/nodejs-npm/index.js
constant NODE_MAJOR_VERSION (line 1) | const NODE_MAJOR_VERSION = process.versions.node.split('.')[0];
FILE: examples/development/nodejs/nodejs-pnpm/index.js
constant NODE_MAJOR_VERSION (line 1) | const NODE_MAJOR_VERSION = process.versions.node.split('.')[0];
FILE: examples/development/nodejs/nodejs-typescript/index.ts
constant NODE_MAJOR_VERSION (line 1) | const NODE_MAJOR_VERSION = process.versions.node.split('.')[0];
FILE: examples/development/nodejs/nodejs-yarn/index.js
constant NODE_MAJOR_VERSION (line 1) | const NODE_MAJOR_VERSION = process.versions.node.split('.')[0];
FILE: examples/development/python/poetry/poetry-demo/tests/test_poetry_demo.py
function test_version (line 4) | def test_version():
FILE: examples/development/python/poetry/poetry-pyproject-subdir/service/test_with_pytest.py
function test_always_passes (line 2) | def test_always_passes():
FILE: examples/development/rust/rust-stable-hello-world/src/main.rs
function main (line 1) | fn main() {
function hello_world (line 5) | fn hello_world() -> &'static str {
function test_hello_world (line 14) | fn test_hello_world() {
FILE: examples/stacks/django/todo_project/manage.py
function main (line 7) | def main():
FILE: examples/stacks/django/todo_project/todo_app/apps.py
class TodoAppConfig (line 4) | class TodoAppConfig(AppConfig):
FILE: examples/stacks/django/todo_project/todo_app/migrations/0001_initial.py
class Migration (line 6) | class Migration(migrations.Migration):
FILE: examples/stacks/django/todo_project/todo_app/models.py
class Todo (line 4) | class Todo(models.Model):
class Meta (line 9) | class Meta:
FILE: examples/stacks/django/todo_project/todo_app/views.py
function todo_list (line 4) | def todo_list(request):
function create_todo (line 9) | def create_todo(request):
FILE: examples/stacks/lapp-stack/setup_postgres_db.sql
type address_book (line 16) | CREATE TABLE address_book (
FILE: examples/stacks/lepp-stack/setup_postgres_db.sql
type address_book (line 16) | CREATE TABLE address_book (
FILE: examples/stacks/rails/blog/app/channels/application_cable/channel.rb
type ApplicationCable (line 1) | module ApplicationCable
class Channel (line 2) | class Channel < ActionCable::Channel::Base
FILE: examples/stacks/rails/blog/app/channels/application_cable/connection.rb
type ApplicationCable (line 1) | module ApplicationCable
class Connection (line 2) | class Connection < ActionCable::Connection::Base
FILE: examples/stacks/rails/blog/app/controllers/application_controller.rb
class ApplicationController (line 1) | class ApplicationController < ActionController::Base
FILE: examples/stacks/rails/blog/app/helpers/application_helper.rb
type ApplicationHelper (line 1) | module ApplicationHelper
FILE: examples/stacks/rails/blog/app/jobs/application_job.rb
class ApplicationJob (line 1) | class ApplicationJob < ActiveJob::Base
FILE: examples/stacks/rails/blog/app/mailers/application_mailer.rb
class ApplicationMailer (line 1) | class ApplicationMailer < ActionMailer::Base
FILE: examples/stacks/rails/blog/app/models/application_record.rb
class ApplicationRecord (line 1) | class ApplicationRecord < ActiveRecord::Base
FILE: examples/stacks/rails/blog/config/application.rb
type Blog (line 9) | module Blog
class Application (line 10) | class Application < Rails::Application
FILE: examples/stacks/rails/blog/test/application_system_test_case.rb
class ApplicationSystemTestCase (line 3) | class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
FILE: examples/stacks/rails/blog/test/channels/application_cable/connection_test.rb
class ApplicationCable::ConnectionTest (line 3) | class ApplicationCable::ConnectionTest < ActionCable::Connection::TestCase
FILE: examples/stacks/rails/blog/test/test_helper.rb
class ActiveSupport::TestCase (line 5) | class ActiveSupport::TestCase
FILE: examples/stacks/spring/src/main/java/com/devbox/example/spring/spring/Application.java
class Application (line 6) | @SpringBootApplication
method main (line 9) | public static void main(String[] args) {
FILE: examples/stacks/spring/src/main/java/com/devbox/example/spring/spring/MainController.java
class MainController (line 11) | @Controller
method addNewUser (line 18) | @PostMapping(path="/add") // Map ONLY POST Requests
method getAllUsers (line 31) | @GetMapping(path="/all")
FILE: examples/stacks/spring/src/main/java/com/devbox/example/spring/spring/User.java
class User (line 8) | @Entity
method User (line 18) | public User() {
method setName (line 21) | public void setName(String name) {
method setId (line 25) | public void setId(Integer id){
method setEmail (line 29) | public void setEmail(String email){
method getId (line 33) | public Integer getId() {
method getName (line 37) | public String getName() {
method getEmail (line 41) | public String getEmail(){
FILE: examples/stacks/spring/src/main/java/com/devbox/example/spring/spring/UserRepository.java
type UserRepository (line 6) | public interface UserRepository extends CrudRepository<User,
FILE: examples/stacks/spring/src/test/java/com/devbox/example/spring/spring/ApplicationTests.java
class ApplicationTests (line 6) | @SpringBootTest
method contextLoads (line 9) | @Test
FILE: internal/boxcli/add.go
constant toSearchForPackages (line 18) | toSearchForPackages = "To search for packages, use the `devbox search` c...
type addCmdFlags (line 20) | type addCmdFlags struct
function addCmd (line 31) | func addCmd() *cobra.Command {
function addCmdFunc (line 85) | func addCmdFunc(cmd *cobra.Command, args []string, flags addCmdFlags) er...
FILE: internal/boxcli/args.go
function pathArg (line 14) | func pathArg(args []string) string {
FILE: internal/boxcli/auth.go
function authCmd (line 21) | func authCmd() *cobra.Command {
function loginCmd (line 35) | func loginCmd() *cobra.Command {
function logoutCmd (line 59) | func logoutCmd() *cobra.Command {
type whoAmICmdFlags (line 80) | type whoAmICmdFlags struct
function whoAmICmd (line 84) | func whoAmICmd() *cobra.Command {
function authNewTokenCommand (line 121) | func authNewTokenCommand() *cobra.Command {
FILE: internal/boxcli/cache.go
type cacheFlags (line 23) | type cacheFlags struct
type credentialsFlags (line 28) | type credentialsFlags struct
function cacheCmd (line 32) | func cacheCmd() *cobra.Command {
function cacheConfigureCmd (line 82) | func cacheConfigureCmd() *cobra.Command {
function cacheCredentialsCmd (line 116) | func cacheCredentialsCmd() *cobra.Command {
function cacheEnableCmd (line 148) | func cacheEnableCmd() *cobra.Command {
function cacheInfoCmd (line 191) | func cacheInfoCmd() *cobra.Command {
FILE: internal/boxcli/config.go
type configFlags (line 11) | type configFlags struct
method register (line 16) | func (flags *configFlags) register(cmd *cobra.Command) {
method registerPersistent (line 23) | func (flags *configFlags) registerPersistent(cmd *cobra.Command) {
type pathFlag (line 31) | type pathFlag struct
method register (line 35) | func (flags *pathFlag) register(cmd *cobra.Command) {
method registerPersistent (line 41) | func (flags *pathFlag) registerPersistent(cmd *cobra.Command) {
FILE: internal/boxcli/create.go
type createCmdFlags (line 18) | type createCmdFlags struct
function createCmd (line 25) | func createCmd() *cobra.Command {
function runCreateCmd (line 73) | func runCreateCmd(cmd *cobra.Command, args []string, flags *createCmdFla...
function handlePath (line 97) | func handlePath(args []string, flags *createCmdFlags) string {
FILE: internal/boxcli/env.go
type envFlag (line 16) | type envFlag
method register (line 18) | func (f *envFlag) register(cmd *cobra.Command) {
method Env (line 27) | func (f *envFlag) Env(path string) (map[string]string, error) {
FILE: internal/boxcli/featureflag/feature.go
constant envNamePrefix (line 15) | envNamePrefix = "DEVBOX_FEATURE_"
type feature (line 17) | type feature struct
method Enabled (line 48) | func (f *feature) Enabled() bool {
method EnableOnDev (line 66) | func (f *feature) EnableOnDev() *feature {
method EnableForTest (line 73) | func (f *feature) EnableForTest(t *testing.T) {
function disable (line 27) | func disable(name string) *feature {
function enable (line 38) | func enable(name string) *feature {
function All (line 78) | func All() map[string]bool {
FILE: internal/boxcli/featureflag/feature_test.go
function TestEnabledFeature (line 10) | func TestEnabledFeature(t *testing.T) {
function TestDisabledFeature (line 18) | func TestDisabledFeature(t *testing.T) {
function TestEnabledFeatureEnv (line 26) | func TestEnabledFeatureEnv(t *testing.T) {
function TestNonExistentFeature (line 35) | func TestNonExistentFeature(t *testing.T) {
FILE: internal/boxcli/gen-docs.go
function genDocsCmd (line 17) | func genDocsCmd() *cobra.Command {
FILE: internal/boxcli/generate.go
type generateCmdFlags (line 21) | type generateCmdFlags struct
type generateDockerfileCmdFlags (line 30) | type generateDockerfileCmdFlags struct
type GenerateReadmeCmdFlags (line 35) | type GenerateReadmeCmdFlags struct
type GenerateAliasCmdFlags (line 41) | type GenerateAliasCmdFlags struct
function generateCmd (line 47) | func generateCmd() *cobra.Command {
function debugCmd (line 68) | func debugCmd() *cobra.Command {
function devcontainerCmd (line 81) | func devcontainerCmd() *cobra.Command {
function dockerfileCmd (line 99) | func dockerfileCmd() *cobra.Command {
function direnvCmd (line 135) | func direnvCmd() *cobra.Command {
function genReadmeCmd (line 171) | func genReadmeCmd() *cobra.Command {
function genAliasCmd (line 206) | func genAliasCmd() *cobra.Command {
function runGenerateCmd (line 258) | func runGenerateCmd(cmd *cobra.Command, flags *generateCmdFlags) error {
function runGenerateDirenvCmd (line 281) | func runGenerateDirenvCmd(cmd *cobra.Command, flags *generateCmdFlags) e...
FILE: internal/boxcli/global.go
function globalCmd (line 17) | func globalCmd() *cobra.Command {
function addCommandAndHideConfigFlag (line 50) | func addCommandAndHideConfigFlag(parent, child *cobra.Command) {
function ensureGlobalConfig (line 57) | func ensureGlobalConfig() (string, error) {
function setGlobalConfigForDelegatedCommands (line 73) | func setGlobalConfigForDelegatedCommands(
function ensureGlobalEnvEnabled (line 93) | func ensureGlobalEnvEnabled(cmd *cobra.Command, args []string) error {
FILE: internal/boxcli/info.go
type infoCmdFlags (line 16) | type infoCmdFlags struct
function infoCmd (line 21) | func infoCmd() *cobra.Command {
function infoCmdFunc (line 38) | func infoCmdFunc(cmd *cobra.Command, pkg string, flags infoCmdFlags) err...
FILE: internal/boxcli/init.go
type initFlags (line 18) | type initFlags struct
function initCmd (line 23) | func initCmd() *cobra.Command {
function runInitCmd (line 54) | func runInitCmd(cmd *cobra.Command, args []string, flags *initFlags) err...
FILE: internal/boxcli/install.go
type installCmdFlags (line 18) | type installCmdFlags struct
function installCmd (line 23) | func installCmd() *cobra.Command {
function installCmdFunc (line 45) | func installCmdFunc(cmd *cobra.Command, flags installCmdFlags) error {
FILE: internal/boxcli/integrate.go
type integrateCmdFlags (line 23) | type integrateCmdFlags struct
function integrateCmd (line 29) | func integrateCmd() *cobra.Command {
function integrateVSCodeCmd (line 44) | func integrateVSCodeCmd() *cobra.Command {
type parentMessage (line 61) | type parentMessage struct
function runIntegrateVSCodeCmd (line 65) | func runIntegrateVSCodeCmd(cmd *cobra.Command, flags integrateCmdFlags) ...
type debugMode (line 148) | type debugMode struct
method logToFile (line 152) | func (d *debugMode) logToFile(msg string) {
FILE: internal/boxcli/list.go
type listCmdFlags (line 17) | type listCmdFlags struct
function listCmd (line 22) | func listCmd() *cobra.Command {
function printOutdatedPackages (line 72) | func printOutdatedPackages(cmd *cobra.Command, box *devbox.Devbox) error {
FILE: internal/boxcli/log.go
function logCmd (line 13) | func logCmd() *cobra.Command {
function doLogCommand (line 25) | func doLogCommand(cmd *cobra.Command, args []string) error {
FILE: internal/boxcli/midcobra/debug.go
type DebugMiddleware (line 22) | type DebugMiddleware struct
method AttachToFlag (line 28) | func (d *DebugMiddleware) AttachToFlag(flags *pflag.FlagSet, flagName ...
method preRun (line 38) | func (d *DebugMiddleware) preRun(cmd *cobra.Command, args []string) {
method postRun (line 51) | func (d *DebugMiddleware) postRun(cmd *cobra.Command, args []string, r...
FILE: internal/boxcli/midcobra/midcobra.go
type Executable (line 18) | type Executable interface
type Middleware (line 23) | type Middleware interface
function New (line 28) | func New(cmd *cobra.Command) Executable {
type midcobraExecutable (line 35) | type midcobraExecutable struct
method AddMiddleware (line 43) | func (ex *midcobraExecutable) AddMiddleware(mids ...Middleware) {
method Execute (line 47) | func (ex *midcobraExecutable) Execute(ctx context.Context, args []stri...
FILE: internal/boxcli/midcobra/telemetry.go
function Telemetry (line 26) | func Telemetry() Middleware {
type telemetryMiddleware (line 30) | type telemetryMiddleware struct
method preRun (line 35) | func (m *telemetryMiddleware) preRun(cmd *cobra.Command, args []string) {
method postRun (line 39) | func (m *telemetryMiddleware) postRun(cmd *cobra.Command, args []strin...
function getSubcommand (line 70) | func getSubcommand(cmd *cobra.Command, args []string) (subcmd *cobra.Com...
function getPackagesAndCommitHash (line 84) | func getPackagesAndCommitHash(c *cobra.Command) ([]string, string) {
FILE: internal/boxcli/midcobra/telemetry_test.go
function TestGetPackagesAndCommitHash (line 11) | func TestGetPackagesAndCommitHash(t *testing.T) {
FILE: internal/boxcli/midcobra/trace.go
type TraceMiddleware (line 15) | type TraceMiddleware struct
method AttachToFlag (line 23) | func (t *TraceMiddleware) AttachToFlag(flags *pflag.FlagSet, flagName ...
method preRun (line 30) | func (t *TraceMiddleware) preRun(cmd *cobra.Command, _ []string) {
method postRun (line 52) | func (t *TraceMiddleware) postRun(*cobra.Command, []string, error) {
FILE: internal/boxcli/multi/multi.go
function Open (line 13) | func Open(opts *devopt.Opts) ([]*devbox.Devbox, error) {
FILE: internal/boxcli/multi/sync.go
function SyncLockfiles (line 15) | func SyncLockfiles(pkgs []string) error {
function latestPackages (line 68) | func latestPackages(lockfilePaths []string) (map[string]*lock.Package, e...
function collectLockfiles (line 96) | func collectLockfiles() ([]string, error) {
FILE: internal/boxcli/patch.go
function patchCmd (line 8) | func patchCmd() *cobra.Command {
FILE: internal/boxcli/path.go
type pathCmdFlags (line 12) | type pathCmdFlags struct
function pathCmd (line 16) | func pathCmd() *cobra.Command {
FILE: internal/boxcli/pull.go
type pullCmdFlags (line 24) | type pullCmdFlags struct
function pullCmd (line 29) | func pullCmd() *cobra.Command {
function pullCmdFunc (line 52) | func pullCmdFunc(cmd *cobra.Command, url string, flags *pullCmdFlags) er...
function pullErrorPrompt (line 115) | func pullErrorPrompt(err error) string {
function absolutizeIfLocal (line 124) | func absolutizeIfLocal(path string) (string, error) {
FILE: internal/boxcli/push.go
type pushCmdFlags (line 17) | type pushCmdFlags struct
function pushCmd (line 21) | func pushCmd() *cobra.Command {
function pushCmdFunc (line 38) | func pushCmdFunc(cmd *cobra.Command, url string, flags pushCmdFlags) err...
FILE: internal/boxcli/rm.go
type removeCmdFlags (line 13) | type removeCmdFlags struct
function removeCmd (line 17) | func removeCmd() *cobra.Command {
function runRemoveCmd (line 33) | func runRemoveCmd(cmd *cobra.Command, args []string, flags removeCmdFlag...
FILE: internal/boxcli/root.go
type cobraFunc (line 24) | type cobraFunc
type rootCmdFlags (line 31) | type rootCmdFlags struct
function RootCmd (line 35) | func RootCmd() *cobra.Command {
function Execute (line 106) | func Execute(ctx context.Context, args []string) int {
function Main (line 116) | func Main() {
function listAllCommands (line 139) | func listAllCommands(cmd *cobra.Command, indent string) {
function setSystemBinaryPaths (line 149) | func setSystemBinaryPaths() {
FILE: internal/boxcli/run.go
type runCmdFlags (line 27) | type runCmdFlags struct
type runFlagDefaults (line 39) | type runFlagDefaults struct
function runCmd (line 43) | func runCmd(defaults runFlagDefaults) *cobra.Command {
function listScripts (line 85) | func listScripts(cmd *cobra.Command, flags runCmdFlags) []string {
function runScriptCmd (line 128) | func runScriptCmd(cmd *cobra.Command, args []string, flags runCmdFlags) ...
function parseScriptArgs (line 213) | func parseScriptArgs(args []string, flags runCmdFlags) (string, string, ...
function wrapArgsForRun (line 225) | func wrapArgsForRun(rootCmd *cobra.Command, args []string) []string {
FILE: internal/boxcli/search.go
constant trimmedVersionsLength (line 20) | trimmedVersionsLength = 10
type searchCmdFlags (line 22) | type searchCmdFlags struct
function searchCmd (line 26) | func searchCmd() *cobra.Command {
function printSearchResults (line 68) | func printSearchResults(
FILE: internal/boxcli/secrets.go
type secretsFlags (line 16) | type secretsFlags struct
method envsec (line 20) | func (f *secretsFlags) envsec(cmd *cobra.Command) (*envsec.Envsec, err...
type secretsInitCmdFlags (line 33) | type secretsInitCmdFlags struct
type secretsListFlags (line 37) | type secretsListFlags struct
type secretsDownloadFlags (line 42) | type secretsDownloadFlags struct
type secretsUploadFlags (line 46) | type secretsUploadFlags struct
function secretsCmd (line 50) | func secretsCmd() *cobra.Command {
function secretsInitCmd (line 70) | func secretsInitCmd(secretsFlags *secretsFlags) *cobra.Command {
function secretsSetCmd (line 92) | func secretsSetCmd(flags *secretsFlags) *cobra.Command {
function secretsRemoveCmd (line 112) | func secretsRemoveCmd(flags *secretsFlags) *cobra.Command {
function secretsListCmd (line 129) | func secretsListCmd(commonFlags *secretsFlags) *cobra.Command {
function secretsDownloadCmd (line 169) | func secretsDownloadCmd(commonFlags *secretsFlags) *cobra.Command {
function secretsUploadCmd (line 197) | func secretsUploadCmd(commonFlags *secretsFlags) *cobra.Command {
function secretsInitFunc (line 225) | func secretsInitFunc(
FILE: internal/boxcli/services.go
type servicesCmdFlags (line 13) | type servicesCmdFlags struct
type serviceUpFlags (line 19) | type serviceUpFlags struct
method register (line 30) | func (flags *serviceUpFlags) register(cmd *cobra.Command) {
type serviceStopFlags (line 26) | type serviceStopFlags struct
method register (line 46) | func (flags *serviceStopFlags) register(cmd *cobra.Command) {
function servicesCmd (line 51) | func servicesCmd(persistentPreRunE ...cobraFunc) *cobra.Command {
function attachServices (line 157) | func attachServices(cmd *cobra.Command, flags servicesCmdFlags) error {
function listServices (line 170) | func listServices(cmd *cobra.Command, flags servicesCmdFlags) error {
function startServices (line 183) | func startServices(cmd *cobra.Command, services []string, flags services...
function stopServices (line 201) | func stopServices(
function restartServices (line 228) | func restartServices(
function startProcessManager (line 250) | func startProcessManager(
function showProcessComposePort (line 288) | func showProcessComposePort(cmd *cobra.Command, flags servicesCmdFlags) ...
FILE: internal/boxcli/setup.go
constant nixDaemonFlag (line 15) | nixDaemonFlag = "daemon"
function setupCmd (line 17) | func setupCmd() *cobra.Command {
function runInstallNixCmd (line 41) | func runInstallNixCmd(cmd *cobra.Command) error {
function ensureNixInstalled (line 55) | func ensureNixInstalled(cmd *cobra.Command, _args []string) error {
function nixDaemonFlagVal (line 65) | func nixDaemonFlagVal(cmd *cobra.Command) func() *bool {
FILE: internal/boxcli/shell.go
type shellCmdFlags (line 19) | type shellCmdFlags struct
type shellFlagDefaults (line 30) | type shellFlagDefaults struct
function shellCmd (line 34) | func shellCmd(defaults shellFlagDefaults) *cobra.Command {
function runShellCmd (line 65) | func runShellCmd(cmd *cobra.Command, flags shellCmdFlags) error {
function shellInceptionErrorMsg (line 118) | func shellInceptionErrorMsg(cmdPath string) error {
FILE: internal/boxcli/shellenv.go
type shellEnvCmdFlags (line 17) | type shellEnvCmdFlags struct
type shellenvFlagDefaults (line 32) | type shellenvFlagDefaults struct
function shellEnvCmd (line 37) | func shellEnvCmd(defaults shellenvFlagDefaults) *cobra.Command {
function shellEnvFunc (line 96) | func shellEnvFunc(
FILE: internal/boxcli/update.go
type updateCmdFlags (line 16) | type updateCmdFlags struct
function updateCmd (line 23) | func updateCmd() *cobra.Command {
function updateCmdFunc (line 67) | func updateCmdFunc(cmd *cobra.Command, args []string, flags *updateCmdFl...
function updateAllProjects (line 95) | func updateAllProjects(cmd *cobra.Command, args []string) error {
FILE: internal/boxcli/usererr/exiterr.go
type ExitError (line 12) | type ExitError struct
function NewExecError (line 16) | func NewExecError(source error) error {
FILE: internal/boxcli/usererr/usererr.go
type level (line 13) | type level
constant levelError (line 16) | levelError level = iota
constant levelWarning (line 17) | levelWarning
type combined (line 20) | type combined struct
method Error (line 111) | func (c *combined) Error() string {
method Is (line 119) | func (c *combined) Is(target error) bool {
method Unwrap (line 124) | func (c *combined) Unwrap() error { return c.Cause() }
method Cause (line 127) | func (c *combined) Cause() error { return errors.Cause(c.source) }
method Format (line 130) | func (c *combined) Format(s fmt.State, verb rune) {
function New (line 29) | func New(msg string, args ...any) error {
function NewLogged (line 39) | func NewLogged(msg string, args ...any) error {
function NewWarning (line 47) | func NewWarning(msg string, args ...any) error {
function WithUserMessage (line 54) | func WithUserMessage(source error, msg string, args ...any) error {
function WithLoggedUserMessage (line 66) | func WithLoggedUserMessage(source error, msg string, args ...any) error {
function Extract (line 78) | func Extract(err error) (error, bool) { // nolint: revive
function ShouldLogError (line 88) | func ShouldLogError(err error) bool {
function IsWarning (line 103) | func IsWarning(err error) bool {
function hasUserMessage (line 140) | func hasUserMessage(err error) bool {
FILE: internal/boxcli/version.go
type versionFlags (line 18) | type versionFlags struct
function versionCmd (line 22) | func versionCmd() *cobra.Command {
function selfUpdateCmd (line 41) | func selfUpdateCmd() *cobra.Command {
function versionCmdFunc (line 54) | func versionCmdFunc(cmd *cobra.Command, _ []string, flags versionFlags) ...
type versionInfo (line 71) | type versionInfo struct
function getVersionInfo (line 81) | func getVersionInfo() *versionInfo {
FILE: internal/build/build.go
constant OSLinux (line 39) | OSLinux = "Linux"
constant OSDarwin (line 40) | OSDarwin = "macOS"
constant OSWSL (line 41) | OSWSL = "WSL"
function OS (line 49) | func OS() string {
function Issuer (line 66) | func Issuer() string {
function ClientID (line 73) | func ClientID() string {
function JetpackAPIHost (line 80) | func JetpackAPIHost() string {
function SuccessRedirect (line 87) | func SuccessRedirect() string {
function Audience (line 94) | func Audience() []string {
function DashboardHostname (line 98) | func DashboardHostname() string {
function SourceDir (line 107) | func SourceDir() (string, error) {
FILE: internal/cachehash/hash.go
function Bytes (line 22) | func Bytes(b []byte) string {
function Bytes6 (line 29) | func Bytes6(b []byte) string {
function File (line 35) | func File(path string) (string, error) {
function JSON (line 53) | func JSON(a any) (string, error) {
function JSONFile (line 62) | func JSONFile(path string) (string, error) {
function newHash (line 77) | func newHash() hash.Hash { return sha256.New() }
FILE: internal/cachehash/hash_test.go
function TestFile (line 10) | func TestFile(t *testing.T) {
function TestFileNotExist (line 37) | func TestFileNotExist(t *testing.T) {
function TestJSON (line 48) | func TestJSON(t *testing.T) {
function TestJSONUnsupportedType (line 71) | func TestJSONUnsupportedType(t *testing.T) {
function TestJSONFile (line 79) | func TestJSONFile(t *testing.T) {
function TestJSONFileNotExist (line 106) | func TestJSONFileNotExist(t *testing.T) {
FILE: internal/cmdutil/cmdutil.go
function Exists (line 11) | func Exists(command string) bool {
function GetPathOrDefault (line 18) | func GetPathOrDefault(command, def string) string {
FILE: internal/cmdutil/exec.go
function CommandTTY (line 13) | func CommandTTY(name string, arg ...string) *exec.Cmd {
function CommandTTYWithBuffer (line 23) | func CommandTTYWithBuffer(
FILE: internal/conf/env.go
function OSExpandEnvMap (line 10) | func OSExpandEnvMap(env, existingEnv map[string]string, projectDir strin...
FILE: internal/cuecfg/cuecfg.go
function Marshal (line 16) | func Marshal(valuePtr any, extension string) ([]byte, error) {
function Unmarshal (line 30) | func Unmarshal(data []byte, extension string, valuePtr any) error {
function InitFile (line 44) | func InitFile(path string, valuePtr any) (bool, error) {
function ParseFile (line 59) | func ParseFile(path string, valuePtr any) error {
function ParseFileWithExtension (line 65) | func ParseFileWithExtension(path, ext string, valuePtr any) error {
function WriteFile (line 74) | func WriteFile(path string, value any) error {
function IsSupportedExtension (line 83) | func IsSupportedExtension(ext string) bool {
FILE: internal/cuecfg/json.go
constant Indent (line 13) | Indent = " "
function MarshalJSON (line 21) | func MarshalJSON(v interface{}) ([]byte, error) {
function unmarshalJSON (line 32) | func unmarshalJSON(data []byte, v interface{}) error {
FILE: internal/cuecfg/toml.go
function marshalToml (line 10) | func marshalToml(v interface{}) ([]byte, error) {
function unmarshalToml (line 14) | func unmarshalToml(data []byte, v interface{}) error {
FILE: internal/cuecfg/xml.go
function marshalXML (line 10) | func marshalXML(v interface{}) ([]byte, error) {
function unmarshalXML (line 14) | func unmarshalXML(data []byte, v interface{}) error {
FILE: internal/cuecfg/yaml.go
function marshalYaml (line 11) | func marshalYaml(v interface{}) ([]byte, error) {
function unmarshalYaml (line 15) | func unmarshalYaml(data []byte, v interface{}) error {
FILE: internal/debug/debug.go
constant DevboxDebug (line 19) | DevboxDebug = "DEVBOX_DEBUG"
function init (line 26) | func init() {
function Enable (line 38) | func Enable() { level.Set(slog.LevelDebug) }
function IsEnabled (line 39) | func IsEnabled() bool { return slog.Default().Enabled(context.Back...
function SetOutput (line 40) | func SetOutput(w io.Writer) { slog.SetDefault(slog.New(slog.NewTextHandl...
function Recover (line 42) | func Recover() {
function EarliestStackTrace (line 56) | func EarliestStackTrace(err error) error {
FILE: internal/debug/time.go
constant devboxPrintExecTime (line 17) | devboxPrintExecTime = "DEVBOX_PRINT_EXEC_TIME"
type timer (line 21) | type timer struct
method End (line 48) | func (t *timer) End() {
function Timer (line 26) | func Timer(name string) *timer {
function FunctionTimer (line 36) | func FunctionTimer() *timer {
FILE: internal/devbox/cache.go
method UploadProjectToCache (line 20) | func (d *Devbox) UploadProjectToCache(
function UploadInstallableToCache (line 68) | func UploadInstallableToCache(
function getWriteCacheURI (line 88) | func getWriteCacheURI(
FILE: internal/devbox/devbox.go
constant shellHistoryFile (line 55) | shellHistoryFile = ".devbox/shell_history"
constant arbitraryCmdFilename (line 56) | arbitraryCmdFilename = ".cmd"
type Devbox (line 59) | type Devbox struct
method ProjectDir (line 177) | func (d *Devbox) ProjectDir() string {
method Config (line 181) | func (d *Devbox) Config() *devconfig.Config {
method ConfigHash (line 185) | func (d *Devbox) ConfigHash() (string, error) {
method Stdenv (line 206) | func (d *Devbox) Stdenv() flake.Ref {
method Generate (line 216) | func (d *Devbox) Generate(ctx context.Context) error {
method Shell (line 223) | func (d *Devbox) Shell(ctx context.Context, envOpts devopt.EnvOptions)...
method RunScript (line 259) | func (d *Devbox) RunScript(ctx context.Context, envOpts devopt.EnvOpti...
method Install (line 333) | func (d *Devbox) Install(ctx context.Context) error {
method ListScripts (line 340) | func (d *Devbox) ListScripts() []string {
method EnvExports (line 357) | func (d *Devbox) EnvExports(ctx context.Context, opts devopt.EnvExport...
method EnvVars (line 389) | func (d *Devbox) EnvVars(ctx context.Context) ([]string, error) {
method shellEnvHashKey (line 400) | func (d *Devbox) shellEnvHashKey() string {
method Info (line 405) | func (d *Devbox) Info(ctx context.Context, pkg string, markdown bool) ...
method GenerateDevcontainer (line 451) | func (d *Devbox) GenerateDevcontainer(ctx context.Context, generateOpt...
method GenerateDockerfile (line 501) | func (d *Devbox) GenerateDockerfile(ctx context.Context, generateOpts ...
method GenerateEnvrcFile (line 540) | func (d *Devbox) GenerateEnvrcFile(ctx context.Context, opts devopt.En...
method saveCfg (line 583) | func (d *Devbox) saveCfg() error {
method Services (line 587) | func (d *Devbox) Services() (services.Services, error) {
method execPrintDevEnv (line 610) | func (d *Devbox) execPrintDevEnv(ctx context.Context, usePrintDevEnvCa...
method computeEnv (line 691) | func (d *Devbox) computeEnv(
method ensureStateIsUpToDateAndComputeEnv (line 824) | func (d *Devbox) ensureStateIsUpToDateAndComputeEnv(
method nixPrintDevEnvCachePath (line 868) | func (d *Devbox) nixPrintDevEnvCachePath() string {
method flakeDir (line 872) | func (d *Devbox) flakeDir() string {
method AllPackageNamesIncludingRemovedTriggerPackages (line 884) | func (d *Devbox) AllPackageNamesIncludingRemovedTriggerPackages() []st...
method AllPackagesIncludingRemovedTriggerPackages (line 892) | func (d *Devbox) AllPackagesIncludingRemovedTriggerPackages() []*devpk...
method AllPackages (line 901) | func (d *Devbox) AllPackages() []*devpkg.Package {
method TopLevelPackages (line 906) | func (d *Devbox) TopLevelPackages() []*devpkg.Package {
method InstallablePackages (line 911) | func (d *Devbox) InstallablePackages() []*devpkg.Package {
method HasDeprecatedPackages (line 917) | func (d *Devbox) HasDeprecatedPackages() bool {
method findPackageByName (line 926) | func (d *Devbox) findPackageByName(name string) (*devpkg.Package, erro...
method checkOldEnvrc (line 950) | func (d *Devbox) checkOldEnvrc() error {
method configEnvs (line 985) | func (d *Devbox) configEnvs(
method ProjectDirHash (line 1090) | func (d *Devbox) ProjectDirHash() string {
method addHashToEnv (line 1094) | func (d *Devbox) addHashToEnv(env map[string]string) error {
method parseEnvAndExcludeSpecialCases (line 1104) | func (d *Devbox) parseEnvAndExcludeSpecialCases(currentEnv []string, p...
method PluginManager (line 1140) | func (d *Devbox) PluginManager() *plugin.Manager {
method Lockfile (line 1144) | func (d *Devbox) Lockfile() *lock.File {
method RunXPaths (line 1148) | func (d *Devbox) RunXPaths(ctx context.Context) (string, error) {
function InitConfig (line 75) | func InitConfig(dir string) error {
function EnsureConfig (line 80) | func EnsureConfig(dir string) error {
function Open (line 88) | func Open(opts *devopt.Opts) (*Devbox, error) {
function PrintEnvrcContent (line 535) | func PrintEnvrcContent(w io.Writer, envFlags devopt.EnvFlags, configDir ...
function validateEnvironment (line 1187) | func validateEnvironment(environment string) (string, error) {
FILE: internal/devbox/devbox_test.go
function TestDevbox (line 25) | func TestDevbox(t *testing.T) {
function testShellPlan (line 39) | func testShellPlan(t *testing.T, testPath string) {
type testNix (line 54) | type testNix struct
method PrintDevEnv (line 58) | func (n *testNix) PrintDevEnv(ctx context.Context, args *nix.PrintDevE...
function TestComputeEnv (line 69) | func TestComputeEnv(t *testing.T) {
function TestComputeDevboxPathIsIdempotent (line 78) | func TestComputeDevboxPathIsIdempotent(t *testing.T) {
function TestComputeDevboxPathWhenRemoving (line 99) | func TestComputeDevboxPathWhenRemoving(t *testing.T) {
function devboxForTesting (line 123) | func devboxForTesting(t *testing.T) *Devbox {
FILE: internal/devbox/devopt/devboxopts.go
type Opts (line 11) | type Opts struct
type ProcessComposeOpts (line 20) | type ProcessComposeOpts struct
type GenerateOpts (line 26) | type GenerateOpts struct
type EnvFlags (line 32) | type EnvFlags struct
type EnvrcOpts (line 37) | type EnvrcOpts struct
type PullboxOpts (line 44) | type PullboxOpts struct
type Credentials (line 50) | type Credentials struct
type AddOpts (line 57) | type AddOpts struct
type UpdateOpts (line 66) | type UpdateOpts struct
type ShellFormat (line 72) | type ShellFormat
constant ShellFormatBash (line 75) | ShellFormatBash ShellFormat = "bash"
constant ShellFormatNushell (line 76) | ShellFormatNushell ShellFormat = "nushell"
type EnvExportsOpts (line 79) | type EnvExportsOpts struct
type EnvOptions (line 90) | type EnvOptions struct
type LifecycleHooks (line 98) | type LifecycleHooks struct
FILE: internal/devbox/docgen/docgen.go
constant defaultName (line 16) | defaultName = "README.md"
constant defaultTemplateName (line 17) | defaultTemplateName = "readme.tmpl"
function GenerateReadme (line 20) | func GenerateReadme(
function SaveDefaultReadmeTemplate (line 65) | func SaveDefaultReadmeTemplate(outputPath string) error {
FILE: internal/devbox/envpath/pathlists.go
function JoinPathLists (line 16) | func JoinPathLists(pathLists ...string) string {
function RemoveFromPath (line 40) | func RemoveFromPath(path, pathToRemove string) string {
FILE: internal/devbox/envpath/pathlists_test.go
function TestCleanEnvPath (line 7) | func TestCleanEnvPath(t *testing.T) {
FILE: internal/devbox/envpath/stack.go
constant PathStackEnv (line 14) | PathStackEnv = "DEVBOX_PATH_STACK"
constant InitPathEnv (line 17) | InitPathEnv = "DEVBOX_INIT_PATH"
type stack (line 25) | type stack struct
method String (line 48) | func (s *stack) String() string {
method Path (line 52) | func (s *stack) Path(env map[string]string) string {
method Push (line 70) | func (s *stack) Push(
method Has (line 93) | func (s *stack) Has(projectHash string) bool {
function Stack (line 34) | func Stack(env, originalEnv map[string]string) *stack {
function Key (line 60) | func Key(projectHash string) string {
FILE: internal/devbox/envpath/stack_test.go
function TestNewStack (line 9) | func TestNewStack(t *testing.T) {
FILE: internal/devbox/envvars.go
constant devboxSetPrefix (line 15) | devboxSetPrefix = "__DEVBOX_SET_"
function exportify (line 22) | func exportify(vars map[string]string) string {
function exportifyNushell (line 65) | func exportifyNushell(vars map[string]string) string {
function addEnvIfNotPreviouslySetByDevbox (line 120) | func addEnvIfNotPreviouslySetByDevbox(existing, new map[string]string) {
function markEnvsAsSetByDevbox (line 128) | func markEnvsAsSetByDevbox(envs ...map[string]string) {
method IsEnvEnabled (line 139) | func (d *Devbox) IsEnvEnabled() bool {
method SkipInitHookEnvName (line 146) | func (d *Devbox) SkipInitHookEnvName() string {
FILE: internal/devbox/errors.go
function isConnectionError (line 5) | func isConnectionError(err error) bool {
FILE: internal/devbox/flakes.go
method getLocalFlakesDirs (line 13) | func (d *Devbox) getLocalFlakesDirs() []string {
FILE: internal/devbox/generate/devcontainer_util.go
type Options (line 31) | type Options struct
method CreateDockerfile (line 91) | func (g *Options) CreateDockerfile(
method CreateDevcontainer (line 123) | func (g *Options) CreateDevcontainer(ctx context.Context) error {
method getDevcontainerContent (line 205) | func (g *Options) getDevcontainerContent() *devcontainerObject {
type devcontainerObject (line 39) | type devcontainerObject struct
type build (line 46) | type build struct
type customizations (line 51) | type customizations struct
type vscode (line 55) | type vscode struct
type CreateDockerfileOptions (line 60) | type CreateDockerfileOptions struct
method Type (line 70) | func (opts CreateDockerfileOptions) Type() string {
method validate (line 74) | func (opts CreateDockerfileOptions) validate() error {
function CreateEnvrc (line 143) | func CreateEnvrc(ctx context.Context, opts devopt.EnvrcOpts) error {
function getRelativePathToConfig (line 179) | func getRelativePathToConfig(sourceDir, configDir string) (string, error) {
function EnvrcContent (line 255) | func EnvrcContent(w io.Writer, envFlags devopt.EnvFlags, configDir strin...
function formatConfigDirArg (line 271) | func formatConfigDirArg(configDir string) string {
FILE: internal/devbox/global.go
constant currentGlobalProfile (line 17) | currentGlobalProfile = "default"
function GlobalDataPath (line 19) | func GlobalDataPath() (string, error) {
FILE: internal/devbox/nixprofile.go
method syncNixProfileFromFlake (line 22) | func (d *Devbox) syncNixProfileFromFlake(ctx context.Context) error {
function wipeProfileHistory (line 103) | func wipeProfileHistory(profile string) error {
FILE: internal/devbox/packages.go
constant StateOutOfDateMessage (line 41) | StateOutOfDateMessage = "Your devbox environment may be out of date. Run...
type UpdateVersion (line 46) | type UpdateVersion struct
method Outdated (line 52) | func (d *Devbox) Outdated(ctx context.Context) (map[string]UpdateVersion...
method Add (line 85) | func (d *Devbox) Add(ctx context.Context, pkgsNames []string, opts devop...
method setPackageOptions (line 176) | func (d *Devbox) setPackageOptions(pkgs []string, opts devopt.AddOpts) e...
method printPostAddMessage (line 209) | func (d *Devbox) printPostAddMessage(
method Remove (line 241) | func (d *Devbox) Remove(ctx context.Context, pkgs ...string) error {
type installMode (line 278) | type installMode
constant install (line 281) | install installMode = "install"
constant uninstall (line 282) | uninstall installMode = "uninstall"
constant update (line 284) | update installMode = "update"
constant ensure (line 285) | ensure installMode = "ensure"
constant noInstall (line 286) | noInstall installMode = "noInstall"
method ensureStateIsUpToDate (line 301) | func (d *Devbox) ensureStateIsUpToDate(ctx context.Context, mode install...
method updateLockfile (line 361) | func (d *Devbox) updateLockfile(recomputeState bool) error {
method recomputeState (line 406) | func (d *Devbox) recomputeState(ctx context.Context) error {
method profilePath (line 421) | func (d *Devbox) profilePath() (string, error) {
function resetProfileDirForFlakes (line 435) | func resetProfileDirForFlakes(profileDir string) (err error) {
method installPackages (line 465) | func (d *Devbox) installPackages(ctx context.Context, mode installMode) ...
method handleInstallFailure (line 484) | func (d *Devbox) handleInstallFailure(ctx context.Context, mode installM...
method InstallRunXPackages (line 495) | func (d *Devbox) InstallRunXPackages(ctx context.Context) error {
method installNixPackagesToStore (line 516) | func (d *Devbox) installNixPackagesToStore(ctx context.Context, mode ins...
method appendExtraSubstituters (line 579) | func (d *Devbox) appendExtraSubstituters(ctx context.Context, args *nix....
method packagesToInstallInStore (line 627) | func (d *Devbox) packagesToInstallInStore(ctx context.Context, mode inst...
method moveAllowInsecureFromLockfile (line 674) | func (d *Devbox) moveAllowInsecureFromLockfile(writer io.Writer, lockfil...
method FixMissingStorePaths (line 717) | func (d *Devbox) FixMissingStorePaths(ctx context.Context) error {
FILE: internal/devbox/providers/identity/identity.go
function parseAPIToken (line 38) | func parseAPIToken(s string) (ids.APIToken, error) {
function GenSession (line 50) | func GenSession(ctx context.Context) (*session.Token, error) {
function Peek (line 67) | func Peek() (*session.Token, error) {
function AuthClient (line 89) | func AuthClient(redirect string) (*auth.Client, error) {
function getAccessTokenFromAPIToken (line 99) | func getAccessTokenFromAPIToken(
function GetOrgSlug (line 131) | func GetOrgSlug(ctx context.Context) (string, error) {
function IsRefreshTokenError (line 156) | func IsRefreshTokenError(err error) bool {
FILE: internal/devbox/providers/nixcache/nixcache.go
function CachedCredentials (line 65) | func CachedCredentials(ctx context.Context) (AWSCredentials, error) {
function Caches (line 71) | func Caches(
function CachedReadCaches (line 100) | func CachedReadCaches(ctx context.Context) ([]*nixv1alpha1.NixBinCache, ...
function DisableReadCaches (line 104) | func DisableReadCaches() {
function WriteCaches (line 112) | func WriteCaches(
function S3Client (line 127) | func S3Client(
type AWSCredentials (line 154) | type AWSCredentials struct
method Env (line 177) | func (a AWSCredentials) Env() []string {
function newAWSCredentials (line 163) | func newAWSCredentials(proto *nixv1alpha1.AWSCredentials) AWSCredentials {
function getSubOrAccessTokenHash (line 185) | func getSubOrAccessTokenHash(token *session.Token) string {
FILE: internal/devbox/providers/nixcache/setup.go
constant setupKey (line 24) | setupKey = "nixcache-setup"
function IsConfigured (line 26) | func IsConfigured(ctx context.Context) bool {
function Configure (line 36) | func Configure(ctx context.Context) error {
function ConfigureReprompt (line 56) | func ConfigureReprompt(ctx context.Context, username string) error {
type setupTask (line 72) | type setupTask struct
method NeedsRun (line 77) | func (s *setupTask) NeedsRun(ctx context.Context, lastRun setup.RunInf...
method Run (line 106) | func (s *setupTask) Run(ctx context.Context) error {
method updateAWSConfig (line 135) | func (s *setupTask) updateAWSConfig() error {
function propagatedEnv (line 198) | func propagatedEnv() string {
function rootAWSConfigPath (line 243) | func rootAWSConfigPath() (string, error) {
function backupDirectory (line 256) | func backupDirectory(path string) (string, error) {
function devboxExecutable (line 279) | func devboxExecutable() (string, error) {
function sudoExecutable (line 294) | func sudoExecutable() (string, error) {
FILE: internal/devbox/pure_shell.go
function createDevboxSymlink (line 16) | func createDevboxSymlink(d *Devbox) error {
function dotdevboxBinPath (line 35) | func dotdevboxBinPath(d *Devbox) string {
FILE: internal/devbox/pushpull.go
method Pull (line 14) | func (d *Devbox) Pull(ctx context.Context, opts devopt.PullboxOpts) error {
method Push (line 20) | func (d *Devbox) Push(ctx context.Context, opts devopt.PullboxOpts) error {
FILE: internal/devbox/refresh.go
method IsDirenvActive (line 9) | func (d *Devbox) IsDirenvActive() bool {
method isRefreshAliasSet (line 13) | func (d *Devbox) isRefreshAliasSet() bool {
method refreshAliasEnvVar (line 17) | func (d *Devbox) refreshAliasEnvVar() string {
method isGlobal (line 21) | func (d *Devbox) isGlobal() bool {
method RefreshAliasOrCommand (line 29) | func (d *Devbox) RefreshAliasOrCommand() string {
method refreshAliasName (line 37) | func (d *Devbox) refreshAliasName() string {
method refreshCmd (line 44) | func (d *Devbox) refreshCmd() string {
method refreshAlias (line 55) | func (d *Devbox) refreshAlias() string {
method refreshAliasForShell (line 78) | func (d *Devbox) refreshAliasForShell(format string) string {
FILE: internal/devbox/secrets.go
method UninitializedSecrets (line 12) | func (d *Devbox) UninitializedSecrets(ctx context.Context) *envsec.Envsec {
method Secrets (line 26) | func (d *Devbox) Secrets(ctx context.Context) (*envsec.Envsec, error) {
FILE: internal/devbox/services.go
method StartServices (line 15) | func (d *Devbox) StartServices(
method StopServices (line 59) | func (d *Devbox) StopServices(ctx context.Context, runInCurrentShell, al...
method ListServices (line 98) | func (d *Devbox) ListServices(ctx context.Context, runInCurrentShell boo...
method RestartServices (line 136) | func (d *Devbox) RestartServices(
method AttachToProcessManager (line 175) | func (d *Devbox) AttachToProcessManager(ctx context.Context) error {
method StartProcessManager (line 200) | func (d *Devbox) StartProcessManager(
method runDevboxServicesScript (line 272) | func (d *Devbox) runDevboxServicesScript(ctx context.Context, cmdArgs []...
method ShowProcessComposePort (line 277) | func (d *Devbox) ShowProcessComposePort(ctx context.Context, writer io.W...
FILE: internal/devbox/shell.go
type name (line 38) | type name
constant shUnknown (line 41) | shUnknown name = ""
constant shBash (line 42) | shBash name = "bash"
constant shZsh (line 43) | shZsh name = "zsh"
constant shKsh (line 44) | shKsh name = "ksh"
constant shFish (line 45) | shFish name = "fish"
constant shPosix (line 46) | shPosix name = "posix"
type DevboxShell (line 56) | type DevboxShell struct
method Run (line 219) | func (s *DevboxShell) Run() error {
method shellRCOverrides (line 264) | func (s *DevboxShell) shellRCOverrides(shellrc string) (extraEnv map[s...
method writeDevboxShellrc (line 280) | func (s *DevboxShell) writeDevboxShellrc() (path string, err error) {
method setupShellStartupFiles (line 358) | func (s *DevboxShell) setupShellStartupFiles(shellSettingsDir string) {
type ShellOption (line 70) | type ShellOption
method newShell (line 74) | func (d *Devbox) newShell(envOpts devopt.EnvOptions, opts ...ShellOption...
method shellPath (line 91) | func (d *Devbox) shellPath(envOpts devopt.EnvOptions) (path string, err ...
function initShellBinaryFields (line 141) | func initShellBinaryFields(path string) *DevboxShell {
function WithHistoryFile (line 180) | func WithHistoryFile(historyFile string) ShellOption {
function WithEnvVariables (line 187) | func WithEnvVariables(envVariables map[string]string) ShellOption {
function WithProjectDir (line 193) | func WithProjectDir(projectDir string) ShellOption {
function WithShellStartTime (line 199) | func WithShellStartTime(t time.Time) ShellOption {
function rcfilePath (line 207) | func rcfilePath(basename string) string {
function fishConfig (line 215) | func fishConfig() string {
function filterPathList (line 422) | func filterPathList(pathList string, keep func(string) bool) string {
function isFishShell (line 432) | func isFishShell() bool {
FILE: internal/devbox/shell_test.go
function TestWriteDevboxShellrc (line 26) | func TestWriteDevboxShellrc(t *testing.T) {
function testWriteDevboxShellrc (line 34) | func testWriteDevboxShellrc(t *testing.T, testdirs []string) {
function TestShellPath (line 116) | func TestShellPath(t *testing.T) {
function TestInitShellBinaryFields (line 174) | func TestInitShellBinaryFields(t *testing.T) {
function TestSetupShellStartupFiles (line 260) | func TestSetupShellStartupFiles(t *testing.T) {
function TestWriteDevboxShellrcBash (line 312) | func TestWriteDevboxShellrcBash(t *testing.T) {
function TestWriteDevboxShellrcWithZDOTDIR (line 360) | func TestWriteDevboxShellrcWithZDOTDIR(t *testing.T) {
FILE: internal/devbox/shellcmd/command.go
constant CmdArray (line 19) | CmdArray CmdFormat = iota
constant CmdString (line 22) | CmdString
type CmdFormat (line 26) | type CmdFormat
method String (line 28) | func (c CmdFormat) String() string {
type Commands (line 44) | type Commands struct
method AppendScript (line 65) | func (s *Commands) AppendScript(script string) {
method MarshalJSON (line 82) | func (s Commands) MarshalJSON() ([]byte, error) {
method UnmarshalJSON (line 96) | func (s *Commands) UnmarshalJSON(data []byte) error {
method String (line 118) | func (s *Commands) String() string {
FILE: internal/devbox/shellcmd/command_test.go
function TestCommandsUnmarshalString (line 15) | func TestCommandsUnmarshalString(t *testing.T) {
function TestCommandsString (line 102) | func TestCommandsString(t *testing.T) {
function ExampleCommands_AppendScript (line 154) | func ExampleCommands_AppendScript() {
function TestAppendScript (line 176) | func TestAppendScript(t *testing.T) {
FILE: internal/devbox/update.go
method Update (line 23) | func (d *Devbox) Update(ctx context.Context, opts devopt.UpdateOpts) err...
method inputsToUpdate (line 105) | func (d *Devbox) inputsToUpdate(
method updateDevboxPackage (line 125) | func (d *Devbox) updateDevboxPackage(pkg *devpkg.Package) error {
method mergeResolvedPackageToLockfile (line 137) | func (d *Devbox) mergeResolvedPackageToLockfile(
method attemptToUpgradeFlake (line 202) | func (d *Devbox) attemptToUpgradeFlake(pkg *devpkg.Package) error {
function useResolvedPackageInLockfile (line 227) | func useResolvedPackageInLockfile(
FILE: internal/devbox/update_test.go
function TestUpdateNewPackageIsAdded (line 12) | func TestUpdateNewPackageIsAdded(t *testing.T) {
function TestUpdateNewCurrentSysInfoIsAdded (line 30) | func TestUpdateNewCurrentSysInfoIsAdded(t *testing.T) {
function TestUpdateNewSysInfoIsAdded (line 67) | func TestUpdateNewSysInfoIsAdded(t *testing.T) {
function TestUpdateOtherSysInfoIsReplaced (line 126) | func TestUpdateOtherSysInfoIsReplaced(t *testing.T) {
function currentSystem (line 194) | func currentSystem(*testing.T) string {
FILE: internal/devbox/util.go
constant processComposeVersion (line 19) | processComposeVersion = "1.87.0"
function initDevboxUtilityProject (line 23) | func initDevboxUtilityProject(ctx context.Context, stderr io.Writer) err...
function ensureDevboxUtilityConfig (line 48) | func ensureDevboxUtilityConfig() (string, error) {
function utilityLookPath (line 69) | func utilityLookPath(binName string) (string, error) {
function utilityDataPath (line 82) | func utilityDataPath() (string, error) {
function utilityNixProfilePath (line 87) | func utilityNixProfilePath() (string, error) {
function utilityBinPath (line 95) | func utilityBinPath() (string, error) {
FILE: internal/devconfig/config.go
constant errIsDirectory (line 32) | errIsDirectory = syscall.EISDIR
constant errNotDirectory (line 36) | errNotDirectory = syscall.ENOTDIR
type Config (line 39) | type Config struct
method LoadRecursive (line 226) | func (c *Config) LoadRecursive(lockfile *lock.File) error {
method loadRecursive (line 233) | func (c *Config) loadRecursive(
method PackageMutator (line 292) | func (c *Config) PackageMutator() *configfile.PackagesMutator {
method IncludedPluginConfigs (line 296) | func (c *Config) IncludedPluginConfigs() []*plugin.Config {
method Packages (line 315) | func (c *Config) Packages(
method NixPkgsCommitHash (line 347) | func (c *Config) NixPkgsCommitHash() string {
method Env (line 351) | func (c *Config) Env() map[string]string {
method InitHook (line 362) | func (c *Config) InitHook() *shellcmd.Commands {
method Scripts (line 371) | func (c *Config) Scripts() configfile.Scripts {
method Hash (line 380) | func (c *Config) Hash() (string, error) {
method IsEnvsecEnabled (line 397) | func (c *Config) IsEnvsecEnabled() bool {
constant defaultInitHook (line 47) | defaultInitHook = "echo 'Welcome to devbox!' > /dev/null"
function DefaultConfig (line 49) | func DefaultConfig() *Config {
function IsDefault (line 74) | func IsDefault(path string) bool {
function Open (line 89) | func Open(path string) (*Config, error) {
function open (line 103) | func open(path string) (*Config, error) {
function Find (line 124) | func Find(path string) (*Config, error) {
function searchDir (line 143) | func searchDir(dir string) (*Config, error) {
function searchParentDirs (line 170) | func searchParentDirs(path string) (cfg *Config, err error) {
function readFromFile (line 184) | func readFromFile(path string) (*Config, error) {
function LoadConfigFromURL (line 197) | func LoadConfigFromURL(ctx context.Context, url string) (*Config, error) {
function loadBytes (line 215) | func loadBytes(b []byte) (*Config, error) {
function createIncludableFromPluginConfig (line 406) | func createIncludableFromPluginConfig(pluginConfig *plugin.Config) *Conf...
function OSExpandIfPossible (line 417) | func OSExpandIfPossible(env, existingEnv map[string]string) map[string]s...
FILE: internal/devconfig/config_test.go
function TestOpen (line 16) | func TestOpen(t *testing.T) {
function TestOpenError (line 50) | func TestOpenError(t *testing.T) {
function TestFind (line 96) | func TestFind(t *testing.T) {
function TestFindError (line 189) | func TestFindError(t *testing.T) {
function mkNestedDirs (line 283) | func mkNestedDirs(t *testing.T) (root, child, nested string) {
function TestDefault (line 298) | func TestDefault(t *testing.T) {
function TestOSExpandIfPossible (line 331) | func TestOSExpandIfPossible(t *testing.T) {
FILE: internal/devconfig/configfile/ast.go
type configAST (line 35) | type configAST struct
method packagesField (line 67) | func (c *configAST) packagesField(migrate bool) *hujson.ObjectMember {
method appendPackage (line 101) | func (c *configAST) appendPackage(name, version string) {
method appendPackageToObject (line 119) | func (c *configAST) appendPackageToObject(pkgs *hujson.Object, name, v...
method appendPackageToArray (line 133) | func (c *configAST) appendPackageToArray(arr *hujson.Array, versionedN...
method removePackage (line 147) | func (c *configAST) removePackage(name string) {
method removePackageMember (line 159) | func (c *configAST) removePackageMember(pkgs *hujson.Object, name stri...
method removePackageElement (line 167) | func (c *configAST) removePackageElement(arr *hujson.Array, name strin...
method setPackageBool (line 176) | func (c *configAST) setPackageBool(name, fieldName string, val bool) {
method appendPlatforms (line 196) | func (c *configAST) appendPlatforms(name, fieldName string, platforms ...
method appendOutputs (line 204) | func (c *configAST) appendOutputs(name, fieldName string, outputs []st...
method appendAllowInsecure (line 212) | func (c *configAST) appendAllowInsecure(name, fieldName string, whitel...
method removePatch (line 221) | func (c *configAST) removePatch(name string) {
method setPatch (line 250) | func (c *configAST) setPatch(name string, mode PatchMode) {
method findPkgObject (line 285) | func (c *configAST) findPkgObject(name string) *hujson.Object {
method migratePackagesArray (line 302) | func (c *configAST) migratePackagesArray(pkgs *hujson.Value) {
method convertVersionToObject (line 328) | func (c *configAST) convertVersionToObject(pkg *hujson.Value) {
method memberIndex (line 347) | func (*configAST) memberIndex(obj *hujson.Object, name string) int {
method packageElementIndex (line 355) | func (*configAST) packageElementIndex(arr *hujson.Array, name string) ...
method appendStringSliceField (line 369) | func (c *configAST) appendStringSliceField(name, fieldName string, fie...
method beforeComment (line 398) | func (c *configAST) beforeComment(path ...any) []byte {
method createMemberIfMissing (line 430) | func (c *configAST) createMemberIfMissing(key string) *hujson.ObjectMe...
method setEnv (line 462) | func (c *configAST) setEnv(env map[string]string) {
function parseConfig (line 40) | func parseConfig(b []byte) (*configAST, error) {
function joinNameVersion (line 362) | func joinNameVersion(name, version string) string {
function mapToObjectMembers (line 444) | func mapToObjectMembers(env map[string]string) []hujson.ObjectMember {
FILE: internal/devconfig/configfile/env.go
method IsEnvsecEnabled (line 13) | func (c *ConfigFile) IsEnvsecEnabled() bool {
method IsdotEnvEnabled (line 18) | func (c *ConfigFile) IsdotEnvEnabled() bool {
method ParseEnvsFromDotEnv (line 23) | func (c *ConfigFile) ParseEnvsFromDotEnv() (map[string]string, error) {
method SetEnv (line 48) | func (c *ConfigFile) SetEnv(env map[string]string) {
FILE: internal/devconfig/configfile/field.go
method SetStringField (line 10) | func (c *ConfigFile) SetStringField(fieldName, val string) {
method jsonNameOfField (line 19) | func (c *ConfigFile) jsonNameOfField(fieldName string) string {
method setStringField (line 41) | func (c *configAST) setStringField(key, val string) {
FILE: internal/devconfig/configfile/file.go
constant DefaultName (line 23) | DefaultName = "devbox.json"
type ConfigFile (line 27) | type ConfigFile struct
method Bytes (line 76) | func (c *ConfigFile) Bytes() []byte {
method Hash (line 81) | func (c *ConfigFile) Hash() (string, error) {
method Equals (line 90) | func (c *ConfigFile) Equals(other *ConfigFile) bool {
method NixPkgsCommitHash (line 96) | func (c *ConfigFile) NixPkgsCommitHash() string {
method InitHook (line 103) | func (c *ConfigFile) InitHook() *shellcmd.Commands {
method SaveTo (line 111) | func (c *ConfigFile) SaveTo(path string) error {
method Save (line 116) | func (c *ConfigFile) Save() error {
method GetPackage (line 121) | func (c *ConfigFile) GetPackage(versionedName string) (*Package, bool) {
method TopLevelPackages (line 132) | func (c *ConfigFile) TopLevelPackages() []Package {
type shellConfig (line 61) | type shellConfig struct
type NixpkgsConfig (line 67) | type NixpkgsConfig struct
type Stage (line 72) | type Stage struct
function LoadBytes (line 136) | func LoadBytes(b []byte) (*ConfigFile, error) {
function validateConfig (line 156) | func validateConfig(cfg *ConfigFile) error {
function validateScripts (line 172) | func validateScripts(cfg *ConfigFile) error {
function ValidateNixpkg (line 190) | func ValidateNixpkg(cfg *ConfigFile) error {
FILE: internal/devconfig/configfile/file_test.go
function parseConfigTxtarTest (line 30) | func parseConfigTxtarTest(t *testing.T, test string) (in *ConfigFile, wa...
function optBytesToStrings (line 53) | func optBytesToStrings() cmp.Option {
function optParseHujson (line 59) | func optParseHujson() cmp.Option {
function TestNoChanges (line 74) | func TestNoChanges(t *testing.T) {
function TestAddPackageEmptyConfig (line 89) | func TestAddPackageEmptyConfig(t *testing.T) {
function TestAddPackageEmptyConfigWhitespace (line 109) | func TestAddPackageEmptyConfigWhitespace(t *testing.T) {
function TestAddPackageEmptyConfigComment (line 131) | func TestAddPackageEmptyConfigComment(t *testing.T) {
function TestAddPackageNull (line 153) | func TestAddPackageNull(t *testing.T) {
function TestAddPackageObject (line 173) | func TestAddPackageObject(t *testing.T) {
function TestAddPackageObjectComment (line 198) | func TestAddPackageObjectComment(t *testing.T) {
function TestAddPackageEmptyArray (line 225) | func TestAddPackageEmptyArray(t *testing.T) {
function TestAddPackageOneLineArray (line 245) | func TestAddPackageOneLineArray(t *testing.T) {
function TestAddPackageMultiLineArray (line 268) | func TestAddPackageMultiLineArray(t *testing.T) {
function TestAddPackageArrayComments (line 293) | func TestAddPackageArrayComments(t *testing.T) {
function TestRemovePackageObject (line 326) | func TestRemovePackageObject(t *testing.T) {
function TestRemovePackageLastMember (line 351) | func TestRemovePackageLastMember(t *testing.T) {
function TestRemovePackageArray (line 375) | func TestRemovePackageArray(t *testing.T) {
function TestRemovePackageLastElement (line 395) | func TestRemovePackageLastElement(t *testing.T) {
function TestAddPlatforms (line 421) | func TestAddPlatforms(t *testing.T) {
function TestAddPlatformsMigrateArray (line 488) | func TestAddPlatformsMigrateArray(t *testing.T) {
function TestAddPlatformsMigrateArrayComments (line 524) | func TestAddPlatformsMigrateArrayComments(t *testing.T) {
function TestExcludePlatforms (line 561) | func TestExcludePlatforms(t *testing.T) {
function TestSetOutputs (line 593) | func TestSetOutputs(t *testing.T) {
function TestSetOutputsMigrateArray (line 625) | func TestSetOutputsMigrateArray(t *testing.T) {
function TestSetAllowInsecure (line 655) | func TestSetAllowInsecure(t *testing.T) {
function TestSetEnv (line 687) | func TestSetEnv(t *testing.T) {
function TestSetEnvExisting (line 711) | func TestSetEnvExisting(t *testing.T) {
function TestSetEnvClear (line 737) | func TestSetEnvClear(t *testing.T) {
function TestNixpkgsValidation (line 759) | func TestNixpkgsValidation(t *testing.T) {
FILE: internal/devconfig/configfile/packages.go
type PackagesMutator (line 19) | type PackagesMutator struct
method Add (line 27) | func (pkgs *PackagesMutator) Add(versionedName string) {
method Remove (line 37) | func (pkgs *PackagesMutator) Remove(versionedName string) {
method AddPlatforms (line 48) | func (pkgs *PackagesMutator) AddPlatforms(writer io.Writer, versionedn...
method ExcludePlatforms (line 91) | func (pkgs *PackagesMutator) ExcludePlatforms(writer io.Writer, versio...
method UnmarshalJSON (line 128) | func (pkgs *PackagesMutator) UnmarshalJSON(data []byte) error {
method SetPatch (line 158) | func (pkgs *PackagesMutator) SetPatch(versionedName string, mode Patch...
method SetDisablePlugin (line 180) | func (pkgs *PackagesMutator) SetDisablePlugin(versionedName string, v ...
method SetOutputs (line 193) | func (pkgs *PackagesMutator) SetOutputs(writer io.Writer, versionedNam...
method SetAllowInsecure (line 215) | func (pkgs *PackagesMutator) SetAllowInsecure(writer io.Writer, versio...
method index (line 238) | func (pkgs *PackagesMutator) index(name, version string) int {
type PatchMode (line 245) | type PatchMode
method validate (line 262) | func (p PatchMode) validate() error {
constant PatchAuto (line 251) | PatchAuto PatchMode = "auto"
constant PatchAlways (line 256) | PatchAlways PatchMode = "always"
constant PatchNever (line 259) | PatchNever PatchMode = "never"
type Package (line 272) | type Package struct
method IsEnabledOnPlatform (line 310) | func (p *Package) IsEnabledOnPlatform() bool {
method VersionedName (line 328) | func (p *Package) VersionedName() string {
method UnmarshalJSON (line 336) | func (p *Package) UnmarshalJSON(data []byte) error {
function NewVersionOnlyPackage (line 299) | func NewVersionOnlyPackage(name, version string) Package {
function parseVersionedName (line 363) | func parseVersionedName(versionedName string) (name, version string) {
function packagesFromLegacyList (line 376) | func packagesFromLegacyList(packages []string) []Package {
FILE: internal/devconfig/configfile/packages_test.go
function TestJsonifyConfigPackages (line 12) | func TestJsonifyConfigPackages(t *testing.T) {
function diffPackages (line 230) | func diffPackages(t *testing.T, got, want PackagesMutator) string {
function TestParseVersionedName (line 236) | func TestParseVersionedName(t *testing.T) {
FILE: internal/devconfig/configfile/scripts.go
type script (line 9) | type script struct
type Scripts (line 14) | type Scripts
method WithRelativePaths (line 35) | func (s Scripts) WithRelativePaths(projectDir string) Scripts {
method Scripts (line 16) | func (c *ConfigFile) Scripts() Scripts {
FILE: internal/devconfig/init.go
function Init (line 13) | func Init(dir string) (*Config, error) {
FILE: internal/devpkg/narinfo_cache.go
constant binaryCache (line 26) | binaryCache = "https://cache.nixos.org"
constant useDefaultOutputs (line 31) | useDefaultOutputs = "__default_outputs__"
method IsOutputInBinaryCache (line 33) | func (p *Package) IsOutputInBinaryCache(outputName string) (bool, error) {
method IsInBinaryCache (line 46) | func (p *Package) IsInBinaryCache() (bool, error) {
function FillNarInfoCache (line 59) | func FillNarInfoCache(ctx context.Context, packages ...*Package) error {
method areExpectedOutputsInCacheOnce (line 97) | func (p *Package) areExpectedOutputsInCacheOnce(outputName string) (bool...
method fetchNarInfoStatusOnce (line 122) | func (p *Package) fetchNarInfoStatusOnce(
method AreAllOutputsInCache (line 165) | func (p *Package) AreAllOutputsInCache(
method outputsForOutputName (line 191) | func (p *Package) outputsForOutputName(output string) ([]lock.Output, er...
method isEligibleForBinaryCache (line 212) | func (p *Package) isEligibleForBinaryCache() (bool, error) {
method sysInfoIfExists (line 230) | func (p *Package) sysInfoIfExists() (*lock.SystemInfo, error) {
function fetchNarInfoStatusFromHTTP (line 259) | func fetchNarInfoStatusFromHTTP(
function fetchNarInfoStatusFromS3 (line 285) | func fetchNarInfoStatusFromS3(
function readCaches (line 322) | func readCaches(ctx context.Context) ([]string, error) {
function ClearNarInfoCache (line 338) | func ClearNarInfoCache() {
FILE: internal/devpkg/outputs.go
type Output (line 3) | type Output struct
type outputs (line 9) | type outputs struct
method GetNames (line 14) | func (out *outputs) GetNames(pkg *Package) ([]string, error) {
method initDefaultNames (line 32) | func (out *outputs) initDefaultNames(pkg *Package) error {
FILE: internal/devpkg/package.go
type Package (line 36) | type Package struct
method setInstallable (line 184) | func (p *Package) setInstallable(i flake.Installable, projectDir strin...
method FlakeInputName (line 215) | func (p *Package) FlakeInputName() string {
method URLForFlakeInput (line 246) | func (p *Package) URLForFlakeInput() string {
method IsInstallable (line 256) | func (p *Package) IsInstallable() bool {
method Installables (line 262) | func (p *Package) Installables() ([]string, error) {
method InstallableForOutput (line 287) | func (p *Package) InstallableForOutput(output string) (string, error) {
method FlakeInstallable (line 312) | func (p *Package) FlakeInstallable() (flake.Installable, error) {
method urlForInstall (line 322) | func (p *Package) urlForInstall() (string, error) {
method NormalizedDevboxPackageReference (line 329) | func (p *Package) NormalizedDevboxPackageReference() (string, error) {
method PackageAttributePath (line 344) | func (p *Package) PackageAttributePath() (string, error) {
method FullPackageAttributePath (line 355) | func (p *Package) FullPackageAttributePath() (string, error) {
method NormalizedPackageAttributePath (line 370) | func (p *Package) NormalizedPackageAttributePath() (string, error) {
method normalizePackageAttributePath (line 384) | func (p *Package) normalizePackageAttributePath() (string, error) {
method Hash (line 460) | func (p *Package) Hash() string {
method Equals (line 477) | func (p *Package) Equals(other *Package) bool {
method CanonicalName (line 500) | func (p *Package) CanonicalName() string {
method Versioned (line 508) | func (p *Package) Versioned() string {
method IsLegacy (line 515) | func (p *Package) IsLegacy() bool {
method LegacyToVersioned (line 519) | func (p *Package) LegacyToVersioned() string {
method ensureNixpkgsPrefetched (line 539) | func (p *Package) ensureNixpkgsPrefetched(w io.Writer) error {
method version (line 559) | func (p *Package) version() string {
method isVersioned (line 567) | func (p *Package) isVersioned() bool {
method HashFromNixPkgsURL (line 571) | func (p *Package) HashFromNixPkgsURL() string {
method InputAddressedPaths (line 577) | func (p *Package) InputAddressedPaths() ([]string, error) {
method InputAddressedPathForOutput (line 604) | func (p *Package) InputAddressedPathForOutput(output string) (string, ...
method HasAllowInsecure (line 626) | func (p *Package) HasAllowInsecure() bool {
method StoreName (line 634) | func (p *Package) StoreName() (string, error) {
method EnsureUninstallableIsInLockfile (line 646) | func (p *Package) EnsureUninstallableIsInLockfile() error {
method IsRunX (line 656) | func (p *Package) IsRunX() bool {
method IsNix (line 660) | func (p *Package) IsNix() bool {
method RunXPath (line 664) | func (p *Package) RunXPath() string {
method String (line 668) | func (p *Package) String() string {
method LockfileKey (line 675) | func (p *Package) LockfileKey() string {
method DocsURL (line 690) | func (p *Package) DocsURL() string {
method GetOutputNames (line 703) | func (p *Package) GetOutputNames() ([]string, error) {
method GetOutputsWithCache (line 714) | func (p *Package) GetOutputsWithCache() ([]Output, error) {
method GetResolvedStorePaths (line 743) | func (p *Package) GetResolvedStorePaths() ([]string, error) {
method GetStorePaths (line 764) | func (p *Package) GetStorePaths(ctx context.Context, w io.Writer) ([]s...
method ResolvedVersion (line 842) | func (p *Package) ResolvedVersion() (string, error) {
function PackagesFromStringsWithOptions (line 101) | func PackagesFromStringsWithOptions(rawNames []string, l lock.Locker, op...
function PackagesFromConfig (line 109) | func PackagesFromConfig(packages []configfile.Package, l lock.Locker) []...
function PackageFromStringWithDefaults (line 122) | func PackageFromStringWithDefaults(raw string, locker lock.Locker) *Pack...
function PackageFromStringWithOptions (line 126) | func PackageFromStringWithOptions(raw string, locker lock.Locker, opts d...
function newPackage (line 135) | func newPackage(raw string, isInstallable func() bool, locker lock.Locke...
function resolve (line 169) | func resolve(pkg *Package) error {
function pkgNeedsPatch (line 191) | func pkgNeedsPatch(canonicalName string, mode configfile.PatchMode) (pat...
function EnsureNixpkgsPrefetched (line 528) | func EnsureNixpkgsPrefetched(ctx context.Context, w io.Writer, pkgs []*P...
function IsNix (line 682) | func IsNix(p *Package, _ int) bool {
function IsRunX (line 686) | func IsRunX(p *Package, _ int) bool {
constant MissingStorePathsWarning (line 761) | MissingStorePathsWarning = "Outputs for %s are not in lockfile. To fix t...
function packageInstallErrorHandler (line 794) | func packageInstallErrorHandler(err error, pkg *Package, installableOrEm...
FILE: internal/devpkg/package_test.go
constant nixCommitHash (line 18) | nixCommitHash = "hsdafkhsdafhas"
type inputTestCase (line 20) | type inputTestCase struct
function TestInput (line 28) | func TestInput(t *testing.T) {
type testInput (line 100) | type testInput struct
type lockfile (line 104) | type lockfile struct
method ProjectDir (line 108) | func (l *lockfile) ProjectDir() string {
method Stdenv (line 112) | func (l *lockfile) Stdenv() flake.Ref {
method Get (line 121) | func (l *lockfile) Get(pkg string) *lock.Package {
method Resolve (line 125) | func (l *lockfile) Resolve(pkg string) (*lock.Package, error) {
function testInputFromString (line 141) | func testInputFromString(s, projectDir string) *testInput {
function TestHashFromNixPkgsURL (line 145) | func TestHashFromNixPkgsURL(t *testing.T) {
function TestCanonicalName (line 189) | func TestCanonicalName(t *testing.T) {
FILE: internal/devpkg/pkgtype/flake.go
function IsFlake (line 9) | func IsFlake(s string) bool {
function IsAmbiguous (line 26) | func IsAmbiguous(raw string, parsed flake.Installable) bool {
FILE: internal/devpkg/pkgtype/runx.go
constant RunXScheme (line 13) | RunXScheme = "runx"
constant RunXPrefix (line 14) | RunXPrefix = RunXScheme + ":"
constant githubAPITokenVarName (line 15) | githubAPITokenVarName = "GITHUB_TOKEN"
constant oldGithubAPITokenVarName (line 17) | oldGithubAPITokenVarName = "DEVBOX_GITHUB_API_TOKEN"
function IsRunX (line 22) | func IsRunX(s string) bool {
function RunXClient (line 26) | func RunXClient() *runx.RunX {
function RunXRegistry (line 32) | func RunXRegistry(ctx context.Context) (*registry.Registry, error) {
function getGithubToken (line 43) | func getGithubToken() string {
FILE: internal/devpkg/validation.go
method ValidateExists (line 11) | func (p *Package) ValidateExists(ctx context.Context) (bool, error) {
method ValidateInstallsOnSystem (line 32) | func (p *Package) ValidateInstallsOnSystem() (bool, error) {
FILE: internal/envir/env.go
constant DevboxCache (line 7) | DevboxCache = "DEVBOX_CACHE"
constant DevboxGateway (line 8) | DevboxGateway = "DEVBOX_GATEWAY"
constant DevboxLatestVersion (line 11) | DevboxLatestVersion = "DEVBOX_LATEST_VERSION"
constant DevboxRegion (line 12) | DevboxRegion = "DEVBOX_REGION"
constant DevboxSearchHost (line 13) | DevboxSearchHost = "DEVBOX_SEARCH_HOST"
constant DevboxShellEnabled (line 14) | DevboxShellEnabled = "DEVBOX_SHELL_ENABLED"
constant DevboxShellStartTime (line 15) | DevboxShellStartTime = "DEVBOX_SHELL_START_TIME"
constant DevboxVM (line 16) | DevboxVM = "DEVBOX_VM"
constant LauncherVersion (line 18) | LauncherVersion = "LAUNCHER_VERSION"
constant LauncherPath (line 19) | LauncherPath = "LAUNCHER_PATH"
constant GitHubUsername (line 21) | GitHubUsername = "GITHUB_USER_NAME"
constant SSHTTY (line 22) | SSHTTY = "SSH_TTY"
constant XDGDataHome (line 24) | XDGDataHome = "XDG_DATA_HOME"
constant XDGConfigHome (line 25) | XDGConfigHome = "XDG_CONFIG_HOME"
constant XDGCacheHome (line 26) | XDGCacheHome = "XDG_CACHE_HOME"
constant XDGStateHome (line 27) | XDGStateHome = "XDG_STATE_HOME"
constant Env (line 32) | Env = "ENV"
constant Home (line 33) | Home = "HOME"
constant Path (line 34) | Path = "PATH"
constant Shell (line 35) | Shell = "SHELL"
constant User (line 36) | User = "USER"
FILE: internal/envir/util.go
function IsDevboxCloud (line 13) | func IsDevboxCloud() bool {
function IsDevboxShellEnabled (line 17) | func IsDevboxShellEnabled() bool {
function DoNotTrack (line 22) | func DoNotTrack() bool {
function IsInBrowser (line 28) | func IsInBrowser() bool { // TODO: a better name
function IsCI (line 33) | func IsCI() bool {
function GetValueOrDefault (line 40) | func GetValueOrDefault(key, def string) string {
function MapToPairs (line 51) | func MapToPairs(m map[string]string) []string {
function PairsToMap (line 65) | func PairsToMap(pairs []string) map[string]string {
FILE: internal/fileutil/dir.go
function CopyAll (line 16) | func CopyAll(src, dst string) error {
function ClearDir (line 30) | func ClearDir(dir string) error {
function CreateDevboxTempDir (line 49) | func CreateDevboxTempDir() (string, error) {
FILE: internal/fileutil/fileutil.go
function IsDir (line 25) | func IsDir(path string) bool {
function IsFile (line 41) | func IsFile(path string) bool {
function Exists (line 49) | func Exists(path string) bool {
function IsDirEmpty (line 54) | func IsDirEmpty(path string) (bool, error) {
function FileContains (line 63) | func FileContains(path, substring string) (bool, error) {
function EnsureDirExists (line 71) | func EnsureDirExists(path string, perm fs.FileMode, chmod bool) error {
function EnsureAbsolutePaths (line 83) | func EnsureAbsolutePaths(paths []string) ([]string, error) {
FILE: internal/fileutil/fileutil_test.go
function TestIsDirEmpty (line 15) | func TestIsDirEmpty(t *testing.T) {
FILE: internal/fileutil/untar.go
function Untar (line 19) | func Untar(archive io.Reader, destPath string) error {
function untarFile (line 55) | func untarFile(fromFile archives.FileInfo, abs string) error {
FILE: internal/goutil/goutil.go
function PickByKeysSorted (line 6) | func PickByKeysSorted[K comparable, V any](in map[K]V, keys []K) []V {
function GetDefaulted (line 14) | func GetDefaulted[T any](in []T, index int) T {
FILE: internal/goutil/sync.go
type onceValue (line 8) | type onceValue struct
function OnceValueWithContext (line 14) | func OnceValueWithContext[T any](fn func(context.Context) T) *onceValue[...
method Do (line 18) | func (o *onceValue[T]) Do(ctx context.Context) T {
type onceValues (line 25) | type onceValues struct
function OnceValuesWithContext (line 32) | func OnceValuesWithContext[T any](fn func(context.Context) (T, error)) *...
method Do (line 36) | func (o *onceValues[T]) Do(ctx context.Context) (T, error) {
FILE: internal/lock/interfaces.go
type devboxProject (line 8) | type devboxProject interface
type Locker (line 15) | type Locker interface
FILE: internal/lock/lockfile.go
constant lockFileVersion (line 25) | lockFileVersion = "1"
type File (line 28) | type File struct
method Add (line 58) | func (f *File) Add(pkgs ...string) error {
method Remove (line 67) | func (f *File) Remove(pkgs ...string) error {
method Resolve (line 76) | func (f *File) Resolve(pkg string) (*Package, error) {
method Save (line 118) | func (f *File) Save() error {
method UpdateStdenv (line 144) | func (f *File) UpdateStdenv() error {
method Stdenv (line 161) | func (f *File) Stdenv() flake.Ref {
method Get (line 174) | func (f *File) Get(pkg string) *Package {
method HasAllowInsecurePackages (line 182) | func (f *File) HasAllowInsecurePackages() bool {
method Tidy (line 206) | func (f *File) Tidy() {
method IsUpToDateAndInstalled (line 217) | func (f *File) IsUpToDateAndInstalled(isFish bool) (bool, error) {
method SetOutputsForPackage (line 234) | func (f *File) SetOutputsForPackage(pkg string, outputs []Output) error {
method isDirty (line 249) | func (f *File) isDirty() (bool, error) {
function GetFile (line 37) | func GetFile(project devboxProject) (*File, error) {
function IsLegacyPackage (line 193) | func IsLegacyPackage(pkg string) bool {
function lockFilePath (line 265) | func lockFilePath(projectDir string) string {
function ResolveRunXPackage (line 269) | func ResolveRunXPackage(ctx context.Context, pkg string) (types.PkgRef, ...
FILE: internal/lock/package.go
constant nixpkgSource (line 12) | nixpkgSource string = "nixpkg"
constant devboxSearchSource (line 13) | devboxSearchSource string = "devbox-search"
type Package (line 16) | type Package struct
method GetSource (line 55) | func (p *Package) GetSource() string {
method IsAllowInsecure (line 62) | func (p *Package) IsAllowInsecure() bool {
type SystemInfo (line 29) | type SystemInfo struct
method String (line 70) | func (i *SystemInfo) String() string {
method Output (line 74) | func (i *SystemInfo) Output(name string) (Output, error) {
method DefaultOutputs (line 88) | func (i *SystemInfo) DefaultOutputs() []Output {
method Equals (line 111) | func (i *SystemInfo) Equals(other *SystemInfo) bool {
method addOutputFromLegacyStorePath (line 122) | func (i *SystemInfo) addOutputFromLegacyStorePath() {
type Output (line 38) | type Output struct
function ensurePackagesHaveOutputs (line 137) | func ensurePackagesHaveOutputs(packages map[string]*Package) {
FILE: internal/lock/resolve.go
method FetchResolvedPackage (line 31) | func (f *File) FetchResolvedPackage(pkg string) (*Package, error) {
function resolveV2 (line 98) | func resolveV2(ctx context.Context, name, version string) (*Package, err...
function selectForSystem (line 151) | func selectForSystem[V any](systems map[string]V) (v V, err error) {
function buildLockSystemInfos (line 164) | func buildLockSystemInfos(pkg *searcher.PackageVersion) (map[string]*Sys...
function lockFlake (line 210) | func lockFlake(ctx context.Context, ref flake.Ref) (flake.Ref, error) {
FILE: internal/lock/statehash.go
type stateHashFile (line 23) | type stateHashFile struct
type UpdateStateHashFileArgs (line 34) | type UpdateStateHashFileArgs struct
function UpdateAndSaveStateHashFile (line 42) | func UpdateAndSaveStateHashFile(args UpdateStateHashFileArgs) error {
function SetIgnoreShellMismatch (line 53) | func SetIgnoreShellMismatch(ignore bool) {
function isStateUpToDate (line 57) | func isStateUpToDate(args UpdateStateHashFileArgs) (bool, error) {
function readStateHashFile (line 74) | func readStateHashFile(projectDir string) (*stateHashFile, error) {
function getCurrentStateHash (line 86) | func getCurrentStateHash(args UpdateStateHashFileArgs) (*stateHashFile, ...
function stateHashFilePath (line 114) | func stateHashFilePath(projectDir string) string {
function manifestHash (line 118) | func manifestHash(profileDir string) (string, error) {
function printDevEnvCacheHash (line 122) | func printDevEnvCacheHash(profileDir string) (string, error) {
function getLockfileHash (line 126) | func getLockfileHash(projectDir string) (string, error) {
FILE: internal/nix/build.go
type BuildArgs (line 13) | type BuildArgs struct
function Build (line 21) | func Build(ctx context.Context, args *BuildArgs, installables ...string)...
FILE: internal/nix/cache.go
function CopyInstallableToCache (line 10) | func CopyInstallableToCache(
FILE: internal/nix/command.go
function init (line 5) | func init() {
function appendArgs (line 19) | func appendArgs[E any](args Args, new []E) Args {
function allowUnfreeEnv (line 26) | func allowUnfreeEnv(curEnv []string) []string {
function allowInsecureEnv (line 30) | func allowInsecureEnv(curEnv []string) []string {
FILE: internal/nix/config.go
type Config (line 23) | type Config struct
method IsUserTrusted (line 60) | func (c Config) IsUserTrusted(ctx context.Context, username string) (b...
type ConfigField (line 33) | type ConfigField struct
function CurrentConfig (line 38) | func CurrentConfig(ctx context.Context) (Config, error) {
function IncludeDevboxConfig (line 109) | func IncludeDevboxConfig(ctx context.Context, username string) error {
function appendConfigInclude (line 128) | func appendConfigInclude(srcPath, includePath string) (appended bool, er...
FILE: internal/nix/config_test.go
function TestConfigIsUserTrusted (line 9) | func TestConfigIsUserTrusted(t *testing.T) {
FILE: internal/nix/eval.go
function EvalPackageName (line 10) | func EvalPackageName(path string) (string, error) {
function PackageIsInsecure (line 20) | func PackageIsInsecure(path string) bool {
function PackageKnownVulnerabilities (line 35) | func PackageKnownVulnerabilities(path string) []string {
function Eval (line 53) | func Eval(path string) ([]byte, error) {
function IsInsecureAllowed (line 58) | func IsInsecureAllowed() bool {
FILE: internal/nix/flake.go
constant flakeCacheTTL (line 12) | flakeCacheTTL = time.Hour * 24 * 30
type FlakeMetadata (line 16) | type FlakeMetadata struct
function ResolveFlake (line 25) | func ResolveFlake(ctx context.Context, ref flake.Ref) (FlakeMetadata, er...
function ResolveCachedFlake (line 39) | func ResolveCachedFlake(ctx context.Context, ref flake.Ref) (FlakeMetada...
function ClearFlakeCache (line 49) | func ClearFlakeCache(ref flake.Ref) error {
FILE: internal/nix/install.go
function BinaryInstalled (line 24) | func BinaryInstalled() bool {
function dirExistsAndIsNotEmpty (line 28) | func dirExistsAndIsNotEmpty(dir string) bool {
function Ensured (line 35) | func Ensured() bool {
function EnsureNixInstalled (line 39) | func EnsureNixInstalled(ctx context.Context, writer io.Writer, withDaemo...
FILE: internal/nix/install_test.go
function TestDirExistsAndIsNotEmpty (line 15) | func TestDirExistsAndIsNotEmpty(t *testing.T) {
FILE: internal/nix/instance.go
type NixInstance (line 9) | type NixInstance struct
type Nixer (line 11) | type Nixer interface
FILE: internal/nix/nix.go
constant ProfilePath (line 33) | ProfilePath = ".devbox/nix/profile/default"
type PrintDevEnvOut (line 35) | type PrintDevEnvOut struct
type Variable (line 39) | type Variable struct
type PrintDevEnvArgs (line 44) | type PrintDevEnvArgs struct
method PrintDevEnv (line 52) | func (*NixInstance) PrintDevEnv(ctx context.Context, args *PrintDevEnvAr...
function savePrintDevEnvCache (line 103) | func savePrintDevEnvCache(path string, out PrintDevEnvOut) error {
function FlakeNixpkgs (line 115) | func FlakeNixpkgs(commit string) string {
function ExperimentalFlags (line 121) | func ExperimentalFlags() []string {
function SystemIsLinux (line 129) | func SystemIsLinux() bool {
function EnsureValidPlatform (line 147) | func EnsureValidPlatform(platforms ...string) error {
function ProfileBinPath (line 167) | func ProfileBinPath(projectDir string) string {
function IsExitErrorInsecurePackage (line 171) | func IsExitErrorInsecurePackage(err error, pkgNameOrEmpty, installableOr...
function parseInsecurePackagesFromExitError (line 205) | func parseInsecurePackagesFromExitError(errorMsg string) []string {
function restartDaemon (line 233) | func restartDaemon(ctx context.Context) error {
function FixInstallableArgs (line 269) | func FixInstallableArgs(args []string) {
function FixInstallableArg (line 290) | func FixInstallableArg(arg string) string {
FILE: internal/nix/nix_test.go
function TestParseInsecurePackagesFromExitError (line 7) | func TestParseInsecurePackagesFromExitError(t *testing.T) {
FILE: internal/nix/nixpkgs.go
function EnsureNixpkgsPrefetched (line 24) | func EnsureNixpkgsPrefetched(w io.Writer, commit string) error {
function nixpkgsCommitFileContents (line 58) | func nixpkgsCommitFileContents() (map[string]string, error) {
function saveToNixpkgsCommitFile (line 73) | func saveToNixpkgsCommitFile(commit string, commitToLocation map[string]...
function nixpkgsCommitFilePath (line 108) | func nixpkgsCommitFilePath() string {
function IsGithubNixpkgsURL (line 119) | func IsGithubNixpkgsURL(url string) bool {
function HashFromNixPkgsURL (line 127) | func HashFromNixPkgsURL(url string) string {
FILE: internal/nix/nixprofile/item.go
type NixProfileListItem (line 14) | type NixProfileListItem struct
method AttributePath (line 42) | func (i *NixProfileListItem) AttributePath() (string, error) {
method Matches (line 61) | func (i *NixProfileListItem) Matches(pkg *devpkg.Package, locker lock....
method MatchesUnlockedReference (line 81) | func (i *NixProfileListItem) MatchesUnlockedReference(installable stri...
method addedByStorePath (line 85) | func (i *NixProfileListItem) addedByStorePath() bool {
method String (line 90) | func (i *NixProfileListItem) String() string {
method StorePaths (line 99) | func (i *NixProfileListItem) StorePaths() []string {
method NameOrIndex (line 106) | func (i *NixProfileListItem) NameOrIndex() string {
FILE: internal/nix/nixprofile/profile.go
function ProfileListItems (line 23) | func ProfileListItems(
function profileListLegacy (line 88) | func profileListLegacy(
type ProfileListNameOrIndexArgs (line 122) | type ProfileListNameOrIndexArgs struct
function ProfileListNameOrIndex (line 134) | func ProfileListNameOrIndex(args *ProfileListNameOrIndexArgs) (string, e...
function parseNixProfileListItemLegacy (line 177) | func parseNixProfileListItemLegacy(line string) (*NixProfileListItem, er...
FILE: internal/nix/nixprofile/profile_test.go
type expectedTestData (line 12) | type expectedTestData struct
function TestNixProfileListItemLegacy (line 21) | func TestNixProfileListItemLegacy(t *testing.T) {
function testItem (line 73) | func testItem(t *testing.T, line string, expected expectedTestData) {
FILE: internal/nix/nixprofile/upgrade.go
function ProfileUpgrade (line 14) | func ProfileUpgrade(ProfileDir string, pkg *devpkg.Package, lock *lock.F...
FILE: internal/nix/profiles.go
function ProfileList (line 21) | func ProfileList(writer io.Writer, profilePath string, useJSON bool) (st...
type ProfileInstallArgs (line 33) | type ProfileInstallArgs struct
function ProfileInstall (line 41) | func ProfileInstall(ctx context.Context, args *ProfileInstallArgs) error {
function ProfileRemove (line 72) | func ProfileRemove(profilePath string, packageNames ...string) error {
type manifest (line 86) | type manifest struct
function readManifest (line 92) | func readManifest(profilePath string) (manifest, error) {
constant DefaultPriority (line 134) | DefaultPriority = 5
function nextPriority (line 136) | func nextPriority(profilePath string) string {
FILE: internal/nix/run.go
function RunScript (line 17) | func RunScript(projectDir, cmdWithArgs string, env map[string]string) er...
FILE: internal/nix/search.go
type PkgInfo (line 22) | type PkgInfo struct
method String (line 31) | func (i *PkgInfo) String() string {
function Search (line 35) | func Search(url string) (map[string]*PkgInfo, error) {
function parseSearchResults (line 44) | func parseSearchResults(data []byte) map[string]*PkgInfo {
function PkgExistsForAnySystem (line 63) | func PkgExistsForAnySystem(pkg string) bool {
function searchSystem (line 88) | func searchSystem(url, system string) (map[string]*PkgInfo, error) {
function SearchNixpkgsAttribute (line 128) | func SearchNixpkgsAttribute(query string) (map[string]*PkgInfo, error) {
function cacheKey (line 168) | func cacheKey(query string) string {
FILE: internal/nix/search_test.go
function TestSearchCacheKey (line 8) | func TestSearchCacheKey(t *testing.T) {
function TestAllowableQuery (line 33) | func TestAllowableQuery(t *testing.T) {
function TestParseSearchResults (line 65) | func TestParseSearchResults(t *testing.T) {
FILE: internal/nix/shim.go
constant Version2_12 (line 12) | Version2_12 = nix.Version2_12
constant Version2_13 (line 13) | Version2_13 = nix.Version2_13
constant Version2_14 (line 14) | Version2_14 = nix.Version2_14
constant Version2_15 (line 15) | Version2_15 = nix.Version2_15
constant Version2_16 (line 16) | Version2_16 = nix.Version2_16
constant Version2_17 (line 17) | Version2_17 = nix.Version2_17
constant Version2_18 (line 18) | Version2_18 = nix.Version2_18
constant Version2_19 (line 19) | Version2_19 = nix.Version2_19
constant Version2_20 (line 20) | Version2_20 = nix.Version2_20
constant Version2_21 (line 21) | Version2_21 = nix.Version2_21
constant Version2_22 (line 22) | Version2_22 = nix.Version2_22
constant Version2_23 (line 23) | Version2_23 = nix.Version2_23
constant Version2_24 (line 24) | Version2_24 = nix.Version2_24
constant Version2_25 (line 25) | Version2_25 = nix.Version2_25
constant MinVersion (line 27) | MinVersion = nix.Version2_18
function AtLeast (line 40) | func AtLeast(version string) bool { return nix.AtLeast(vers...
function Command (line 41) | func Command(args ...any) *Cmd { return nix.Command(args...
function SourceProfile (line 42) | func SourceProfile() (sourced bool, err error) { return nix.SourceProfil...
function System (line 43) | func System() string { return nix.System() }
function Version (line 44) | func Version() string { return nix.Version() }
FILE: internal/nix/store.go
function StorePathFromHashPart (line 19) | func StorePathFromHashPart(ctx context.Context, hash, storeAddr string) ...
function StorePathsFromInstallable (line 28) | func StorePathsFromInstallable(ctx context.Context, installable string, ...
function StorePathsAreInStore (line 54) | func StorePathsAreInStore(ctx context.Context, storePaths []string) (map...
type LegacyPathInfo (line 70) | type LegacyPathInfo struct
function parseStorePathFromInstallableOutput (line 78) | func parseStorePathFromInstallableOutput(output []byte) (map[string]bool...
type DaemonError (line 105) | type DaemonError struct
method Error (line 111) | func (e *DaemonError) Error() string {
method Unwrap (line 118) | func (e *DaemonError) Unwrap() error {
method Redact (line 122) | func (e *DaemonError) Redact() string {
function DaemonVersion (line 132) | func DaemonVersion(ctx context.Context) (string, error) {
FILE: internal/nix/store_test.go
function TestParseStorePathFromInstallableOutput (line 9) | func TestParseStorePathFromInstallableOutput(t *testing.T) {
FILE: internal/nix/storepath.go
type StorePathParts (line 12) | type StorePathParts struct
function NewStorePathParts (line 23) | func NewStorePathParts(path string) StorePathParts {
FILE: internal/nix/storepath_test.go
function TestStorePathParts (line 7) | func TestStorePathParts(t *testing.T) {
FILE: internal/nix/upgrade.go
function ProfileUpgrade (line 14) | func ProfileUpgrade(ProfileDir, indexOrName string) error {
function FlakeUpdate (line 22) | func FlakeUpdate(ProfileDir string) error {
FILE: internal/nix/writer.go
type PackageInstallWriter (line 19) | type PackageInstallWriter struct
method Write (line 23) | func (fw *PackageInstallWriter) Write(p []byte) (n int, err error) {
method ignore (line 36) | func (*PackageInstallWriter) ignore(line string) bool {
FILE: internal/patchpkg/builder.go
type DerivationBuilder (line 27) | type DerivationBuilder struct
method init (line 62) | func (d *DerivationBuilder) init() error {
method Build (line 95) | func (d *DerivationBuilder) Build(ctx context.Context, pkgStorePath st...
method build (line 105) | func (d *DerivationBuilder) build(ctx context.Context, pkg, out *packa...
method restoreMissingRefs (line 154) | func (d *DerivationBuilder) restoreMissingRefs(ctx context.Context, pk...
method copyDir (line 185) | func (d *DerivationBuilder) copyDir(out *packageFS, path string) error {
method copyFile (line 193) | func (d *DerivationBuilder) copyFile(ctx context.Context, pkg, out *pa...
method copySymlink (line 251) | func (d *DerivationBuilder) copySymlink(pkg, out *packageFS, path stri...
method needsGlibcPatch (line 263) | func (d *DerivationBuilder) needsGlibcPatch(file *bufio.Reader, filePa...
method findRemovedRefs (line 280) | func (d *DerivationBuilder) findRemovedRefs(ctx context.Context, pkg *...
method findCUDA (line 325) | func (d *DerivationBuilder) findCUDA(ctx context.Context, out *package...
function NewDerivationBuilder (line 54) | func NewDerivationBuilder() (*DerivationBuilder, error) {
type packageFS (line 393) | type packageFS struct
method Readlink (line 407) | func (p *packageFS) Readlink(path string) (string, error) {
method OSPath (line 418) | func (p *packageFS) OSPath(path string) (string, error) {
function newPackageFS (line 399) | func newPackageFS(storePath string) *packageFS {
function allFiles (line 428) | func allFiles(fsys fs.FS, root string) iter.Seq2[string, fs.DirEntry] {
function lookPath (line 452) | func lookPath(prog string) string {
function isExecutable (line 460) | func isExecutable(mode fs.FileMode) bool { return mode&0o111 != 0 }
function isSymlink (line 461) | func isSymlink(mode fs.FileMode) bool { return mode&fs.ModeSymlink !=...
FILE: internal/patchpkg/elf.go
type SharedLibrary (line 59) | type SharedLibrary struct
method CopyAndLink (line 163) | func (lib SharedLibrary) CopyAndLink(dir string) error {
method LogValue (line 210) | func (lib SharedLibrary) LogValue() slog.Value {
function OpenSharedLibrary (line 82) | func OpenSharedLibrary(name string) (SharedLibrary, error) {
function FindSharedLibrary (line 121) | func FindSharedLibrary(name string, searchPath ...string) iter.Seq[Share...
FILE: internal/patchpkg/patch.go
type libPatcher (line 16) | type libPatcher struct
method setGlibc (line 30) | func (p *libPatcher) setGlibc(pkg *packageFS) error {
method setGcc (line 70) | func (p *libPatcher) setGcc(pkg *packageFS) error {
method prependRPATH (line 96) | func (p *libPatcher) prependRPATH(libPkg *packageFS) {
method patch (line 121) | func (p *libPatcher) patch(ctx context.Context, path, outPath string) ...
type patchelf (line 152) | type patchelf struct
method run (line 165) | func (p *patchelf) run(ctx context.Context, elf string) ([]byte, error) {
FILE: internal/patchpkg/search.go
constant maxFileSize (line 18) | maxFileSize = 1 << 30
type fileSlice (line 25) | type fileSlice struct
method String (line 31) | func (f fileSlice) String() string {
function searchFile (line 38) | func searchFile(fsys fs.FS, path string, re *regexp.Regexp) ([]fileSlice...
function searchEnv (line 77) | func searchEnv(re *regexp.Regexp) string {
function searchGlobs (line 90) | func searchGlobs(patterns []string) iter.Seq[string] {
function globEscape (line 114) | func globEscape(s string) string {
FILE: internal/plugin/files.go
function getConfigIfAny (line 17) | func getConfigIfAny(inc Includable, projectDir string) (*Config, error) {
function getBuiltinPluginConfigIfExists (line 43) | func getBuiltinPluginConfigIfExists(
function GetBuiltinsForPackages (line 60) | func GetBuiltinsForPackages(
FILE: internal/plugin/git.go
type gitPlugin (line 16) | type gitPlugin struct
method getBaseURL (line 73) | func (p *gitPlugin) getBaseURL() string {
method Fetch (line 81) | func (p *gitPlugin) Fetch() ([]byte, error) {
method cloneAndRead (line 89) | func (p *gitPlugin) cloneAndRead(subpath string) ([]byte, error) {
method CanonicalName (line 178) | func (p *gitPlugin) CanonicalName() string {
method Hash (line 184) | func (p *gitPlugin) Hash() string {
method FileContent (line 188) | func (p *gitPlugin) FileContent(subpath string) ([]byte, error) {
method LockfileKey (line 192) | func (p *gitPlugin) LockfileKey() string {
function newGitPlugin (line 23) | func newGitPlugin(ref flake.Ref) (*gitPlugin, error) {
function generateGitPluginName (line 36) | func generateGitPluginName(ref flake.Ref) string {
function isSSHURL (line 148) | func isSSHURL(url string) bool {
function isBranchName (line 165) | func isBranchName(ref string) bool {
FILE: internal/plugin/git_test.go
function TestGitPlugin (line 12) | func TestGitPlugin(t *testing.T) {
function TestGenerateGitPluginName (line 147) | func TestGenerateGitPluginName(t *testing.T) {
function TestGitPluginURL (line 223) | func TestGitPluginURL(t *testing.T) {
function TestIsBranchName (line 302) | func TestIsBranchName(t *testing.T) {
function TestIsSSHURL (line 345) | func TestIsSSHURL(t *testing.T) {
FILE: internal/plugin/github.go
type githubPlugin (line 25) | type githubPlugin struct
method Fetch (line 52) | func (p *githubPlugin) Fetch() ([]byte, error) {
method CanonicalName (line 60) | func (p *githubPlugin) CanonicalName() string {
method Hash (line 64) | func (p *githubPlugin) Hash() string {
method FileContent (line 68) | func (p *githubPlugin) FileContent(subpath string) ([]byte, error) {
method url (line 134) | func (p *githubPlugin) url(subpath string) (string, error) {
method request (line 147) | func (p *githubPlugin) request(contentURL string) (*http.Request, erro...
method LockfileKey (line 169) | func (p *githubPlugin) LockfileKey() string {
function newGithubPlugin (line 34) | func newGithubPlugin(ref flake.Ref) (*githubPlugin, error) {
function getRedactedAuthHeader (line 173) | func getRedactedAuthHeader(req *http.Request) string {
FILE: internal/plugin/github_test.go
function TestNewGithubPlugin (line 13) | func TestNewGithubPlugin(t *testing.T) {
function newGithubPluginForTest (line 92) | func newGithubPluginForTest(include string) (*githubPlugin, error) {
function TestGithubPluginAuth (line 107) | func TestGithubPluginAuth(t *testing.T) {
function TestGetRedactedAuthHeader (line 140) | func TestGetRedactedAuthHeader(t *testing.T) {
FILE: internal/plugin/includable.go
type Includable (line 12) | type Includable interface
function parseIncludable (line 19) | func parseIncludable(includableRef, workingDir string) (Includable, erro...
type fetcher (line 36) | type fetcher interface
function getPluginNameFromContent (line 46) | func getPluginNameFromContent(plugin fetcher) (string, error) {
FILE: internal/plugin/includes.go
function LoadConfigFromInclude (line 10) | func LoadConfigFromInclude(include string, lockfile *lock.File, workingD...
FILE: internal/plugin/info.go
function Readme (line 19) | func Readme(ctx context.Context,
function printReadme (line 62) | func printReadme(cfg *Config, w io.Writer, markdown bool) error {
function printServices (line 76) | func printServices(cfg *Config, pkg *devpkg.Package, w io.Writer, markdo...
function printCreateFiles (line 106) | func printCreateFiles(cfg *Config, w io.Writer, markdown bool) error {
function printEnv (line 127) | func printEnv(cfg *Config, w io.Writer, markdown bool) error {
function printInfoInstructions (line 146) | func printInfoInstructions(pkg string, w io.Writer) error {
FILE: internal/plugin/local.go
type LocalPlugin (line 13) | type LocalPlugin struct
method Fetch (line 29) | func (l *LocalPlugin) Fetch() ([]byte, error) {
method CanonicalName (line 37) | func (l *LocalPlugin) CanonicalName() string {
method IsLocal (line 41) | func (l *LocalPlugin) IsLocal() bool {
method Hash (line 45) | func (l *LocalPlugin) Hash() string {
method FileContent (line 49) | func (l *LocalPlugin) FileContent(subpath string) ([]byte, error) {
method LockfileKey (line 53) | func (l *LocalPlugin) LockfileKey() string {
method Path (line 57) | func (l *LocalPlugin) Path() string {
function newLocalPlugin (line 19) | func newLocalPlugin(ref flake.Ref, pluginDir string) (*LocalPlugin, erro...
function addFilenameIfMissing (line 68) | func addFilenameIfMissing(s string) string {
FILE: internal/plugin/manager.go
type Manager (line 10) | type Manager struct
method ApplyOptions (line 41) | func (m *Manager) ApplyOptions(opts ...managerOption) {
type devboxProject (line 16) | type devboxProject interface
type managerOption (line 21) | type managerOption
function NewManager (line 23) | func NewManager(opts ...managerOption) *Manager {
function WithLockfile (line 29) | func WithLockfile(lockfile *lock.File) managerOption {
function WithDevbox (line 35) | func WithDevbox(provider devboxProject) managerOption {
FILE: internal/plugin/plugin.go
constant devboxDirName (line 29) | devboxDirName = "devbox.d"
constant devboxHiddenDirName (line 30) | devboxHiddenDirName = ".devbox"
constant pluginConfigName (line 31) | pluginConfigName = "plugin.json"
type Config (line 39) | type Config struct
method ProcessComposeYaml (line 57) | func (c *Config) ProcessComposeYaml() (string, string) {
method Services (line 66) | func (c *Config) Services() (services.Services, error) {
method Description (line 254) | func (c *Config) Description() string {
type PluginOnlyData (line 44) | type PluginOnlyData struct
method CreateFilesForConfig (line 73) | func (m *Manager) CreateFilesForConfig(cfg *Config) error {
method UpdateLockfileVersion (line 111) | func (m *Manager) UpdateLockfileVersion(cfg *Config) error {
method createFile (line 123) | func (m *Manager) createFile(
function buildConfig (line 178) | func buildConfig(pkg Includable, projectDir, content string) (*Config, e...
function jsonPurifyPluginContent (line 204) | func jsonPurifyPluginContent(content []byte) ([]byte, error) {
function createDir (line 208) | func createDir(path string) error {
function createSymlink (line 215) | func createSymlink(root, filePath string) error {
method shouldCreateFile (line 233) | func (m *Manager) shouldCreateFile(
FILE: internal/plugin/rm.go
function Remove (line 14) | func Remove(projectDir string, pkgs []string) error {
function RemoveInvalidSymlinks (line 23) | func RemoveInvalidSymlinks(projectDir string) error {
FILE: internal/plugin/services.go
function GetServices (line 13) | func GetServices(configs []*Config) (services.Services, error) {
FILE: internal/plugin/update.go
function Update (line 3) | func Update() error {
FILE: internal/pullbox/config.go
method IsTextDevboxConfig (line 17) | func (p *pullbox) IsTextDevboxConfig() bool {
method pullTextDevboxConfig (line 27) | func (p *pullbox) pullTextDevboxConfig(ctx context.Context) error {
method isLocalConfig (line 48) | func (p *pullbox) isLocalConfig() bool {
FILE: internal/pullbox/download.go
function download (line 13) | func download(url string) ([]byte, error) {
FILE: internal/pullbox/files.go
method copyToProfile (line 20) | func (p *pullbox) copyToProfile(src string) error {
function profileIsNotEmpty (line 60) | func profileIsNotEmpty(path string) (bool, error) {
function isModifiedConfig (line 74) | func isModifiedConfig(path string) bool {
function urlIsArchive (line 82) | func urlIsArchive(url string) (bool, error) {
FILE: internal/pullbox/git/git.go
function CloneToTmp (line 15) | func CloneToTmp(repo string) (string, error) {
function IsRepoURL (line 27) | func IsRepoURL(url string) bool {
function clone (line 33) | func clone(repo, dir string) error {
FILE: internal/pullbox/git/push.go
constant nothingToCommitErrorText (line 17) | nothingToCommitErrorText = "nothing to commit"
function Push (line 19) | func Push(ctx context.Context, dir, url string) error {
function cloneGitHistory (line 42) | func cloneGitHistory(url, dst string) error {
function createCommit (line 49) | func createCommit(dir string) error {
function push (line 65) | func push(dir string) error {
FILE: internal/pullbox/pullbox.go
type devboxProject (line 23) | type devboxProject interface
type pullbox (line 27) | type pullbox struct
method Pull (line 41) | func (p *pullbox) Pull(ctx context.Context) error {
method Push (line 104) | func (p *pullbox) Push(ctx context.Context) error {
function New (line 32) | func New(devbox devboxProject, opts devopt.PullboxOpts) *pullbox {
FILE: internal/pullbox/s3/config.go
constant roleArn (line 17) | roleArn = "arn:aws:iam::984256416385:role/JetpackS3Federated"
constant bucket (line 18) | bucket = "devbox.sh"
constant region (line 22) | region = "us-east-2"
function assumeRole (line 25) | func assumeRole(ctx context.Context, c *devopt.Credentials) (*aws.Config...
FILE: internal/pullbox/s3/pull.go
function PullToTmp (line 23) | func PullToTmp(
FILE: internal/pullbox/s3/push.go
function Push (line 20) | func Push(
FILE: internal/pullbox/tar/tar.go
function Extract (line 19) | func Extract(data []byte) (string, error) {
function Compress (line 54) | func Compress(dir string) (string, error) {
FILE: internal/redact/redact.go
function Error (line 72) | func Error(err error) error {
function Errorf (line 123) | func Errorf(format string, a ...any) error {
type redactor (line 164) | type redactor interface
type safe (line 169) | type safe struct
function Safe (line 172) | func Safe(a any) any {
type safeError (line 177) | type safeError struct
method Error (line 183) | func (e *safeError) Error() string { return e.err.Error() }
method Redact (line 184) | func (e *safeError) Redact() string { return e.redacted.Error() }
method Unwrap (line 185) | func (e *safeError) Unwrap() error { return e.err }
method StackTrace (line 187) | func (e *safeError) StackTrace() []runtime.Frame {
method Format (line 203) | func (e *safeError) Format(f fmt.State, verb rune) {
type redactedError (line 220) | type redactedError struct
method Error (line 225) | func (e *redactedError) Error() string { return e.msg }
method Unwrap (line 226) | func (e *redactedError) Unwrap() error { return e.wrapped }
type formatter (line 231) | type formatter
method Format (line 233) | func (f formatter) Format(s fmt.State, verb rune) {
function placeholder (line 239) | func placeholder(a any) string {
FILE: internal/redact/redact_test.go
function ExampleError (line 16) | func ExampleError() {
function ExampleErrorf (line 30) | func ExampleErrorf() {
function ExampleError_wrapped (line 45) | func ExampleError_wrapped() {
function TestNil (line 61) | func TestNil(t *testing.T) {
function TestSimple (line 66) | func TestSimple(t *testing.T) {
function TestSimpleWrapSimple (line 72) | func TestSimpleWrapSimple(t *testing.T) {
function TestRedactor (line 82) | func TestRedactor(t *testing.T) {
function TestRedactorWrapRedactor (line 88) | func TestRedactorWrapRedactor(t *testing.T) {
function TestSimpleWrapRedactor (line 105) | func TestSimpleWrapRedactor(t *testing.T) {
function TestNestedWrapRedactor (line 118) | func TestNestedWrapRedactor(t *testing.T) {
function TestErrorf (line 135) | func TestErrorf(t *testing.T) {
function TestErrorfWrapErrorf (line 147) | func TestErrorfWrapErrorf(t *testing.T) {
function TestErrorfAs (line 154) | func TestErrorfAs(t *testing.T) {
function TestErrorfRedactableArg (line 180) | func TestErrorfRedactableArg(t *testing.T) {
function TestErrorFormat (line 186) | func TestErrorFormat(t *testing.T) {
function TestStackTrace (line 228) | func TestStackTrace(t *testing.T) {
function TestMissingStackTrace (line 252) | func TestMissingStackTrace(t *testing.T) {
type testRedactor (line 260) | type testRedactor struct
method Error (line 266) | func (e *testRedactor) Error() string { return e.msg }
method Redact (line 267) | func (e *testRedactor) Redact() string { return e.redactedMsg }
method Unwrap (line 268) | func (e *testRedactor) Unwrap() error { return e.err }
type customError (line 270) | type customError struct
method Error (line 275) | func (e *customError) Error() string {
type redactableInt (line 279) | type redactableInt
method Redact (line 281) | func (r redactableInt) Redact() string {
function checkUnredactedError (line 285) | func checkUnredactedError(t *testing.T, got error, wantMsg string) {
function checkRedactedError (line 294) | func checkRedactedError(t *testing.T, got error, wantMsg string) {
FILE: internal/searcher/client.go
constant searchAPIEndpoint (line 21) | searchAPIEndpoint = "https://search.devbox.sh"
type client (line 25) | type client struct
method Search (line 35) | func (c *client) Search(ctx context.Context, query string) (*SearchRes...
method Resolve (line 51) | func (c *client) Resolve(name, version string) (*PackageVersion, error) {
method ResolveV2 (line 69) | func (c *client) ResolveV2(ctx context.Context, name, version string) ...
function Client (line 29) | func Client() *client {
function execGet (line 90) | func execGet[T any](ctx context.Context, url string) (*T, error) {
FILE: internal/searcher/model.go
type SearchResults (line 12) | type SearchResults struct
type Package (line 17) | type Package struct
type PackageVersion (line 23) | type PackageVersion struct
type PackageInfo (line 30) | type PackageInfo struct
type ResolveResponse (line 46) | type ResolveResponse struct
FILE: internal/searcher/parse.go
function ParseVersionedPackage (line 12) | func ParseVersionedPackage(versionedName string) (name, version string, ...
FILE: internal/searcher/parse_test.go
function TestParseVersionedPackage (line 7) | func TestParseVersionedPackage(t *testing.T) {
FILE: internal/services/client.go
type Process (line 20) | type Process struct
function StartServices (line 31) | func StartServices(ctx context.Context, w io.Writer, serviceName, projec...
function StopServices (line 48) | func StopServices(ctx context.Context, serviceName, projectDir string, w...
function RestartServices (line 65) | func RestartServices(ctx context.Context, serviceName, projectDir string...
function ListServices (line 82) | func ListServices(ctx context.Context, projectDir string, w io.Writer) (...
function clientRequest (line 116) | func clientRequest(path, method, projectDir string) (string, int, error) {
FILE: internal/services/config.go
function FromUserProcessCompose (line 18) | func FromUserProcessCompose(projectDir, userProcessCompose string) Servi...
function FromProcessCompose (line 32) | func FromProcessCompose(path string) (Services, error) {
function NamesFromProcessCompose (line 51) | func NamesFromProcessCompose(content []byte) ([]string, error) {
function lookupProcessCompose (line 63) | func lookupProcessCompose(projectDir, path string) string {
FILE: internal/services/manager.go
constant processComposeLogfile (line 26) | processComposeLogfile = ".devbox/compose.log"
constant fileLockTimeout (line 27) | fileLockTimeout = 5 * time.Second
type instance (line 30) | type instance struct
type globalProcessComposeConfig (line 37) | type globalProcessComposeConfig struct
type ProcessComposeOpts (line 43) | type ProcessComposeOpts struct
function newGlobalProcessComposeConfig (line 50) | func newGlobalProcessComposeConfig() *globalProcessComposeConfig {
function globalProcessComposeJSONPath (line 54) | func globalProcessComposeJSONPath() (string, error) {
function readGlobalProcessComposeJSON (line 59) | func readGlobalProcessComposeJSON(file *os.File) *globalProcessComposeCo...
function writeGlobalProcessComposeJSON (line 70) | func writeGlobalProcessComposeJSON(config *globalProcessComposeConfig, f...
function openGlobalConfigFile (line 88) | func openGlobalConfigFile() (*os.File, error) {
function StartProcessManager (line 107) | func StartProcessManager(
function runProcessManagerInForeground (line 174) | func runProcessManagerInForeground(cmd *exec.Cmd, config *globalProcessC...
function runProcessManagerInBackground (line 216) | func runProcessManagerInBackground(cmd *exec.Cmd, config *globalProcessC...
function StopProcessManager (line 255) | func StopProcessManager(ctx context.Context, projectDir string, w io.Wri...
function StopAllProcessManagers (line 285) | func StopAllProcessManagers(ctx context.Context, w io.Writer) error {
function AttachToProcessManager (line 313) | func AttachToProcessManager(ctx context.Context, w io.Writer, projectDir...
function ProcessManagerIsRunning (line 337) | func ProcessManagerIsRunning(projectDir string) bool {
function GetProcessManagerPort (line 363) | func GetProcessManagerPort(projectDir string) (int, error) {
function lockFile (line 379) | func lockFile(file *os.File) error {
FILE: internal/services/ports.go
function getAvailablePort (line 37) | func getAvailablePort() (int, error) {
function selectPort (line 60) | func selectPort(configPort int) (int, error) {
function isAllowed (line 79) | func isAllowed(port int) bool {
function isPortAvailable (line 83) | func isPortAvailable(port int) (int, error) {
FILE: internal/services/services.go
type Services (line 6) | type Services
type Service (line 8) | type Service struct
FILE: internal/services/status.go
type updateFunc (line 26) | type updateFunc
type ListenerOpts (line 28) | type ListenerOpts struct
function ListenToChanges (line 35) | func ListenToChanges(ctx context.Context, opts *ListenerOpts) error {
function listenToEvents (line 58) | func listenToEvents(watcher *fsnotify.Watcher, opts *ListenerOpts) {
function cloudFilePath (line 90) | func cloudFilePath(projectDir string) string {
function initCloudDir (line 95) | func initCloudDir(projectDir, hostID string) error {
type ServiceStatus (line 106) | type ServiceStatus struct
function writeServiceStatusFile (line 113) | func writeServiceStatusFile(path string, status *ServiceStatus) error {
function updateServiceStatusOnRemote (line 123) | func updateServiceStatusOnRemote(projectDir string, s *ServiceStatus) er...
function readServiceStatus (line 136) | func readServiceStatus(path string) (*ServiceStatus, error) {
FILE: internal/setup/setup.go
type ctxKey (line 36) | type ctxKey
type Task (line 44) | type Task interface
type RunInfo (line 58) | type RunInfo struct
type TaskStatus (line 71) | type TaskStatus
constant TaskDone (line 78) | TaskDone TaskStatus = iota
constant TaskNeedsRun (line 81) | TaskNeedsRun
constant TaskUserRefused (line 85) | TaskUserRefused
constant TaskError (line 89) | TaskError
constant TaskSudoing (line 93) | TaskSudoing
function Status (line 97) | func Status(ctx context.Context, key string, task Task) TaskStatus {
function Run (line 118) | func Run(ctx context.Context, key string, task Task) error {
function SudoDevbox (line 144) | func SudoDevbox(ctx context.Context, arg ...string) (ran bool, err error) {
function ConfirmRun (line 217) | func ConfirmRun(ctx context.Context, key string, task Task, prompt strin...
function run (line 236) | func run(ctx context.Context, key string, task Task, prompt string) error {
function Reset (line 282) | func Reset(key string) {
type state (line 293) | type state struct
type confirmPrompt (line 298) | type confirmPrompt struct
function loadState (line 304) | func loadState(key string) state {
function saveState (line 323) | func saveState(key string, s state) {
function statePath (line 360) | func statePath(key string) string {
function taskError (line 366) | func taskError(key string, err error) error {
function devboxExecutable (line 375) | func devboxExecutable() (string, error) {
function isSudo (line 389) | func isSudo(key string) bool {
FILE: internal/setup/setup_test.go
type testTask (line 11) | type testTask struct
method Run (line 16) | func (t *testTask) Run(ctx context.Context) error {
method NeedsRun (line 20) | func (t *testTask) NeedsRun(ctx context.Context, lastRun RunInfo) bool {
function TestTaskNeedsRunTrue (line 24) | func TestTaskNeedsRunTrue(t *testing.T) {
function TestTaskNeedsRunFalse (line 47) | func TestTaskNeedsRunFalse(t *testing.T) {
function TestTaskLastRun (line 70) | func TestTaskLastRun(t *testing.T) {
function TestTaskConfirmPromptAllow (line 100) | func TestTaskConfirmPromptAllow(t *testing.T) {
function TestTaskConfirmPromptDeny (line 115) | func TestTaskConfirmPromptDeny(t *testing.T) {
function TestSudoDevbox (line 141) | func TestSudoDevbox(t *testing.T) {
function tempXDGStateDir (line 199) | func tempXDGStateDir(t *testing.T) {
function setPromptResponse (line 204) | func setPromptResponse(t *testing.T, a any) {
FILE: internal/shellgen/flake_input.go
type flakeInput (line 19) | type flakeInput struct
method HashFromNixPkgsURL (line 25) | func (f *flakeInput) HashFromNixPkgsURL() string {
method URLWithCaching (line 29) | func (f *flakeInput) URLWithCaching() string {
method PkgImportName (line 36) | func (f *flakeInput) PkgImportName() string {
method BuildInputsForSymlinkJoin (line 48) | func (f *flakeInput) BuildInputsForSymlinkJoin() ([]*SymlinkJoin, erro...
method BuildInputs (line 97) | func (f *flakeInput) BuildInputs() ([]string, error) {
type SymlinkJoin (line 40) | type SymlinkJoin struct
function flakeInputs (line 145) | func flakeInputs(ctx context.Context, packages []*devpkg.Package) []flak...
type keyedSlice (line 199) | type keyedSlice struct
method getOrAppend (line 207) | func (k *keyedSlice) getOrAppend(key string) *flakeInput {
function needsSymlinkJoin (line 222) | func needsSymlinkJoin(pkg *devpkg.Package) (bool, error) {
FILE: internal/shellgen/flake_plan.go
type flakePlan (line 22) | type flakePlan struct
method needsGlibcPatch (line 55) | func (f *flakePlan) needsGlibcPatch() bool {
function newFlakePlan (line 29) | func newFlakePlan(ctx context.Context, devbox devboxer) (*flakePlan, err...
type glibcPatchFlake (line 64) | type glibcPatchFlake struct
method addInput (line 148) | func (g *glibcPatchFlake) addInput(pkg *devpkg.Package) error {
method addOutput (line 162) | func (g *glibcPatchFlake) addOutput(pkg *devpkg.Package) error {
method addDependency (line 191) | func (g *glibcPatchFlake) addDependency(pkg *devpkg.Package) error {
method systemRelativeAttrPath (line 220) | func (g *glibcPatchFlake) systemRelativeAttrPath(pkg *devpkg.Package) ...
method inputRelativeAttrPath (line 234) | func (g *glibcPatchFlake) inputRelativeAttrPath(pkg *devpkg.Package) (...
method fetchClosureExpr (line 244) | func (g *glibcPatchFlake) fetchClosureExpr(pkg *devpkg.Package) (strin...
method copySystemCUDALib (line 261) | func (g *glibcPatchFlake) copySystemCUDALib(flakeDir string) error {
method writeTo (line 299) | func (g *glibcPatchFlake) writeTo(dir string) error {
method LogValue (line 319) | func (g *glibcPatchFlake) LogValue() slog.Value {
function newGlibcPatchFlake (line 93) | func newGlibcPatchFlake(nixpkgs flake.Ref, packages []*devpkg.Package) (...
FILE: internal/shellgen/flake_plan_test.go
type lockMock (line 13) | type lockMock struct
method Get (line 15) | func (l *lockMock) Get(key string) *lock.Package {
method Stdenv (line 19) | func (l *lockMock) Stdenv() flake.Ref {
method ProjectDir (line 23) | func (l *lockMock) ProjectDir() string {
method Resolve (line 27) | func (l *lockMock) Resolve(key string) (*lock.Package, error) {
function TestNewGlibcPatchFlake (line 33) | func TestNewGlibcPatchFlake(t *testing.T) {
FILE: internal/shellgen/generate.go
function GenerateForPrintEnv (line 29) | func GenerateForPrintEnv(ctx context.Context, devbox devboxer) error {
function writeFromTemplate (line 73) | func writeFromTemplate(path string, plan any, tmplName, generatedName st...
function overwriteFileIfChanged (line 106) | func overwriteFileIfChanged(path string, data []byte, perm os.FileMode) ...
function overwriteFile (line 146) | func overwriteFile(f *os.File, data []byte, offset int) error {
function toJSON (line 155) | func toJSON(a any) string {
function makeFlakeFile (line 169) | func makeFlakeFile(d devboxer, plan *flakePlan) error {
FILE: internal/shellgen/generate_test.go
function TestWriteFromTemplate (line 26) | func TestWriteFromTemplate(t *testing.T) {
function cmpGoldenFile (line 57) | func cmpGoldenFile(t *testing.T, gotPath, wantGoldenPath string) {
type lockmock (line 124) | type lockmock struct
method Resolve (line 126) | func (*lockmock) Resolve(pkg string) (*lock.Package, error) {
method Get (line 133) | func (*lockmock) Get(pkg string) *lock.Package { return nil }
method Stdenv (line 134) | func (*lockmock) Stdenv() flake.Ref { return flake.Ref{} }
method ProjectDir (line 135) | func (*lockmock) ProjectDir() string { return "" }
FILE: internal/shellgen/nixpkgs.go
type NixpkgsInfo (line 16) | type NixpkgsInfo struct
function getNixpkgsInfo (line 21) | func getNixpkgsInfo(commitHash string) *NixpkgsInfo {
function nixpkgsMirrorURL (line 33) | func nixpkgsMirrorURL(commitHash string) string {
FILE: internal/shellgen/path.go
function genPath (line 8) | func genPath(d devboxer) string {
function FlakePath (line 12) | func FlakePath(d devboxer) string {
FILE: internal/shellgen/scripts.go
constant scriptsDir (line 26) | scriptsDir = ".devbox/gen/scripts"
constant HooksFilename (line 28) | HooksFilename = ".hooks"
type devboxer (line 30) | type devboxer interface
function WriteScriptsToFiles (line 41) | func WriteScriptsToFiles(devbox devboxer) error {
function writeRawInitHookFile (line 90) | func writeRawInitHookFile(devbox devboxer, body string) (err error) {
function WriteScriptFile (line 101) | func WriteScriptFile(devbox devboxer, name, body string) (err error) {
function createScriptFile (line 116) | func createScriptFile(devbox devboxer, name string) (script *os.File, er...
function ScriptPath (line 135) | func ScriptPath(projectDir, scriptName string) string {
function ScriptBody (line 139) | func ScriptBody(d devboxer, body string) (string, error) {
FILE: internal/telemetry/segment.go
function initSegmentClient (line 24) | func initSegmentClient() bool {
function newTrackMessage (line 37) | func newTrackMessage(name string, meta Metadata) *segment.Track {
function bufferSegmentMessage (line 95) | func bufferSegmentMessage(id string, msg segment.Message) {
type shellAccessKind (line 99) | type shellAccessKind
constant local (line 102) | local shellAccessKind = "local"
constant ssh (line 103) | ssh shellAccessKind = "ssh"
constant browser (line 104) | browser shellAccessKind = "browser"
function shellAccess (line 107) | func shellAccess() shellAccessKind {
FILE: internal/telemetry/sentry.go
function initSentryClient (line 25) | func initSentryClient(appName string) bool {
function newSentryException (line 54) | func newSentryException(errToLog error) []sentry.Exception {
function newSentryStack (line 114) | func newSentryStack(frames []runtime.Frame, binPkg, modPath string) *sen...
function exportedErrType (line 153) | func exportedErrType(err error) string {
function splitPkgFunc (line 170) | func splitPkgFunc(name string) (pkgPath, funcName string) {
function bufferSentryEvent (line 189) | func bufferSentryEvent(event *sentry.Event) {
FILE: internal/telemetry/telemetry.go
constant appName (line 38) | appName = "devbox"
type EventName (line 40) | type EventName
constant EventCommandSuccess (line 43) | EventCommandSuccess EventName = iota
constant EventShellInteractive (line 44) | EventShellInteractive
constant EventShellReady (line 45) | EventShellReady
constant EventNixBuildSuccess (line 46) | EventNixBuildSuccess
constant EventNixBuildWithSubstitutersFailed (line 47) | EventNixBuildWithSubstitutersFailed
function Start (line 60) | func Start() {
function userID (line 71) | func userID() string {
function orgID (line 88) | func orgID() string {
function Stop (line 98) | func Stop() {
function Event (line 111) | func Event(e EventName, meta Metadata) {
function commandEvent (line 134) | func commandEvent(meta Metadata) (id string, msg *segment.Track) {
function Error (line 141) | func Error(err error, meta Metadata) {
type Metadata (line 200) | type Metadata struct
method cmdContext (line 217) | func (m *Metadata) cmdContext() map[string]any {
method envContext (line 228) | func (m *Metadata) envContext() map[string]any {
method featureContext (line 243) | func (m *Metadata) featureContext() map[string]any {
method pkgContext (line 255) | func (m *Metadata) pkgContext() map[string]any {
function Upload (line 279) | func Upload() {
function restoreEvents (line 310) | func restoreEvents[E any](dir string) []E {
function bufferEvent (line 340) | func bufferEvent(file string, event any) {
function newEventID (line 359) | func newEventID() string {
function ShellStart (line 371) | func ShellStart() time.Time {
function FormatShellStart (line 375) | func FormatShellStart(t time.Time) string {
function ParseShellStart (line 382) | func ParseShellStart(s string) time.Time {
FILE: internal/telemetry/telemetry_test.go
function TestErrorBasic (line 10) | func TestErrorBasic(t *testing.T) {
FILE: internal/templates/template.go
function InitFromName (line 23) | func InitFromName(w io.Writer, template, target string) error {
function InitFromRepo (line 31) | func InitFromRepo(w io.Writer, repo, subdir, target string) error {
function List (line 69) | func List(w io.Writer, showAll bool) {
function createDirAndEnsureEmpty (line 82) | func createDirAndEnsureEmpty(dir string) error {
function ParseRepoURL (line 99) | func ParseRepoURL(repo string) (string, error) {
FILE: internal/templates/templates_test.go
function TestTemplatesExist (line 14) | func TestTemplatesExist(t *testing.T) {
function TestParseRepoURL (line 31) | func TestParseRepoURL(t *testing.T) {
FILE: internal/ux/messages.go
function Fsuccess (line 21) | func Fsuccess(w io.Writer, a ...any) {
function Fsuccessf (line 26) | func Fsuccessf(w io.Writer, format string, a ...any) {
function Finfo (line 31) | func Finfo(w io.Writer, a ...any) {
function Finfof (line 36) | func Finfof(w io.Writer, format string, a ...any) {
function Fwarning (line 41) | func Fwarning(w io.Writer, a ...any) {
function Fwarningf (line 46) | func Fwarningf(w io.Writer, format string, a ...any) {
function Ferror (line 51) | func Ferror(w io.Writer, a ...any) {
function Ferrorf (line 56) | func Ferrorf(w io.Writer, format string, a ...any) {
type ctxKey (line 64) | type ctxKey
function HideMessage (line 66) | func HideMessage(ctx context.Context, format string) context.Context {
function FHidableWarning (line 70) | func FHidableWarning(ctx context.Context, w io.Writer, format string, a ...
function isHidden (line 77) | func isHidden(ctx context.Context, format string) bool {
FILE: internal/vercheck/vercheck.go
constant expectedLauncherVersion (line 31) | expectedLauncherVersion = "v0.2.2"
constant envName (line 36) | envName = "__DEVBOX_VERSION_CHECK"
function CheckVersion (line 59) | func CheckVersion(w io.Writer, commandPath string) {
function SelfUpdate (line 103) | func SelfUpdate(stdOut, stdErr io.Writer) error {
function selfUpdateLauncher (line 111) | func selfUpdateLauncher(stdOut, stdErr io.Writer) error {
function selfUpdateDevbox (line 149) | func selfUpdateDevbox(stdErr io.Writer) error {
type updatedVersions (line 166) | type updatedVersions struct
function triggerUpdate (line 174) | func triggerUpdate(stdErr io.Writer) (*updatedVersions, error) {
function printSuccessMessage (line 205) | func printSuccessMessage(w io.Writer, toolName, oldVersion, newVersion s...
function launcherVersionNotice (line 218) | func launcherVersionNotice() string {
function devboxVersionNotice (line 230) | func devboxVersionNotice() string {
function isNewLauncherAvailable (line 243) | func isNewLauncherAvailable() bool {
function isNewDevboxAvailable (line 252) | func isNewDevboxAvailable() bool {
function currentLauncherVersion (line 262) | func currentLauncherVersion() string {
function removeCurrentVersionFile (line 270) | func removeCurrentVersionFile() error {
function SemverCompare (line 288) | func SemverCompare(ver1, ver2 string) int {
function latestVersion (line 299) | func latestVersion() string {
FILE: internal/vercheck/vercheck_test.go
function TestCheckVersion (line 15) | func TestCheckVersion(t *testing.T) {
FILE: internal/xdg/xdg.go
function DataSubpath (line 13) | func DataSubpath(subpath string) string {
function ConfigSubpath (line 17) | func ConfigSubpath(subpath string) string {
function CacheSubpath (line 21) | func CacheSubpath(subpath string) string {
function StateSubpath (line 25) | func StateSubpath(subpath string) string {
function dataDir (line 29) | func dataDir() string { return resolveDir(envir.XDGDataHome, ".local/s...
function configDir (line 30) | func configDir() string { return resolveDir(envir.XDGConfigHome, ".confi...
function cacheDir (line 31) | func cacheDir() string { return resolveDir(envir.XDGCacheHome, ".cache") }
function stateDir (line 32) | func stateDir() string { return resolveDir(envir.XDGStateHome, ".local/...
function resolveDir (line 34) | func resolveDir(envvar, defaultPath string) string {
FILE: nix/command.go
type Cmd (line 27) | type Cmd struct
method CombinedOutput (line 70) | func (c *Cmd) CombinedOutput(ctx context.Context) ([]byte, error) {
method Output (line 81) | func (c *Cmd) Output(ctx context.Context) ([]byte, error) {
method Run (line 92) | func (c *Cmd) Run(ctx context.Context) error {
method LogValue (line 103) | func (c *Cmd) LogValue() slog.Value {
method String (line 139) | func (c *Cmd) String() string {
method initExecCommand (line 143) | func (c *Cmd) initExecCommand(ctx context.Context) *exec.Cmd {
method error (line 199) | func (c *Cmd) error(ctx context.Context, err error) error {
method stderrExcerpt (line 240) | func (*Cmd) stderrExcerpt(stderr []byte) string {
method logger (line 271) | func (c *Cmd) logger() *slog.Logger {
method logRunFunc (line 282) | func (c *Cmd) logRunFunc(ctx context.Context) func() {
method Command (line 53) | func (n *Nix) Command(args ...any) *Cmd {
type Args (line 302) | type Args
method StringSlice (line 305) | func (a Args) StringSlice() []string {
method String (line 315) | func (a Args) String() string {
method writeQuoted (line 333) | func (Args) writeQuoted(dst *strings.Builder, str string) {
type cmdError (line 361) | type cmdError struct
method Redact (line 366) | func (c *cmdError) Redact() string {
method Error (line 370) | func (c *cmdError) Error() string {
method Unwrap (line 374) | func (c *cmdError) Unwrap() error {
FILE: nix/flake/flakeref.go
constant TypeIndirect (line 17) | TypeIndirect = "indirect"
constant TypePath (line 18) | TypePath = "path"
constant TypeFile (line 19) | TypeFile = "file"
constant TypeGit (line 20) | TypeGit = "git"
constant TypeGitHub (line 21) | TypeGitHub = "github"
constant TypeTarball (line 22) | TypeTarball = "tarball"
type Ref (line 36) | type Ref struct
method Locked (line 307) | func (r Ref) Locked() bool {
method String (line 351) | func (r Ref) String() string {
method IsNixpkgs (line 473) | func (r Ref) IsNixpkgs() bool {
function ParseRef (line 97) | func ParseRef(ref string) (Ref, error) {
function parseURLRef (line 123) | func parseURLRef(ref string) (parsed Ref, fragment string, err error) {
function parseGitHubRef (line 256) | func parseGitHubRef(refURL *url.URL, parsed *Ref) error {
function isGitHash (line 484) | func isGitHash(s string) bool {
function isArchive (line 498) | func isArchive(path string) bool {
function splitPathOrOpaque (line 515) | func splitPathOrOpaque(u *url.URL, n int) ([]string, error) {
function buildEscapedPath (line 544) | func buildEscapedPath(elem ...string) string {
function appendQueryString (line 554) | func appendQueryString(query url.Values, keyval ...string) string {
function itoaOmitZero (line 577) | func itoaOmitZero(i int64) string {
function atoiOmitZero (line 585) | func atoiOmitZero(s string) (int64, error) {
constant DefaultOutputs (line 596) | DefaultOutputs = ""
constant AllOutputs (line 599) | AllOutputs = "*"
type Installable (line 621) | type Installable struct
method SplitOutputs (line 678) | func (fi Installable) SplitOutputs() []string {
method String (line 706) | func (fi Installable) String() string {
function ParseInstallable (line 647) | func ParseInstallable(raw string) (Installable, error) {
function splitOutputSpec (line 731) | func splitOutputSpec(s string) (before, after string) {
FILE: nix/flake/flakeref_test.go
function TestParseFlakeRef (line 9) | func TestParseFlakeRef(t *testing.T) {
function TestParseFlakeRefError (line 140) | func TestParseFlakeRefError(t *testing.T) {
function TestFlakeRefString (line 208) | func TestFlakeRefString(t *testing.T) {
function TestParseFlakeInstallable (line 279) | func TestParseFlakeInstallable(t *testing.T) {
function TestFlakeInstallableString (line 329) | func TestFlakeInstallableString(t *testing.T) {
function TestBuildQueryString (line 398) | func TestBuildQueryString(t *testing.T) {
FILE: nix/install.go
type Installer (line 15) | type Installer struct
method Download (line 23) | func (i *Installer) Download(ctx context.Context) error {
method Run (line 74) | func (i *Installer) Run(ctx context.Context) error {
function writeTempFile (line 111) | func writeTempFile(r io.Reader) (path string, err error) {
FILE: nix/nix.go
function Command (line 28) | func Command(args ...any) *Cmd {
function System (line 33) | func System() string {
function Version (line 38) | func Version() string {
function AtLeast (line 45) | func AtLeast(version string) bool {
type Nix (line 52) | type Nix struct
method resolvePath (line 73) | func (n *Nix) resolvePath() (string, error) {
method logger (line 109) | func (n *Nix) logger() *slog.Logger {
method System (line 118) | func (n *Nix) System() string {
method Version (line 125) | func (n *Nix) Version() string {
method Info (line 133) | func (n *Nix) Info() (Info, error) {
constant Version2_12 (line 160) | Version2_12 = "2.12.0"
constant Version2_13 (line 161) | Version2_13 = "2.13.0"
constant Version2_14 (line 162) | Version2_14 = "2.14.0"
constant Version2_15 (line 163) | Version2_15 = "2.15.0"
constant Version2_16 (line 164) | Version2_16 = "2.16.0"
constant Version2_17 (line 165) | Version2_17 = "2.17.0"
constant Version2_18 (line 166) | Version2_18 = "2.18.0"
constant Version2_19 (line 167) | Version2_19 = "2.19.0"
constant Version2_20 (line 168) | Version2_20 = "2.20.0"
constant Version2_21 (line 169) | Version2_21 = "2.21.0"
constant Version2_22 (line 170) | Version2_22 = "2.22.0"
constant Version2_23 (line 171) | Version2_23 = "2.23.0"
constant Version2_24 (line 172) | Version2_24 = "2.24.0"
constant Version2_25 (line 173) | Version2_25 = "2.25.0"
constant MinVersion (line 175) | MinVersion = Version2_18
type Info (line 190) | type Info struct
method AtLeast (line 291) | func (i Info) AtLeast(version string) bool {
function parseInfo (line 230) | func parseInfo(data []byte) (Info, error) {
function SourceProfile (line 319) | func SourceProfile() (sourced bool, err error) {
function profileSourced (line 388) | func profileSourced() bool {
function profilePaths (line 398) | func profilePaths() []string {
FILE: nix/nix_test.go
function TestParseVersionInfo (line 9) | func TestParseVersionInfo(t *testing.T) {
function TestParseLixVersionInfo (line 57) | func TestParseLixVersionInfo(t *testing.T) {
function TestParseVersionInfoShort (line 105) | func TestParseVersionInfoShort(t *testing.T) {
function TestParseVersionInfoError (line 133) | func TestParseVersionInfoError(t *testing.T) {
function TestVersionInfoAtLeast (line 154) | func TestVersionInfoAtLeast(t *testing.T) {
FILE: pkg/autodetect/autodetect.go
function InitConfig (line 10) | func InitConfig(ctx context.Context, path string) error {
function DryRun (line 23) | func DryRun(ctx context.Context, path string) ([]byte, error) {
function populateConfig (line 31) | func populateConfig(ctx context.Context, path string, config *devconfig....
function detectors (line 47) | func detectors(path string) []detector.Detector {
function packages (line 57) | func packages(ctx context.Context, path string) ([]string, error) {
function env (line 65) | func env(ctx context.Context, path string) (map[string]string, error) {
function relevantDetector (line 76) | func relevantDetector(path string) (detector.Detector, error) {
FILE: pkg/autodetect/detector/detector.go
type Detector (line 5) | type Detector interface
FILE: pkg/autodetect/detector/go.go
type GoDetector (line 10) | type GoDetector struct
method Relevance (line 16) | func (d *GoDetector) Relevance(path string) (float64, error) {
method Packages (line 28) | func (d *GoDetector) Packages(ctx context.Context) ([]string, error) {
method Env (line 41) | func (d *GoDetector) Env(ctx context.Context) (map[string]string, erro...
function parseGoVersion (line 45) | func parseGoVersion(goModContent string) string {
FILE: pkg/autodetect/detector/go_test.go
function TestGoDetectorRelevance (line 11) | func TestGoDetectorRelevance(t *testing.T) {
function TestGoDetectorPackages (line 31) | func TestGoDetectorPackages(t *testing.T) {
function TestParseGoVersion (line 65) | func TestParseGoVersion(t *testing.T) {
FILE: pkg/autodetect/detector/nodejs.go
type packageJSON (line 11) | type packageJSON struct
type NodeJSDetector (line 17) | type NodeJSDetector struct
method Init (line 24) | func (d *NodeJSDetector) Init() error {
method Relevance (line 33) | func (d *NodeJSDetector) Relevance(path string) (float64, error) {
method Packages (line 40) | func (d *NodeJSDetector) Packages(ctx context.Context) ([]string, erro...
method Env (line 44) | func (d *NodeJSDetector) Env(ctx context.Context) (map[string]string, ...
method nodeVersion (line 48) | func (d *NodeJSDetector) nodeVersion(ctx context.Context) string {
function loadPackageJSON (line 63) | func loadPackageJSON(root string) (*packageJSON, error) {
FILE: pkg/autodetect/detector/nodejs_test.go
function TestNodeJSDetector_Relevance (line 13) | func TestNodeJSDetector_Relevance(t *testing.T) {
function TestNodeJSDetector_Packages (line 101) | func TestNodeJSDetector_Packages(t *testing.T) {
function TestNodeJSDetector_Env (line 108) | func TestNodeJSDetector_Env(t *testing.T) {
FILE: pkg/autodetect/detector/php.go
type composerJSON (line 15) | type composerJSON struct
type PHPDetector (line 19) | type PHPDetector struct
method Init (line 26) | func (d *PHPDetector) Init() error {
method Relevance (line 35) | func (d *PHPDetector) Relevance(path string) (float64, error) {
method Packages (line 42) | func (d *PHPDetector) Packages(ctx context.Context) ([]string, error) {
method Env (line 52) | func (d *PHPDetector) Env(ctx context.Context) (map[string]string, err...
method phpVersion (line 56) | func (d *PHPDetector) phpVersion(ctx context.Context) string {
method phpExtensions (line 72) | func (d *PHPDetector) phpExtensions(ctx context.Context) ([]string, er...
function loadComposerJSON (line 103) | func loadComposerJSON(root string) (*composerJSON, error) {
FILE: pkg/autodetect/detector/php_test.go
function TestPHPDetector_Relevance (line 13) | func TestPHPDetector_Relevance(t *testing.T) {
function TestPHPDetector_Packages (line 67) | func TestPHPDetector_Packages(t *testing.T) {
function TestPHPDetector_PHPExtensions (line 150) | func TestPHPDetector_PHPExtensions(t *testing.T) {
FILE: pkg/autodetect/detector/poetry.go
type PoetryDetector (line 14) | type PoetryDetector struct
method Relevance (line 21) | func (d *PoetryDetector) Relevance(path string) (float64, error) {
method Packages (line 33) | func (d *PoetryDetector) Packages(ctx context.Context) ([]string, erro...
method Env (line 61) | func (d *PoetryDetector) Env(ctx context.Context) (map[string]string, ...
method maxRelevance (line 86) | func (d *PoetryDetector) maxRelevance() float64 {
function determineBestVersion (line 65) | func determineBestVersion(ctx context.Context, pkg, version string) stri...
function sanitizeVersion (line 80) | func sanitizeVersion(version string) string {
FILE: pkg/autodetect/detector/python.go
type PythonDetector (line 9) | type PythonDetector struct
method Relevance (line 15) | func (d *PythonDetector) Relevance(path string) (float64, error) {
method Packages (line 27) | func (d *PythonDetector) Packages(ctx context.Context) ([]string, erro...
method Env (line 31) | func (d *PythonDetector) Env(ctx context.Context) (map[string]string, ...
method maxRelevance (line 35) | func (d *PythonDetector) maxRelevance() float64 {
FILE: plugins/builtins.go
function Builtins (line 15) | func Builtins() ([]fs.DirEntry, error) {
type BuiltIn (line 25) | type BuiltIn struct
method FileContent (line 54) | func (f *BuiltIn) FileContent(contentPath string) ([]byte, error) {
function BuiltInForPackage (line 45) | func BuiltInForPackage(pkgName string) ([]byte, error) {
FILE: plugins/builtins_test.go
function TestBuiltInMap (line 7) | func TestBuiltInMap(t *testing.T) {
FILE: testscripts/testrunner/assert.go
function assertPathLength (line 18) | func assertPathLength(script *testscript.TestScript, neg bool, args []st...
function assertDevboxJSONPackagesContains (line 38) | func assertDevboxJSONPackagesContains(script *testscript.TestScript, neg...
function assertDevboxLockPackagesContains (line 63) | func assertDevboxLockPackagesContains(script *testscript.TestScript, neg...
function assertJSONSuperset (line 88) | func assertJSONSuperset(script *testscript.TestScript, neg bool, args []...
function assertPathOrder (line 125) | func assertPathOrder(script *testscript.TestScript, neg bool, args []str...
function containsInOrder (line 138) | func containsInOrder(subpaths, expected []string) bool {
function sortIfPossible (line 167) | func sortIfPossible(v any) {
function compare (line 179) | func compare(one, two any) int {
function packagesVersionedNames (line 198) | func packagesVersionedNames(c devconfig.Config) []string {
FILE: testscripts/testrunner/examplesrunner.go
constant xdgStateHomeDir (line 25) | xdgStateHomeDir = "/tmp/devbox-testscripts"
function RunDevboxTestscripts (line 29) | func RunDevboxTestscripts(t *testing.T, dir string) {
function runSingleDevboxTestscript (line 87) | func runSingleDevboxTestscript(t *testing.T, dir, projectDir string) {
function generateTestscript (line 132) | func generateTestscript(t *testing.T, dir, projectDir string) (string, e...
FILE: testscripts/testrunner/setupenv.go
function setupTestEnv (line 17) | func setupTestEnv(env *testscript.Env) error {
function setupHome (line 31) | func setupHome(env *testscript.Env) {
function setupPATH (line 39) | func setupPATH(env *testscript.Env) {
function setupCacheHome (line 50) | func setupCacheHome(env *testscript.Env) {
function propagateEnvVars (line 80) | func propagateEnvVars(env *testscript.Env, vars ...string) {
FILE: testscripts/testrunner/source.go
function sourcePath (line 15) | func sourcePath(script *testscript.TestScript, neg bool, args []string) {
FILE: testscripts/testrunner/testrunner.go
function Main (line 18) | func Main(m *testing.M) {
function RunTestscripts (line 31) | func RunTestscripts(t *testing.T, testscriptsDir string) {
function globDirs (line 50) | func globDirs(pattern string) []string {
function copyFileCmd (line 71) | func copyFileCmd(script *testscript.TestScript, neg bool, args []string) {
function globCmd (line 82) | func globCmd(script *testscript.TestScript, neg bool, args []string) {
function getTestscriptParams (line 130) | func getTestscriptParams(dir string) testscript.Params {
FILE: testscripts/testrunner/updater/main.go
function main (line 17) | func main() {
function run (line 25) | func run() error {
function walkExampleDir (line 46) | func walkExampleDir(devboxRepoDir, path string, dirEntry fs.DirEntry, er...
function devboxRepoDir (line 97) | func devboxRepoDir() (string, error) {
FILE: testscripts/testscripts_test.go
constant runProjectTests (line 13) | runProjectTests = "DEVBOX_RUN_PROJECT_TESTS"
function TestScripts (line 15) | func TestScripts(t *testing.T) {
function TestMain (line 21) | func TestMain(m *testing.M) {
function TestExamples (line 26) | func TestExamples(t *testing.T) {
function TestScriptsWithProjects (line 38) | func TestScriptsWithProjects(t *testing.T) {
FILE: vscode-extension/src/devbox.ts
type Message (line 6) | interface Message {
function devboxReopen (line 17) | async function devboxReopen() {
function setupDotDevbox (line 95) | async function setupDotDevbox(workingDir: Uri, dotdevbox: Uri) {
function updateVSCodeConf (line 108) | function updateVSCodeConf() {
function logToFile (line 148) | async function logToFile(dotDevboxPath: Uri, message: string) {
FILE: vscode-extension/src/extension.ts
function activate (line 10) | function activate(context: ExtensionContext) {
function initialCheckDevboxJSON (line 119) | async function initialCheckDevboxJSON(context: ExtensionContext) {
function runInTerminal (line 139) | async function runInTerminal(cmd: string, showTerminal: boolean) {
function getDevboxScripts (line 157) | async function getDevboxScripts(): Promise<string[]> {
function getDevboxPackages (line 172) | async function getDevboxPackages(): Promise<string[]> {
function readDevboxJson (line 187) | async function readDevboxJson(workspaceUri: Uri) {
function deactivate (line 196) | function deactivate() { }
FILE: vscode-extension/src/openinvscode.ts
type VmInfo (line 9) | type VmInfo = {
function handleOpenInVSCode (line 18) | async function handleOpenInVSCode(uri: Uri) {
function getVMInfo (line 51) | async function getVMInfo(token: string | null, vmId: string | null): Pro...
function setupDevboxLauncher (line 68) | async function setupDevboxLauncher(): Promise<any> {
function setupSSHConfig (line 90) | async function setupSSHConfig(vmId: string, prKey: string) {
function connectToRemote (line 124) | function connectToRemote(username: string, vmId: string, workDir: string) {
function ensureDir (line 136) | async function ensureDir(dir: string) {
FILE: vscode-extension/src/test/runTest.ts
function main (line 5) | async function main() {
FILE: vscode-extension/src/test/suite/index.ts
function run (line 5) | function run(): Promise<void> {
Condensed preview — 895 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,116K chars).
[
{
"path": ".envrc",
"chars": 276,
"preview": "#!/usr/bin/env bash\n\n# Automatically sets up your devbox environment whenever you cd into this\n# directory via our diren"
},
{
"path": ".gitattributes",
"chars": 153,
"preview": "*.go diff=golang\n*.sh diff=bash\n*.md diff=markdown\n*.py diff=python\n*.sql diff=sql\n\ndevbox.json linguist-language=json5\n"
},
{
"path": ".github/ISSUE_TEMPLATE/01-bug.yaml",
"chars": 2108,
"preview": "name: Bug Report\ndescription: File a bug report\nlabels:\n - bug\n - triage\nbody:\n - type: textarea\n id: description\n"
},
{
"path": ".github/ISSUE_TEMPLATE/02-feature.yaml",
"chars": 973,
"preview": "name: Feature Request\ndescription: Suggest an idea or new feature\nlabels:\n - feature\n - triage\nbody:\n - type: textare"
},
{
"path": ".github/ISSUE_TEMPLATE/03-package-bug.yaml",
"chars": 682,
"preview": "name: Package Issue\ndescription: Report a problem with an existing package on either Devbox or Nixhub\nlabels:\n - packag"
},
{
"path": ".github/ISSUE_TEMPLATE/04-package-request.yaml",
"chars": 884,
"preview": "name: Package Request\ndescription: Request a new package to be added to Devbox and Nixhub\nlabels:\n - package\n - triage"
},
{
"path": ".github/pull_request_template.md",
"chars": 546,
"preview": "## Summary\n\n## How was it tested?\n\n## Community Contribution License\n\nAll community contributions in this pull request a"
},
{
"path": ".github/workflows/cache-upload.yml",
"chars": 1805,
"preview": "name: cache-upload\n# Uploads devbox nix dependencies to cache\n\non:\n push:\n branches:\n - main\n workflow_dispatc"
},
{
"path": ".github/workflows/cli-post-release.yml",
"chars": 745,
"preview": "name: cli-post-release\n# Finalize and announce the release once its been published on Github.\n\non:\n release:\n types:"
},
{
"path": ".github/workflows/cli-release.yml",
"chars": 5066,
"preview": "name: cli-release\n# Releases the Devbox CLI\n\nconcurrency: cli-release\n\non:\n # Build/Release on demand\n workflow_dispat"
},
{
"path": ".github/workflows/cli-tests.yaml",
"chars": 11167,
"preview": "name: cli-tests\n# Runs the Devbox CLI tests\n\nconcurrency:\n group: ${{ github.ref }}\n cancel-in-progress: true\n\non:\n p"
},
{
"path": ".github/workflows/debug.yaml",
"chars": 1612,
"preview": "name: debug\n\non:\n workflow_dispatch:\n inputs:\n runner:\n description: \"Runner type to debug on\"\n r"
},
{
"path": ".github/workflows/docker-image-release.yml",
"chars": 3327,
"preview": "name: docker-image-release\n\non:\n release:\n types:\n - published\n workflow_dispatch:\n inputs:\n tag:\n "
},
{
"path": ".github/workflows/random-reviewer-assignment.yml",
"chars": 3549,
"preview": "name: Random Reviewer Assignment\non:\n pull_request:\n types: [opened]\n\npermissions:\n contents: read\n pull-requests:"
},
{
"path": ".github/workflows/stale-issue-cleanup.yml",
"chars": 829,
"preview": "name: close-stale-issues\n# Marks issues and PRs as stale after 30 days, then closes them if marked stale for 5 days\non:\n"
},
{
"path": ".github/workflows/vscode-ext-release.yaml",
"chars": 1028,
"preview": "name: vscode-ext-release\n# Releases the Devbox VSCode extension to the marketplace\n\nconcurrency: vscode-ext-release\n\non:"
},
{
"path": ".gitignore",
"chars": 523,
"preview": "# Global gitignore for the entire monorepo. Only add things here that truly\n# need to always be ignored regardless of pr"
},
{
"path": ".golangci.yml",
"chars": 2107,
"preview": "linters:\n disable-all: true\n enable:\n - dupl\n - errcheck\n - errorlint\n - gofmt\n - goimports\n - gosim"
},
{
"path": ".goreleaser.yaml",
"chars": 2334,
"preview": "project_name: devbox\nbefore:\n hooks:\n - go mod tidy\nbuilds:\n - main: ./cmd/devbox/main.go\n binary: devbox\n fl"
},
{
"path": ".schema/devbox-plugin.schema.json",
"chars": 5230,
"preview": "{\n \"$schema\": \"https://json-schema.org/draft-04/schema#\",\n \"$id\": \"https://github.com/jetify-com/devbox/plugins\",\n \"t"
},
{
"path": ".schema/devbox.schema.json",
"chars": 6900,
"preview": "{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"$id\": \"https://github.com/jetify-com/devbox\",\n \"titl"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 5535,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
},
{
"path": "CONTRIBUTING.md",
"chars": 4472,
"preview": "# Contributing\n\nWhen contributing to this repository, please describe the change you wish to\nmake via a related issue, o"
},
{
"path": "LICENSE",
"chars": 11356,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "NUSHELL.md",
"chars": 1361,
"preview": "# Using Devbox with Nushell\n\nDevbox now supports [nushell](https://github.com/nushell/nushell) through the `--format` fl"
},
{
"path": "README.md",
"chars": 6434,
"preview": "<picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"docs/app/static/img/devbox_logo_dark.svg\">\n <source medi"
},
{
"path": "cmd/devbox/main.go",
"chars": 242,
"preview": "// Copyright 2024 Jetify Inc. and contributors. All rights reserved.\n// Use of this source code is governed by the licen"
},
{
"path": "devbox.go",
"chars": 691,
"preview": "// Package devbox creates and configures Devbox development environments.\npackage devbox\n\nimport (\n\t\"context\"\n\t\"io\"\n\n\t\"g"
},
{
"path": "devbox.json",
"chars": 4068,
"preview": "{\n \"name\": \"devbox\",\n \"description\": \"Instant, easy, and predictable development environments\",\n \"packages\": {"
},
{
"path": "devbox.md",
"chars": 3301,
"preview": "<!-- gen-readme start - generated by https://github.com/jetify-com/devbox/ -->\n\n# devbox\n\nInstant, easy, and predictable"
},
{
"path": "examples/.gitignore",
"chars": 41,
"preview": ".devbox/\n.DS_STORE\n.vscode/settings.json\n"
},
{
"path": "examples/README.md",
"chars": 523,
"preview": "# Devbox Examples\n\n[](https://www.jetify.com/devb"
},
{
"path": "examples/cloud_development/argo-workflows/README.md",
"chars": 1152,
"preview": "# Minikube + Argo Example\n\nRun and test Argo Workflows on a local Minkube instance.\n\nThe init_hook in this example confi"
},
{
"path": "examples/cloud_development/argo-workflows/argo-patch.sh",
"chars": 355,
"preview": "# Patch so we don't need to login through the UI, for development purposes. See https://argoproj.github.io/argo-workflow"
},
{
"path": "examples/cloud_development/argo-workflows/devbox.json",
"chars": 787,
"preview": "{\n \"packages\": [\n \"kubectl\",\n \"argo\",\n \"docker\",\n \"minikube@latest\"\n ],\n \"env\": {\n \"MINIKUBE_HOME\": \"$"
},
{
"path": "examples/cloud_development/maelstrom/README.md",
"chars": 1206,
"preview": "# Maelstrom\n\n\nA Devbox for running [Maelstrom](https://github.com/jepsen-io/maelstrom) Tests. Maelstrom is a testing lib"
},
{
"path": "examples/cloud_development/maelstrom/devbox.json",
"chars": 683,
"preview": "{\n \"packages\": [\n \"graphviz\",\n \"gnuplot\",\n \"ruby_3_1\",\n \"curl\",\n \"glow\",\n \"openjdk17@latest\"\n ],\n \""
},
{
"path": "examples/cloud_development/minikube/README.md",
"chars": 775,
"preview": "# Minikube + Helm + Kubectl Example\n\nRun Helm + Kubernetes locally using Minikube in a Devbox shell.\n\nThe init_hook in t"
},
{
"path": "examples/cloud_development/minikube/devbox.json",
"chars": 506,
"preview": "{\n \"packages\": [\n \"kubectl\",\n \"kubernetes-helm-wrapped\",\n \"docker\",\n \"minikube@latest\"\n ],\n \"env\": {\n "
},
{
"path": "examples/cloud_development/temporal/.envrc",
"chars": 487,
"preview": "# Automatically sets up your devbox environment whenever you cd into this\n# directory via our direnv integration:\n\nuse_d"
},
{
"path": "examples/cloud_development/temporal/.gitignore",
"chars": 6,
"preview": ".venv/"
},
{
"path": "examples/cloud_development/temporal/README.md",
"chars": 1079,
"preview": "# Temporal\n\n[](https://www.jetify.com/devbox/do"
},
{
"path": "examples/cloud_development/temporal/devbox.json",
"chars": 697,
"preview": "{\n \"packages\": [\n \"python310Packages.pip\",\n \"python310Packages.pylint\",\n \"python310Packages.black\",\n \"pytho"
},
{
"path": "examples/cloud_development/temporal/hello/.gitignore",
"chars": 26,
"preview": "__pycache__\n.poetry-cache/"
},
{
"path": "examples/cloud_development/temporal/hello/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "examples/cloud_development/temporal/hello/hello_activity.py",
"chars": 2065,
"preview": "import asyncio\nimport logging\nfrom dataclasses import dataclass\nfrom datetime import timedelta\n\nfrom temporalio import a"
},
{
"path": "examples/cloud_development/temporal/hello/hello_cron.py",
"chars": 1631,
"preview": "import asyncio\nfrom dataclasses import dataclass\nfrom datetime import timedelta\n\nfrom temporalio import activity, workfl"
},
{
"path": "examples/cloud_development/temporal/requirements.txt",
"chars": 24,
"preview": "temporalio==0.1b4\ncython"
},
{
"path": "examples/cloud_development/temporal/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "examples/cloud_development/temporal/venvShellHook.sh",
"chars": 379,
"preview": "SOURCE_DATE_EPOCH=$(date +%s)\n\nif [ -d \"$VENV_DIR\" ]; then\n echo \"Skipping venv creation, '${VENV_DIR}' already exist"
},
{
"path": "examples/data_science/R/.gitignore",
"chars": 17,
"preview": ".RData\n.Rhistory\n"
},
{
"path": "examples/data_science/R/README.md",
"chars": 2283,
"preview": "# R\n\n[R is a free software environment for statistical computing and graphics](https://www.r-project.org/).\n\n[**Example "
},
{
"path": "examples/data_science/R/devbox.json",
"chars": 462,
"preview": "{\n \"$schema\": \"https://raw.githubusercontent.com/jetify-com/devbox/0.10.6/.schema/devbox.schema.json\",\n \"packages\": [\n"
},
{
"path": "examples/data_science/R/src/examplePlot.R",
"chars": 513,
"preview": "# Load the required libraries\nlibrary(data.table)\nlibrary(ggplot2)\n\n# Create example data\ndata <- data.table(\n x = rnor"
},
{
"path": "examples/data_science/README.md",
"chars": 222,
"preview": "# Data Science and ML Examples\n\nBasic data science and ML examples. These examples are WIP\n\nNote: Examples that require "
},
{
"path": "examples/data_science/jupyter/.envrc",
"chars": 487,
"preview": "# Automatically sets up your devbox environment whenever you cd into this\n# directory via our direnv integration:\n\nuse_d"
},
{
"path": "examples/data_science/jupyter/.pdm-python",
"chars": 79,
"preview": "/Users/daniel/Code/jetify/devbox/examples/data_science/jupyter/.venv/bin/python"
},
{
"path": "examples/data_science/jupyter/.pdm.toml",
"chars": 93,
"preview": "[python]\npath = \"/nix/store/7rjqb838snvvxcmpvck1smfxhkwzqal5-python3-3.10.10/bin/python3.10\"\n"
},
{
"path": "examples/data_science/jupyter/__pypackages__/.gitignore",
"chars": 14,
"preview": "*\n!.gitignore\n"
},
{
"path": "examples/data_science/jupyter/devbox.json",
"chars": 369,
"preview": "{\n \"packages\": [\n \"pdm\",\n \"nodePackages.pyright\",\n \"python311Packages.jupyter\",\n \"python311Packages.virtual"
},
{
"path": "examples/data_science/jupyter/main.py",
"chars": 0,
"preview": ""
},
{
"path": "examples/data_science/jupyter/pyproject.toml",
"chars": 246,
"preview": "[project]\nname = \"\"\nversion = \"\"\ndescription = \"\"\nauthors = [\n {name = \"John Lago\", email = \"750845+Lagoja@users.nore"
},
{
"path": "examples/data_science/llama/README.md",
"chars": 1129,
"preview": "# Llama build and run\n\nSimple Llama (generative AI) build and run with Devbox.\n\n## Setup\n\n- Make sure to have [devbox in"
},
{
"path": "examples/data_science/llama/devbox.json",
"chars": 494,
"preview": "{\n \"packages\": [\n \"github:ggerganov/llama.cpp\",\n \"wget@latest\"\n ],\n \"shell\": {\n \"init_hook\": null,\n \"scri"
},
{
"path": "examples/data_science/pytorch/basic-example/README.md",
"chars": 191,
"preview": "# Basic Pytorch Example\n\nThis is a Devbox for running PyTorch. \n\nNote: This demo currently only works on WSL3 with Nvidi"
},
{
"path": "examples/data_science/pytorch/basic-example/devbox.json",
"chars": 364,
"preview": "{\n \"packages\": {\n \"poetry\": \"\",\n \"stdenv.cc.cc.lib\": \"\",\n \"cudatoolkit\": {\n \"version\": "
},
{
"path": "examples/data_science/pytorch/basic-example/main.py",
"chars": 260,
"preview": "import torch\n\ndef create_arrays(n):\n x = torch.ones(n, n)\n y = torch.randn(n, n * 2)\n return x , y\n\n\ndef main()"
},
{
"path": "examples/data_science/pytorch/basic-example/pyproject.toml",
"chars": 329,
"preview": "[tool.poetry]\nname = \"devbox-cuda-dev\"\nversion = \"0.1.0\"\ndescription = \"\"\nauthors = [\"jetify.com\"]\nreadme = \"README.md\"\n"
},
{
"path": "examples/data_science/pytorch/gradio/.gitignore",
"chars": 8,
"preview": "flagged/"
},
{
"path": "examples/data_science/pytorch/gradio/README.md",
"chars": 340,
"preview": "# Gradio + Pytorch\n\nThis is a Devbox for running the [Pictionary](https://huggingface.co/spaces/gradio/pictionary/tree/m"
},
{
"path": "examples/data_science/pytorch/gradio/class_names.txt",
"chars": 759,
"preview": "airplane\nalarm_clock\nanvil\napple\naxe\nbaseball\nbaseball_bat\nbasketball\nbeard\nbed\nbench\nbicycle\nbird\nbook\nbread\nbridge\nbro"
},
{
"path": "examples/data_science/pytorch/gradio/devbox.json",
"chars": 307,
"preview": "{\n \"packages\": [\n \"python310Packages.pip\",\n \"stdenv.cc.cc.lib\",\n \"python310@latest\"\n ],\n \"env\": {},\n \"shell"
},
{
"path": "examples/data_science/pytorch/gradio/requirements.txt",
"chars": 26,
"preview": "torch\ngradio\npathlib\ngdown"
},
{
"path": "examples/data_science/pytorch/gradio/run.py",
"chars": 1394,
"preview": "from pathlib import Path\n\nimport torch\nimport gradio as gr\nfrom torch import nn\nimport gdown \n\nurl = 'https://drive.goog"
},
{
"path": "examples/data_science/tensorflow/README.md",
"chars": 342,
"preview": "# Tensorflow application\n\nSimple Tensorflow sample project with Devbox.\n\n## Setup\n\n- Make sure to have [devbox installed"
},
{
"path": "examples/data_science/tensorflow/devbox.json",
"chars": 294,
"preview": "{\n \"packages\": [\n \"python310Packages.pip\",\n \"stdenv.cc.cc.lib\",\n \"python310@latest\"\n ],\n \"shell\": {\n \"ini"
},
{
"path": "examples/data_science/tensorflow/main.py",
"chars": 118,
"preview": "import tensorflow as tf\n\n# Simple python script using Tensorflow\nprint(tf.reduce_sum(tf.random.normal([1000, 1000])))\n"
},
{
"path": "examples/data_science/tensorflow/requirements.txt",
"chars": 10,
"preview": "tf-nightly"
},
{
"path": "examples/databases/mariadb/.gitignore",
"chars": 34,
"preview": "conf/mysql/data\n*.log\n*.pid\n*.sock"
},
{
"path": "examples/databases/mariadb/README.md",
"chars": 970,
"preview": "# mariadb\n\n## mariadb Notes\n\n1. Start the mariadb server using `devbox services up`\n1. Create a database using `\"mysql -"
},
{
"path": "examples/databases/mariadb/devbox.json",
"chars": 495,
"preview": "{\n \"packages\": [\n \"mariadb@latest\"\n ],\n \"shell\": {\n \"init_hook\": [],\n \"scripts\": {\n \"connect_db\": [\n "
},
{
"path": "examples/databases/mariadb/setup_db.sql",
"chars": 573,
"preview": "--- You should run this query using `mysql -u root < setup_db.sql`\n\nDROP DATABASE IF EXISTS devbox_lamp;\nCREATE DATABASE"
},
{
"path": "examples/databases/mysql/README.md",
"chars": 939,
"preview": "# mysql\n\n## mysql Notes\n\n1. Start the mysql server using `devbox services up`\n1. Create a database using `\"mysql -u root"
},
{
"path": "examples/databases/mysql/devbox.d/mysql/my.cnf",
"chars": 115,
"preview": "# MySQL configuration file\n\n[mariadbd]\n# Change this port if 3306 is already used\n#port = 3306\nlog_error=mysql.log\n"
},
{
"path": "examples/databases/mysql/devbox.d/mysql80/my.cnf",
"chars": 110,
"preview": "# MySQL configuration file\n\n# [mysqld]\n# skip-log-bin\n# Change this port if 3306 is already used\n#port = 3306\n"
},
{
"path": "examples/databases/mysql/devbox.d/mysql84/my.cnf",
"chars": 110,
"preview": "# MySQL configuration file\n\n# [mysqld]\n# skip-log-bin\n# Change this port if 3306 is already used\n#port = 3306\n"
},
{
"path": "examples/databases/mysql/devbox.json",
"chars": 398,
"preview": "{\n \"packages\": [\"mysql84@latest\"],\n \"shell\": {\n \"init_hook\": [],\n \"scripts\": {\n \"connect_db\": [\n \"my"
},
{
"path": "examples/databases/mysql/my.cnf",
"chars": 558,
"preview": "[mysqld]\n# Use a different port to avoid conflicts\nport = 3307\n\n# Basic settings\ndatadir = .devbox/virtenv/mysql80/data\n"
},
{
"path": "examples/databases/mysql/setup_db.sql",
"chars": 537,
"preview": "-- You should run this query using `mysql -u root < setup_db.sql`\n\nDROP DATABASE IF EXISTS devbox_lamp;\nCREATE DATABASE "
},
{
"path": "examples/databases/postgres/.gitignore",
"chars": 24,
"preview": "*.log\n*.pid\n*.sock\ndata/"
},
{
"path": "examples/databases/postgres/README.md",
"chars": 774,
"preview": "# postgresql-14.6\n\n## postgresql Notes\n\nYou need to initialize and create a database as part of your setup.\n\n1. Initiali"
},
{
"path": "examples/databases/postgres/devbox.json",
"chars": 91,
"preview": "{\n \"packages\": {\n \"postgresql\": \"latest\"\n },\n \"shell\": {\n \"init_hook\": null\n }\n}\n"
},
{
"path": "examples/databases/postgres/setup_postgres_db.sql",
"chars": 466,
"preview": "--- You should run this query using psql < setup_db.sql`\n\nDROP DATABASE IF EXISTS devbox_lamp;\nCREATE DATABASE devbox_la"
},
{
"path": "examples/databases/redis/README.md",
"chars": 719,
"preview": "# redis-7.0.5\n\n## redis Notes\n\nRunning `devbox services start redis` will start redis as a daemon in the background.\n\nYo"
},
{
"path": "examples/databases/redis/devbox.d/redis/redis.conf",
"chars": 58779,
"preview": "# Redis configuration file example.\n#\n# Note that in order to read the configuration file, Redis must be\n# started with "
},
{
"path": "examples/databases/redis/devbox.json",
"chars": 128,
"preview": "{\n \"packages\": [\"redis@latest\"],\n \"shell\": {\n \"init_hook\": \"\",\n \"scripts\": {\n \"redis-cli\": \"redis-cli\"\n "
},
{
"path": "examples/databases/valkey/README.md",
"chars": 738,
"preview": "# valkey-7.2.5\n\n## valkey Notes\n\nRunning `devbox services start valkey` will start valkey as a daemon in the background."
},
{
"path": "examples/databases/valkey/devbox.d/valkey/valkey.conf",
"chars": 58921,
"preview": "# Valkey configuration file example.\n#\n# Note that in order to read the configuration file, Valkey must be\n# started wit"
},
{
"path": "examples/databases/valkey/devbox.json",
"chars": 131,
"preview": "{\n \"packages\": [\"valkey@latest\"],\n \"shell\": {\n \"init_hook\": \"\",\n \"scripts\": {\n \"valkey-cli\": \"valkey-cli\"\n "
},
{
"path": "examples/development/bun/.gitignore",
"chars": 2233,
"preview": "# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore\n\n# Logs\n\nlogs\n_.log\nnpm-debug.log_\nyar"
},
{
"path": "examples/development/bun/README.md",
"chars": 673,
"preview": "# Bun\n\nBun projects can be run in Devbox by adding the Bun runtime + package manager to your project.\n\n[**Example Repo**"
},
{
"path": "examples/development/bun/devbox.json",
"chars": 303,
"preview": "{\n \"$schema\": \"https://raw.githubusercontent.com/jetify-com/devbox/0.10.1/.schema/devbox.schema.json\",\n \"packages\": ["
},
{
"path": "examples/development/bun/index.test.ts",
"chars": 92,
"preview": "import { expect, test } from \"bun:test\";\n\ntest(\"2 + 2\", () => {\n expect(2 + 2).toBe(4);\n});"
},
{
"path": "examples/development/bun/index.ts",
"chars": 234,
"preview": "import figlet from 'figlet';\n\nconst server = Bun.serve({\n port: 3000,\n fetch(req) {\n const body = figlet.textSync(\""
},
{
"path": "examples/development/bun/package.json",
"chars": 222,
"preview": "{\n \"name\": \"bun\",\n \"module\": \"index.tx\",\n \"type\": \"module\",\n \"devDependencies\": {\n \"@types/bun\": \"latest\"\n },\n "
},
{
"path": "examples/development/bun/tsconfig.json",
"chars": 628,
"preview": "{\n \"compilerOptions\": {\n // Enable latest features\n \"lib\": [\"ESNext\"],\n \"target\": \"ESNext\",\n \"module\": \"ESN"
},
{
"path": "examples/development/csharp/hello-world/.gitignore",
"chars": 10,
"preview": "bin/\nobj/\n"
},
{
"path": "examples/development/csharp/hello-world/Program.cs",
"chars": 660,
"preview": "namespace csharp_10_dotnet_6_with_package;\r\n\r\nusing Newtonsoft.Json;\r\n\r\nclass Product \r\n{\r\n public string Name;\r\n pub"
},
{
"path": "examples/development/csharp/hello-world/README.md",
"chars": 763,
"preview": "# C# and .NET\n\nC# and .NET projects can be easily generated in Devbox by adding the dotnet SDK to your project. You can "
},
{
"path": "examples/development/csharp/hello-world/devbox.json",
"chars": 173,
"preview": "{\n \"packages\": [\n \"dotnet-sdk@latest\"\n ],\n \"shell\": {\n \"init_hook\": null,\n \"scripts\": {\n "
},
{
"path": "examples/development/csharp/hello-world/hello-world.csproj",
"chars": 399,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\r\n\r\n <PropertyGroup>\r\n <OutputType>Exe</OutputType>\r\n <TargetFramework>net6.0</T"
},
{
"path": "examples/development/elixir/elixir_hello/.formatter.exs",
"chars": 97,
"preview": "# Used by \"mix format\"\n[\n inputs: [\"{mix,.formatter}.exs\", \"{config,lib,test}/**/*.{ex,exs}\"]\n]\n"
},
{
"path": "examples/development/elixir/elixir_hello/.gitignore",
"chars": 655,
"preview": "# The directory Mix will write compiled artifacts to.\n/_build/\n\n# If you run \"mix test --cover\", coverage assets end up "
},
{
"path": "examples/development/elixir/elixir_hello/README.md",
"chars": 801,
"preview": "# Elixir\n\nBasic Elixir project using Mix in Devbox.\n\n\n## Configuration\n\nThis project configures Hex and Mix to install p"
},
{
"path": "examples/development/elixir/elixir_hello/devbox.json",
"chars": 160,
"preview": "{\n \"packages\": [\n \"elixir@latest\"\n ],\n \"shell\": {\n \"init_hook\": [\n \"mix deps.get\"\n ],\n \"scripts\": {\n"
},
{
"path": "examples/development/elixir/elixir_hello/lib/elixir_hello.ex",
"chars": 350,
"preview": "defmodule ElixirHello do\n use Application\n @moduledoc \"\"\"\n Documentation for `ElixirHello`.\n \"\"\"\n\n @doc \"\"\"\n Hello"
},
{
"path": "examples/development/elixir/elixir_hello/lib/kv.exs",
"chars": 276,
"preview": "defmodule KV do\n def start_link do\n Task.start_link(fn -> loop(%{}) end)\n end\n\n defp loop(map) do\n receive do\n "
},
{
"path": "examples/development/elixir/elixir_hello/mix.exs",
"chars": 638,
"preview": "defmodule ElixirHello.MixProject do\n use Mix.Project\n\n def project do\n [\n app: :elixir_hello,\n version: \""
},
{
"path": "examples/development/elixir/elixir_hello/test/elixir_hello_test.exs",
"chars": 158,
"preview": "defmodule ElixirHelloTest do\n use ExUnit.Case\n doctest ElixirHello\n\n test \"greets the world\" do\n assert ElixirHell"
},
{
"path": "examples/development/elixir/elixir_hello/test/test_helper.exs",
"chars": 15,
"preview": "ExUnit.start()\n"
},
{
"path": "examples/development/fsharp/hello-world/.gitignore",
"chars": 10,
"preview": "bin/\nobj/\n"
},
{
"path": "examples/development/fsharp/hello-world/Program.fs",
"chars": 500,
"preview": "// For more information see https://aka.ms/fsharp-console-apps\r\n\r\n[<EntryPoint>]\r\nlet main args =\r\n let dotNetVersio"
},
{
"path": "examples/development/fsharp/hello-world/README.md",
"chars": 740,
"preview": "# F# and .NET\n\nF# and .NET projects can be easily generated in Devbox by adding the dotnet SDK to your project. You can "
},
{
"path": "examples/development/fsharp/hello-world/devbox.json",
"chars": 173,
"preview": "{\n \"packages\": [\n \"dotnet-sdk@latest\"\n ],\n \"shell\": {\n \"init_hook\": null,\n \"scripts\": {\n "
},
{
"path": "examples/development/fsharp/hello-world/hello-world.fsproj",
"chars": 291,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\r\n\r\n <PropertyGroup>\r\n <OutputType>Exe</OutputType>\r\n <TargetFramework>net6.0</"
},
{
"path": "examples/development/go/hello-world/.envrc",
"chars": 255,
"preview": "# Automatically sets up your devbox environment whenever you cd into this\n# directory via our direnv integration:\n\neval "
},
{
"path": "examples/development/go/hello-world/README.md",
"chars": 891,
"preview": "# Go\n\nGo projects can be run in Devbox by adding the Go SDK to your project. If your project uses cgo or compiles agains"
},
{
"path": "examples/development/go/hello-world/devbox.json",
"chars": 255,
"preview": "{\n \"packages\": [\"go@1.24.5\"],\n \"env\": {\n \"GOPATH\": \"$HOME/go/\",\n \"PATH\": \"$PATH:$HOME/go/bin\"\n },\n \"shell\": "
},
{
"path": "examples/development/go/hello-world/go.mod",
"chars": 26,
"preview": "module example\n\ngo 1.24.5\n"
},
{
"path": "examples/development/go/hello-world/main.go",
"chars": 264,
"preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n)\n\nfunc main() {\n\texpected := \"go1.24.5\"\n\tgoVersion := runtime.Version()\n\tfmt.P"
},
{
"path": "examples/development/haskell/README.md",
"chars": 762,
"preview": "# Haskell\n\nHaskell projects that use the Stack Framework can be run in Devbox by adding the Stack and the Cabal packages"
},
{
"path": "examples/development/haskell/devbox.json",
"chars": 366,
"preview": "{\n \"packages\": [\n \"ghc@latest\",\n \"gmp@latest\",\n \"stack@latest\",\n \"cabal-install@latest\",\n \"zlib@latest\","
},
{
"path": "examples/development/haskell/my-project/.gitignore",
"chars": 12,
"preview": ".stack-work/"
},
{
"path": "examples/development/haskell/my-project/CHANGELOG.md",
"chars": 316,
"preview": "# Changelog for `my-project`\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based "
},
{
"path": "examples/development/haskell/my-project/LICENSE",
"chars": 1529,
"preview": "Copyright Author name here (c) 2022\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or wi"
},
{
"path": "examples/development/haskell/my-project/README.md",
"chars": 384,
"preview": "# Haskell\n\nThis example was generated using `stack`. To generate a similar example, you can copy the devbox json and run"
},
{
"path": "examples/development/haskell/my-project/Setup.hs",
"chars": 46,
"preview": "import Distribution.Simple\nmain = defaultMain\n"
},
{
"path": "examples/development/haskell/my-project/app/Main.hs",
"chars": 68,
"preview": "module Main (main) where\n\nimport Lib\n\nmain :: IO ()\nmain = someFunc\n"
},
{
"path": "examples/development/haskell/my-project/my-project.cabal",
"chars": 1969,
"preview": "cabal-version: 1.12\n\n-- This file has been generated from package.yaml by hpack version 0.35.0.\n--\n-- see: https://githu"
},
{
"path": "examples/development/haskell/my-project/package.yaml",
"chars": 1392,
"preview": "name: my-project\nversion: 0.1.0.0\ngithub: \"githubuser/my-project\"\nlicense: "
},
{
"path": "examples/development/haskell/my-project/src/Lib.hs",
"chars": 88,
"preview": "module Lib\n ( someFunc\n ) where\n\nsomeFunc :: IO ()\nsomeFunc = putStrLn \"someFunc\"\n"
},
{
"path": "examples/development/haskell/my-project/stack.yaml",
"chars": 2208,
"preview": "# This file was automatically generated by 'stack init'\n#\n# Some commonly used options have been documented as comments "
},
{
"path": "examples/development/haskell/my-project/test/Spec.hs",
"chars": 63,
"preview": "main :: IO ()\nmain = putStrLn \"Test suite not yet implemented\"\n"
},
{
"path": "examples/development/java/README.md",
"chars": 2090,
"preview": "# Setting Up Example Projects For Java\n\n## Java with Maven\nMaven is an all-in-one CI-CD tool for building testing and de"
},
{
"path": "examples/development/java/gradle/.gitignore",
"chars": 15,
"preview": ".gradle/\nbuild/"
},
{
"path": "examples/development/java/gradle/hello-world/README.md",
"chars": 2815,
"preview": "# Java\n\nIn addition to installing the JDK, you'll need to install either the Maven or Gradle build systems in your shell"
},
{
"path": "examples/development/java/gradle/hello-world/build.gradle",
"chars": 415,
"preview": "/*\n * This file was generated by the Gradle 'init' task.\n *\n * This is a general purpose Gradle build.\n * Learn more abo"
},
{
"path": "examples/development/java/gradle/hello-world/devbox.json",
"chars": 278,
"preview": "{\n \"packages\": [\n \"gradle@latest\",\n \"jdk@19\",\n \"binutils@latest\"\n ],\n \"shell\": {\n \""
},
{
"path": "examples/development/java/gradle/hello-world/gradlew",
"chars": 8165,
"preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "examples/development/java/gradle/hello-world/settings.gradle",
"chars": 357,
"preview": "/*\n * This file was generated by the Gradle 'init' task.\n *\n * The settings file is used to specify which projects to in"
},
{
"path": "examples/development/java/gradle/hello-world/src/main/java/hello/HelloWorld.java",
"chars": 143,
"preview": "package hello;\n\npublic class HelloWorld {\n public static void main(String[] args) {\n \n System.out.println(\"Hello Worl"
},
{
"path": "examples/development/java/maven/.gitignore",
"chars": 7,
"preview": "target/"
},
{
"path": "examples/development/java/maven/hello-world/README.md",
"chars": 2245,
"preview": "# Java\n\nIn addition to installing the JDK, you'll need to install either the Maven or Gradle build systems in your shell"
},
{
"path": "examples/development/java/maven/hello-world/devbox-maven-app/pom.xml",
"chars": 2677,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/"
},
{
"path": "examples/development/java/maven/hello-world/devbox.json",
"chars": 316,
"preview": "{\n \"packages\": [\n \"maven@latest\",\n \"jdk@19\",\n \"binutils@latest\"\n ],\n \"shell\": {\n \"i"
},
{
"path": "examples/development/java/maven/hello-world/pom.xml",
"chars": 2965,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/"
},
{
"path": "examples/development/java/maven/hello-world/src/main/java/com/devbox/mavenapp/App.java",
"chars": 173,
"preview": "package com.devbox.mavenapp;\n\n/**\n * Hello world!\n *\n */\npublic class App {\n public static void main(String[] args) {"
},
{
"path": "examples/development/java/maven/hello-world/src/test/java/com/devbox/mavenapp/AppTest.java",
"chars": 291,
"preview": "package com.devbox.mavenapp;\n\nimport static org.junit.Assert.assertTrue;\n\nimport org.junit.Test;\n\n/**\n * Unit test for s"
},
{
"path": "examples/development/nim/spinnytest/README.md",
"chars": 172,
"preview": "# Nim Example\n\nSmall test to demonstrate installing a package and running it with nim.\n\n## Building\n\n```bash\ndevbox run "
},
{
"path": "examples/development/nim/spinnytest/devbox.json",
"chars": 245,
"preview": "{\n \"packages\": [\n \"nim@1.6.12\",\n \"nimble-unwrapped@0.14\",\n \"openssl_1_1@latest\"\n ],\n \"shel"
},
{
"path": "examples/development/nim/spinnytest/spinnytest.nim",
"chars": 183,
"preview": "import spinny, os\n\nvar spinner1 = newSpinny(\"Loading message ..\".fgWhite, skDots)\nspinner1.setSymbolColor(fgBlue)\nspinne"
},
{
"path": "examples/development/nim/spinnytest/spinnytest.nimble",
"chars": 191,
"preview": "# Package\n\nversion = \"0.1.0\"\nauthor = \"Your Name\"\ndescription = \"Example .nimble file.\"\nlicense = \"MIT\"\n\nbi"
},
{
"path": "examples/development/nodejs/.gitignore",
"chars": 17,
"preview": "node_modules/git "
},
{
"path": "examples/development/nodejs/nodejs-npm/README.md",
"chars": 1129,
"preview": "# NodeJS\n\nMost NodeJS Projects will install their dependencies locally using NPM or Yarn, and thus can work with Devbox "
},
{
"path": "examples/development/nodejs/nodejs-npm/devbox.json",
"chars": 160,
"preview": "{\n \"packages\": [\n \"nodejs@18\"\n ],\n \"shell\": {\n \"init_hook\": [\n \"npm install\"\n ],\n \"scripts\": {\n "
},
{
"path": "examples/development/nodejs/nodejs-npm/index.js",
"chars": 146,
"preview": "const NODE_MAJOR_VERSION = process.versions.node.split('.')[0];\nif (!NODE_MAJOR_VERSION) {\n throw new Error('Node is no"
},
{
"path": "examples/development/nodejs/nodejs-npm/package.json",
"chars": 153,
"preview": "{\n \"name\": \"nodejs-npm\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"build\": \"echo building...\",\n \"start\": \"node index"
},
{
"path": "examples/development/nodejs/nodejs-pnpm/README.md",
"chars": 1692,
"preview": "# NodeJS\n\nMost NodeJS Projects will install their dependencies locally using NPM or Yarn, and thus can work with Devbox "
},
{
"path": "examples/development/nodejs/nodejs-pnpm/devbox.json",
"chars": 213,
"preview": "{\n \"packages\": [\"nodejs@latest\"],\n \"env\": {\n \"DEVBOX_COREPACK_ENABLED\": \"true\"\n },\n \"shell\": {\n \"init_hook\": ["
},
{
"path": "examples/development/nodejs/nodejs-pnpm/index.js",
"chars": 146,
"preview": "const NODE_MAJOR_VERSION = process.versions.node.split('.')[0];\nif (!NODE_MAJOR_VERSION) {\n throw new Error('Node is no"
},
{
"path": "examples/development/nodejs/nodejs-pnpm/package.json",
"chars": 188,
"preview": "{\n \"name\": \"nodejs-pnpm\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"build\": \"echo building...\",\n \"start\": \"node inde"
},
{
"path": "examples/development/nodejs/nodejs-typescript/.gitignore",
"chars": 13,
"preview": "node_modules/"
},
{
"path": "examples/development/nodejs/nodejs-typescript/devbox.json",
"chars": 229,
"preview": "{\n \"packages\": [\n \"nodejs@18\"\n ],\n \"shell\": {\n \"init_hook\": [\n \"npm install\",\n "
},
{
"path": "examples/development/nodejs/nodejs-typescript/index.js",
"chars": 146,
"preview": "var NODE_MAJOR_VERSION = process.versions.node.split('.')[0];\nif (NODE_MAJOR_VERSION !== \"18\") {\n throw new Error('No"
},
{
"path": "examples/development/nodejs/nodejs-typescript/index.ts",
"chars": 192,
"preview": "const NODE_MAJOR_VERSION = process.versions.node.split('.')[0];\nif (NODE_MAJOR_VERSION !== \"18\") {\n throw new Error('No"
},
{
"path": "examples/development/nodejs/nodejs-typescript/package.json",
"chars": 277,
"preview": "{\n \"name\": \"nodejs-typescript\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"build\": \"tsc index.ts --outfile index.js\",\n "
},
{
"path": "examples/development/nodejs/nodejs-typescript/tsconfig.json",
"chars": 1038,
"preview": "{\n \"include\": [\"**/*.ts\", \"**/*.tsx\"],\n \"exclude\": [],\n \"compilerOptions\": {\n /* Visit https://aka.ms/tsconfig to "
},
{
"path": "examples/development/nodejs/nodejs-yarn/.yarnrc.yml",
"chars": 25,
"preview": "nodeLinker: node-modules\n"
},
{
"path": "examples/development/nodejs/nodejs-yarn/README.md",
"chars": 1192,
"preview": "# NodeJS\n\nMost NodeJS Projects will install their dependencies locally using NPM or Yarn, and thus can work with Devbox "
},
{
"path": "examples/development/nodejs/nodejs-yarn/devbox.json",
"chars": 209,
"preview": "{\n \"packages\": [\"nodejs@latest\"],\n \"env\": {\n \"DEVBOX_COREPACK_ENABLED\": \"true\"\n },\n \"shell\": {\n \"init_hook\": ["
},
{
"path": "examples/development/nodejs/nodejs-yarn/index.js",
"chars": 146,
"preview": "const NODE_MAJOR_VERSION = process.versions.node.split('.')[0];\nif (!NODE_MAJOR_VERSION) {\n throw new Error('Node is no"
},
{
"path": "examples/development/nodejs/nodejs-yarn/package.json",
"chars": 208,
"preview": "{\n \"name\": \"nodejs-yarn\",\n \"main\": \"index.js\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"echo building...\",\n "
},
{
"path": "examples/development/php/latest/.envrc",
"chars": 255,
"preview": "# Automatically sets up your devbox environment whenever you cd into this\n# directory via our direnv integration:\n\neval "
},
{
"path": "examples/development/php/latest/.gitignore",
"chars": 7,
"preview": "vendor/"
},
{
"path": "examples/development/php/latest/README.md",
"chars": 1961,
"preview": "# PHP\n\nPHP projects can manage most of their dependencies locally with `composer`. Some PHP extensions, however, need to"
},
{
"path": "examples/development/php/latest/composer.json",
"chars": 96,
"preview": "{\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"ext-imagick\": \"*\",\n \"php\": \"^8.1\"\n }\n}\n"
},
{
"path": "examples/development/php/latest/devbox.d/php/php-fpm.conf",
"chars": 331,
"preview": "[global]\npid = ${PHPFPM_PID_FILE}\nerror_log = ${PHPFPM_ERROR_LOG_FILE}\ndaemonize = yes\n\n[www]\n; user = www-data\n; group "
},
{
"path": "examples/development/php/latest/devbox.d/php/php.ini",
"chars": 209,
"preview": "[php]\n\n; Put your php.ini directives here. For the latest default php.ini file, see https://github.com/php/php-src/blob/"
},
{
"path": "examples/development/php/latest/devbox.json",
"chars": 298,
"preview": "{\n \"packages\": [\n \"php83Extensions.xdebug@latest\",\n \"php83Extensions.imagick@latest\",\n \"php@latest\"\n ],\n \"en"
},
{
"path": "examples/development/php/latest/public/index.php",
"chars": 39,
"preview": "<?php\n\necho 'Hello world';\n\nphpinfo();\n"
},
{
"path": "examples/development/python/pip/.envrc",
"chars": 255,
"preview": "# Automatically sets up your devbox environment whenever you cd into this\n# directory via our direnv integration:\n\neval "
},
{
"path": "examples/development/python/pip/README.md",
"chars": 1710,
"preview": "# Python\n\nPython by default will attempt to install your packages globally, or in the Nix Store (which it does not have "
},
{
"path": "examples/development/python/pip/devbox.d/python310Packages.pip/venvShellHook.sh",
"chars": 379,
"preview": "SOURCE_DATE_EPOCH=$(date +%s)\n\nif [ -d \"$VENV_DIR\" ]; then\n echo \"Skipping venv creation, '${VENV_DIR}' already exist"
},
{
"path": "examples/development/python/pip/devbox.json",
"chars": 221,
"preview": "{\n \"packages\": [\n \"python@latest\",\n ],\n \"shell\": {\n \"init_hook\": [\n \". $VENV_DIR/bin/activate\",\n \"pip"
},
{
"path": "examples/development/python/pip/main.py",
"chars": 110,
"preview": "from emoji import emojize\n\nif __name__ == \"__main__\":\n print(emojize(\":rocket: Devbox with Pip :rocket:\"))\n"
},
{
"path": "examples/development/python/pip/requirements.txt",
"chars": 20,
"preview": "emoji==2.1.0\npytest\n"
},
{
"path": "examples/development/python/pipenv/Pipfile",
"chars": 183,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nemoji = \"==2.1.0\"\ngrpcio = \"*\"\n\n["
},
{
"path": "examples/development/python/pipenv/README.md",
"chars": 1335,
"preview": "\n# Python\n\nPython by default will attempt to install your packages globally, or in the Nix Store (which it does not have"
},
{
"path": "examples/development/python/pipenv/devbox.json",
"chars": 249,
"preview": "{\n \"packages\": [\n \"pipenv@latest\",\n \"python@3.10\"\n ],\n \"shell\": {\n \"init_hook\": [\n "
},
{
"path": "examples/development/python/pipenv/main.py",
"chars": 113,
"preview": "from emoji import emojize\n\nif __name__ == \"__main__\":\n print(emojize(\":rocket: Devbox with Pipenv :rocket:\"))\n"
}
]
// ... and 695 more files (download for full content)
About this extraction
This page contains the full source code of the jetify-com/devbox GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 895 files (1.8 MB), approximately 575.4k tokens, and a symbol index with 1720 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.