Releases: jetify-com/devbox
0.4.5-dev
What's New
This pre-release contains a preview numerous fixes and improvements based on user feedback. You can try out this pre-release of 0.4.5 by exporting DEVBOX_USE_VERSION=0.4.5-dev
- (#830, #832) Fixed a bug that broke direnv integrations after a version update.
devbox shell --print-dev-env
will now regenerate the underlying nix configs after a version update to ensure they are compatible with the Devbox CLI. - (#780) Added a
devbox install
command. This command can be used to install your devbox projects packages without starting a shell or running a script. - (#803) Installing packages while in
devbox shell
no longer requires a user to restart their shell or run a special command to update their path. This means you can now use packages as soon as you add them. - (#792) Devbox now automatically sets LD_LIBRARY_PATH and LIBRARY_PATH to point to your project's lib directory.
- (#772) Devbox now shows better progress (including download + installation progress) when adding packages
- (#785) Improvements to automatic port forwarding and remote services
What's Changed
- [nix] Simplify profile priority, make it match flake file by @mikeland86 in #770
- [docs] Update dependencies by @mikeland86 in #771
- [nix] Show nix profile install progress by @mikeland86 in #772
- [flakes] Remove non-flakes code by @mikeland86 in #777
- impl: fix shellrc tests by @gcurtis in #784
- Fix building target path by @hezhizhen in #782
- [ux] Add new refresh alias by @mikeland86 in #778
- [Cloud] Added cloud init command for open in vscode by @mohsenari in #758
- [services] Improve auto-port forward and proxy by @mikeland86 in #785
- [config] Set PATH as ENV instead of hook by @mikeland86 in #786
- [CLI] Added install command by @mohsenari in #780
- Move Devbox Examples to Devbox Repo by @Lagoja in #793
- [lib-path] Add a few common env variables by @mikeland86 in #792
- [services] Allow custom process compose by @mikeland86 in #791
- migrate links: devbox-examples -> devbox/examples by @Lagoja in #797
- Bump rack from 2.2.6.2 to 2.2.6.4 in /examples/stacks/rails/blog by @dependabot in #796
- Bump django from 4.1.6 to 4.1.7 in /examples/stacks/django by @dependabot in #795
- [testscripts] run in parallel by @savil in #802
- First Pass at a Haskell Package Planner by @Lagoja in #773
- [Lagobot 2.0] part 1: generate testscript for a single devbox example project by @savil in #799
- [Lagobot 2.0] part 2: run Examples whose run_test script passes by @savil in #801
- [Lagobot 2.0] part 3: set HOME to temp-dir to enable a few example projects by @savil in #806
- [vscode-extension] open vscode browser by @mohsenari in #804
- Improve installation instructions by @Lagoja in #805
- [Lagobot 2.0] disable haskell by @savil in #808
- [global] Allow and use multiple nixpkgs commit hashes if needed by @mikeland86 in #800
- Fix typo in pip plugin by @savil in #810
- typo: s/Poetry/Pip in Pip example by @savil in #811
- typo: s/Poetry/Pipenv in Pipenv example by @savil in #812
- [hooks] Fix hook order by @mikeland86 in #813
- [Lagobot] enable haskell by @savil in #809
- [vscode extension] Added getting working directory from
getvminfo()
by @mohsenari in #807 - Jl/lagobot fix rails by @Lagoja in #815
- Fix Elixir Example by @Lagoja in #816
- Adjust paths order by @hezhizhen in #787
- [lagobot] enable pip and django by @savil in #817
- [lagobot] add integration tag to separate the tests by @savil in #822
- [lagobot] run tests on DEVBOX_EXAMPLE_TESTS env-var, instead of build tag by @savil in #823
- [testscripts] respect DEVBOX_DEBUG flag instead of always setting it on by @savil in #824
- [lagobot] enable jekyll by @savil in #819
- [lagobot] enable pipenv by @savil in #820
- [CLI] Made generate ssh-config work without config file by @mohsenari in #826
- [lagobot] run cli-tests with DEVBOX_EXAMPLE_TESTS on main or input.run-example-tests by @savil in #827
- [nix] Create bin wrappers. Eliminate need to refresh by @mikeland86 in #803
- [lagobot] extend macos test timeout to 15 mins by @savil in #828
- [shellenv] PrintEnv should generate just in case by @mikeland86 in #830
- [direnv] Fix version path, run example tests on PRs by @mikeland86 in #832
- [lagobot] clear .devbox dirs by @savil in #833
- [UnifiedEnv] remove env-var from shell_test by @savil in #825
Full Changelog: 0.4.4...0.4.5-dev
0.4.4
What's new
- Devbox can now autocomplete with the scripts in your
devbox.json
. Typedevbox run
followed by TAB to view a list of available scripts.- You can install shell completions by copying the output of
devbox completion <shell-name>
to the appropriate place for your shell - Huge thanks to @hezhizhen for contributing this feature!
- You can install shell completions by copying the output of
- Services running in Devbox Cloud can now be accessed remotely via
<hostname>-<port>.svc.devbox.sh
. You will need to be logged in to access your services.- For example -- if you start an NGINX server on port 8081, you can access it by visiting
<hostname>-8081.svc.devbox.sh
- For example -- if you start an NGINX server on port 8081, you can access it by visiting
- Fixed an entrypoint bug in generated devcontainers and Dockerfiles
Thanks to:
@hezhizhen for contributing #775, and for contributing multiple edits to our documentation
Changelog
- [Docs] Updated docs for java to include fix for gradle by @mohsenari in #747
- add env to configuration by @Lagoja in #679
- ci: use DeterminateSystems Nix installer by @gcurtis in #755
- impl: don't error in resetProfileDir if profile doesn't exist by @gcurtis in #754
- testscripts: convert boxcli tests to testscripts by @gcurtis in #756
- ci: remove go test -race and -cover by @gcurtis in #757
- Simplify error handling by @hezhizhen in #741
- impl: remove mod time check from template tests by @gcurtis in #759
- [cloud] Print message telling users how they can access their services by @mikeland86 in #761
- Link
services.md
by @hezhizhen in #767 - Remove unnecessary verbs by @hezhizhen in #766
- Update global data path by @hezhizhen in #763
- Lowercase for commit by @hezhizhen in #764
- Wrap filename with quotes by @hezhizhen in #762
- [plugin] Added gradle plugin and fixed typo in docs by @mohsenari in #769
- feat: add scripts as valid args for shell completion by @hezhizhen in #775
- [devcontainer] Updated dockerfile to use devbox run dash dash by @mohsenari in #776
Full Changelog: 0.4.3...0.4.4
0.4.4-dev
What's New
devbox run
script autocompletion (contributed by @hezhizhen)- Fixed entrypoint for devcontainers
- Access services running in Devbox Cloud from your local machine
What's Changed
- [Docs] Updated docs for java to include fix for gradle by @mohsenari in #747
- add env to configuration by @Lagoja in #679
- ci: use DeterminateSystems Nix installer by @gcurtis in #755
- impl: don't error in resetProfileDir if profile doesn't exist by @gcurtis in #754
- testscripts: convert boxcli tests to testscripts by @gcurtis in #756
- ci: remove go test -race and -cover by @gcurtis in #757
- Simplify error handling by @hezhizhen in #741
- impl: remove mod time check from template tests by @gcurtis in #759
- [cloud] Print message telling users how they can access their services by @mikeland86 in #761
- Link
services.md
by @hezhizhen in #767 - Remove unnecessary verbs by @hezhizhen in #766
- Update global data path by @hezhizhen in #763
- Lowercase for commit by @hezhizhen in #764
- Wrap filename with quotes by @hezhizhen in #762
- [plugin] Added gradle plugin and fixed typo in docs by @mohsenari in #769
- feat: add scripts as valid args for shell completion by @hezhizhen in #775
- [devcontainer] Updated dockerfile to use devbox run dash dash by @mohsenari in #776
Full Changelog: 0.4.3...0.4.4-dev
0.4.3
What's New
Devbox is now powered by Nix Flakes
- Flakes are a new feature in the Nix Language that allows us to package software and create dev shells in a fully reproducible way. This has significant benefits for our ability to upgrade and cache evaluation results.
- Immediate benefit to users should be faster warm start times for Devbox Shell. We’ve seen some data that Devbox can start up a shell 70% faster after the first installation.
- Learn more by reading our blog: Devbox 0.4.3: Powered by Flakes
Declare environment variables in devbox.json.
- Developers can now declare environment variables in their
devbox.json
under theenv
object. For example, you can set variable$FOO
tobar
as follows:{ "packages": [ "python310" ], "env": { "FOO": "bar" }, "shell": { "init_hook": null, "nixpkgs": { "commit": "..." } }
- This lets developers better organize their devbox.json, and avoid lengthy
export
statements in their init_hook - For more details, check out our Docs
Bug Fixes in this Release
- Fixes a bug where Fish shell would fail to inherit host environment variables
- Fixed a bug where
devbox shellenv
was prepending an incorrect path. - Fixed a bug that could mangle a user’s PS1 when evaluating
devbox shellenv
- Fixed bugs in generated
devcontainer.json
, which would include some extensions multiple times
Special thanks to:
- @hezhizhen for contributing 4 PRs to this release
- @worldofgeese for reporting issues with devcontainer generation
- @PandaRyshan for reporting issues with Fish Shell
What's Changed
- Add revive linter and enable indent-error-flow rule by @hezhizhen in #651
- [flakes] enable featureflag by @savil in #716
- [Devcontainer] Fixed path for python interpreter in devcontainer.json by @mohsenari in #715
- [vscode extension] Fixed autorun shell on new terminal open bug by @mohsenari in #717
- [devcontainer] Fixed bug on multiple python extensions listed in devcontainer by @mohsenari in #718
- Fix fish shell after #706 by @ipince in #721
- Replace os.Setenv with t.Setenv in tests by @hezhizhen in #720
- Enable the Env in Config Feature by @Lagoja in #722
- [easy][code cleanup] move packages specific functions to impl/packages.go by @savil in #723
- [easy][cleanup] move nix.DevboxShell to impl.DevboxShell by @savil in #724
- [CICD] auto-nix-install: export env-var and add DEVBOX_DEBUG=1 by @savil in #727
- Clean up error handling and docs by @hezhizhen in #726
- [cicd] auto-nix-install: set github access token by @savil in #728
- Remove obsolete code after unified env by @ipince in #729
- Remove dead code by @ipince in #732
- Shellenv prepends to original path, not current path by @ipince in #730
- plansdk: get cloud cache from environment by @gcurtis in #734
- Escape env vars in shellenv the same way as in shellrc by @ipince in #731
- Plugin Contributing Guide by @Lagoja in #611
- Remove more dead code by @ipince in #735
- [xdg]: unexport xxxDir() and use xxxSubpath() only by @hezhizhen in #733
- Fix build: only go:embed .json files in plugins dir by @ipince in #743
- Fix quickstart button to link to tutorial by @Lagoja in #737
- Include plugin subdirs by @ipince in #746
- [config] early return if cannot find GlobalDataPath by @savil in #739
- [flakes] Assign higher priority to later packages to resolve conflicting packages error by @savil in #738
- Update and activate stale-issue-cleanup by @Lagoja in #665
- nix,impl: avoid modifying flake.nix; don't use --impure by @gcurtis in #749
- ci: enable DEVBOX_DEBUG for all test jobs by @gcurtis in #751
- testscripts: enable DEVBOX_DEBUG by @gcurtis in #752
- [allow unfree] add --impure and env-var to nix profile commands by @savil in #753
- all: add tracing by @gcurtis in #750
Full Changelog: 0.4.2...0.4.3
0.4.2
What's New
- Use local environment variables in Devbox Shell: Environment variables that you set in your Host shell will now be available in your Devbox Shell. This improves compatibility with tools on your host machine, and is useful for passing secrets or other configuration into your Devbox shell without having to set them in your
devbox.json
. - More reliable Nix Setup: Improvements to
devbox setup nix
help users avoid some common pitfalls or errors that can happen during Nix Installation
Special thanks to @gfriloux, @worldofgeese, @StephenStrickland and others who reported issues and gave feedback that informed this release.
Changelog
- c249fa1 [spell check cicd] do not run on main branch, and ignore .svg files (#714)
- 0d0374e nix: inherit all environment variables in shell (#706)
- 706ac42 [CICD]: add spell chcker to GitHub action (#658)
- a1d3832 Improve handling when no SHELL env-var is defined (#700)
- e12d3b6 [CICD] Fix mac tests (#712)
- 30e191f [nix] Add additional source path (#711)
- 2b4482e [easy] Fix vulnerabilities in example (#713)
- 09006bc [cicd] add NIX_PATH to tests (#708)
- 5158452 [WSL] Don't allow root nix instalation on WSL (#709)
- cf22dcc [flakes] add php extensions testscript (#701)
- e6fcf5d ci: set NIX_PATH after installing Nix (#707)
- d01209d [nix] Always do multi-user install if root (#703)
- 94b34ef [nix] Check other locations for nix startup and better error (#702)
- ef3e4a2 [deps] Update go dependencies (#704)
- abc008c [global] Unify nix profile install (#695)
- b74e651 [easy][global] Set lower priority for global (#698)
- f2ad449 [easy][errors] Fix double error (#699)
- e5aaf97 [flakes] ensure all golang tests pass when flakes flag is enabled (#697)
- 999dcf6 [flakes] save commit-hash to file, and inspect prior to prefetching nixpkgs (#681)
0.4.2-dev
What's New
- Keep your local environment variables in Devbox Shell: Environment variables that you set in your Host shell will now be available in your Devbox Shell. This is useful for passing secrets or other configuration into your devbox shell without having to set them in your devbox.json.
- Improves Nix setup to reduce some common issues with the Nixos installer
Changelog
- c249fa1 [spell check cicd] do not run on main branch, and ignore .svg files (#714)
- 0d0374e nix: inherit all environment variables in shell (#706)
- 706ac42 [CICD]: add spell chcker to GitHub action (#658)
- a1d3832 Improve handling when no SHELL env-var is defined (#700)
- e12d3b6 [CICD] Fix mac tests (#712)
- 30e191f [nix] Add additional source path (#711)
- 2b4482e [easy] Fix vulnerabilities in example (#713)
- 09006bc [cicd] add NIX_PATH to tests (#708)
- 5158452 [WSL] Don't allow root nix instalation on WSL (#709)
- cf22dcc [flakes] add php extensions testscript (#701)
- e6fcf5d ci: set NIX_PATH after installing Nix (#707)
- d01209d [nix] Always do multi-user install if root (#703)
- 94b34ef [nix] Check other locations for nix startup and better error (#702)
- ef3e4a2 [deps] Update go dependencies (#704)
- abc008c [global] Unify nix profile install (#695)
- b74e651 [easy][global] Set lower priority for global (#698)
- f2ad449 [easy][errors] Fix double error (#699)
- e5aaf97 [flakes] ensure all golang tests pass when flakes flag is enabled (#697)
- 999dcf6 [flakes] save commit-hash to file, and inspect prior to prefetching nixpkgs (#681)
0.4.1
What's new
This release fixes a perimssions error in devbox shell
on hosts where the TMPDIR environment variable is unset.
See PR #691 for more details
Changelog
0.4.0: Devbox Global, Unified Env, and more
This release adds a few major new features to Devbox:
- Devbox Global lets you add packages to include across all your Devbox Shells
- Improved Shell Env ensures better consistency in your Devbox environment across shells and commands
Devbox Global Packages
Devbox Global allows you to add packages to a global devbox.json.
This is useful for installing a standard set of tools you want to use across multiple Devbox Projects. You can also use Devbox Global to install and manage packages on your Host OS, as a substitute for tools like brew
or apt-get
For example — if you use ripgrep as your preferred search tool, you can add it to your global Devbox profile with devbox global add ripgrep
. Now whenever you start a Devbox shell, you will have ripgrep available, even if it's not in the project's devbox.json.
Learn more about Devbox Global
Improved Shell Env
All shells and commands now use a unified environment to determine the correct environment variables and hooks to run, ensuring that you get a consistent environment wherever you run Devbox. The environment can also be printed via devbox shellenv
Note, if you used an earlier version of Devbox to generate a .envrc
for direnv, you will need to regenerate it using devbox generate .envrc --force
. See our Direnv docs for more details.
Other changes in 0.4.0
- Fixed an issue with Fish shell where
init_hooks
failed to run when starting Devbox Shell - Dockerfiles created with
devbox generate
now have the correct permissions devbox run
can now be used to run arbitrary commands. For example:devbox run date
will rundate
in your Devbox shell, even if you have not created a script with that name.
Special thanks to:
@hezhizhen for contributing a PR to this release
@gfriloux, @worldofgeese, @mindreframer for reporting issues addressed in this release
What's Changed
- Add some basic devbox run testscript tests by @ipince in #632
- Set PATH prepend after user init file runs by @ipince in #634
- tmpl: run nixpkgs-fmt on nix files by @gcurtis in #636
- Add tests for PATH setting in run by @ipince in #633
- [dependabot] Fix vulnerability in example by @mikeland86 in #638
- [direnv] Added support for config envs in direnv by @mohsenari in #626
- [global] Implement simple global pull by @mikeland86 in #630
- [global] Move global to XDG_DATA_HOME by @mikeland86 in #637
- Include some more shell-specific vars, remove nix shell hook by @ipince in #635
- Prevent shell inception when using print-dev-env by @ipince in #640
- [refactor]: make getGithubUsername clearer by @hezhizhen in #641
- boxcli: add
devbox global shellenv
command by @gcurtis in #644 - Add testscript tests for config env vars by @ipince in #643
- Deprecate shell -- in favor of run by @ipince in #642
- Add tests for env var application order by @ipince in #645
- Add tests for passing args to run scripts by @ipince in #647
- [flake] php extensions example project by @savil in #631
- Update devbox run help text by @ipince in #517
- Remove dot from flag help text by @ipince in #649
- Fix cli-release badge by @ipince in #653
- Add testscript tests for PATH setting by @ipince in #646
- Bump golang.org/x/net from 0.2.0 to 0.7.0 by @dependabot in #654
- [generate] Fixed permission issue for generated dockerfile by @mohsenari in #657
- Add shellrc tests for unified env by @ipince in #660
- Write shellrc file on fish (unified env) by @ipince in #661
- [flakes] generate flake.nix file for php-related packages by @savil in #639
- [services] MVP process manager by @mikeland86 in #659
- [service-manager] Add more process compose yamls by @mikeland86 in #663
- Enable unified env by default by @ipince in #650
- [shellenv] Remove nix profile from path, add shellenv command by @mikeland86 in #667
- [easy][global] Fix duplicate packages DEV-1281 by @mikeland86 in #672
- [flakes] remove shell hook by @savil in #671
- [easy][global] Fix tests when global pkgs exist DEV-1280 by @mikeland86 in #673
- [flakes] enable unfree packages by @savil in #670
- Add support for fish by @ipince in #669
- [stderr] Fix a few prints that were going to out instead of err DEV-1282 by @mikeland86 in #674
- [nix] create common ExperimentalFlags function by @savil in #678
- Add Pip Docs by @Lagoja in #664
- Add Django Example Docs by @Lagoja in #676
- Unhide Global by @Lagoja in #683
- Fix whitespace in fish shellrc template by @ipince in #686
Full Changelog: 0.3.4...0.4.0
0.4.0-dev
What's New in this Pre-release
- Initial improvements to devbox services, using process-compose
- Global Package Installation via devbox global add
- Devbox Unified Env -- Devbox now runs more consistently across
shell
,run
, andservices
- Fixed a Permissions issue with generated Dockerfiles (Issue #627 )
- Deprecate shell -- in favor of run
To try this pre-release, export DEVBOX_USE_VERSION=0.4.0-dev
in your shell. If you installed a previous pre-release, you may need to run rm ~/.cache/devbox/bin
to clear your prior versions.
Changelog
- 0eda044 [shellenv] Remove nix profile from path, add shellenv command (#667)
- 0fdee09 Enable unified env by default (#650)
- bd92912 [service-manager] Add more process compose yamls (#663)
- f77daf6 [services] MVP process manager (#659)
- 94aa7d4 [flakes] generate flake.nix file for php-related packages (#639)
- a9ee3cd Write shellrc file on fish (unified env) (#661)
- 7fb3374 Add shellrc tests for unified env (#660)
- 4928aea [generate] Fixed permission issue for generated dockerfile (#657)
- 8669472 Bump golang.org/x/net from 0.2.0 to 0.7.0 (#654)
- 37cde08 Add testscript tests for PATH setting (#646)
- 446280a Fix cli-release badge (#653)
- a3806cc Remove dot from flag help text (#649)
- 30eda19 Update devbox run help text (#517)
- 22b5b48 [flake] php extensions example project (#631)
- 115a215 Add tests for passing args to run scripts (#647)
- da82540 Add tests for env var application order (#645)
- 1a9d0e8 Deprecate shell -- in favor of run (#642)
- 39e13f6 Add testscript tests for config env vars (#643)
- 35752b3 boxcli: add
devbox global shellenv
command (#644) - 5cc31e8 [refactor]: make getGithubUsername clearer (#641)
- abb0d74 Prevent shell inception when using print-dev-env (#640)
- 5c593ec Include some more shell-specific vars, remove nix shell hook (#635)
- 1aa41bc [global] Move global to XDG_DATA_HOME (#637)
- 2f532b6 [global] Implement simple global pull (#630)
- 6ba4091 [direnv] Added support for config envs in direnv (#626)
- 4d7a69f [dependabot] Fix vulnerability in example (#638)
- 33e20c5 Add tests for PATH setting in run (#633)
- 296dfde tmpl: run nixpkgs-fmt on nix files (#636)
- 73a28cb Set PATH prepend after user init file runs (#634)
- 171acdf Add some basic devbox run testscript tests (#632)
0.3.4
What's New
Version 0.3.4 has a number of bug fixes and workflow improvements, including:
- Better UX and reliability for installing packages and starting a Devbox Shell
- A
pip
plugin that automatically activates a virtual environment for installing packages - Automatic port-forwarding when services are started in Devbox Cloud Shell from the CLI
Changelog
- 3112b8e [flakes] explain better nixpkgs prefetch during devbox add (#624)
- a474c16 [devbox.json] Added env in config (#609)
- 5a97bb9 [bug fix] update Env caller to use map instead of key=val array (#625)
- f5821a8 [flakes] enable native nixpkgs download progress output (#623)
- 0892e0e Refactor env vars as map[string]string instead of []string (#621)
- b4014e8 [global] Turn on feature, keep command hidden (#622)
- d92cbb7 Clean PATH of nix profile paths in print-dev-env shell/run (#618)
- 3bf9582 Add Docsearch (#619)
- 5e2d408 [home] Merge global packages when doing shell/run (#604)
- 3ca7a41 Remove obsolete var and simplify cleanEnvPath() (#617)
- 0caff40 Unify print-dev-env feature flags (#620)
- f1b0c6f [global] Use non default profile and improve error handling when adding/removing global packages (#603)
- d47bbb8 Add virtenv path and nix profile path to computed nix path (#616)
- 396ce62 [flake] remove buildEnv from flake.nix (#615)
- 93a8688 [flakes] reset nix profile directory when Flakes feature is toggled (#612)
- 60a4f60 [cloud] Auto-port forward during cloud shell (#586)
- 29829dc [flakes] remove special-case env-var TERM (#614)
- 3ab8448 Add a default stale issue workflow (#613)
- 0d67823 remove devbox-linux-amd64 (#610)
- 517938f [flakes] add and remove packages, individually (#597)
- d644ea8 Add Devbox Instructions to CONTRIBUTING.md (#607)
- b4d60c4 [github merge queue] enable Github Workflows for merge-queue (#606)
- 03e9474 devbox shell uses computeNixEnv (#605)
- cf32331 Create unified function for nix env computation (#591)
- 67b33c2 [global] MVP of devbox global/home (#599)
- daf0596 Refactor testscript framework (#601)
- c173233 remove unused pkgs.go from internal/impl (#600)
- 0d393ee [flakes | print-dev-env] enable flakes to work with print-dev-env (#584)
- c05d145 [cleanup] remove old package install for flakes (#598)
- dc701d5 [docusaurus] Bump docusaurus version to remove vulnerable dependencies (#595)
- 5dc5326 [easy][plugins] User init hooks should run after plugins (#594)
- f67454d Bump http-cache-semantics from 4.1.0 to 4.1.1 in /docs/app (#582)
- dee5576 [Plugin] Add a plugin for
python3xxPackage.pip
(#592) - 9e37940 [bugfix] Arbitrary commands should also run init and plugin hooks (#550)
- de39956 Add more metadata to error reports (#576)
- c753514 [polish] add newline to end of multi-add/rm packages (#589)
- e5f4256 [telemetry] do not log hidden commands to segment Command Events (#588)
- 7f087d4 [RFC] make Telemetry UserID be a uuid string (#574)
- 134b654 [telemetry] fix missing UserID for command events (#583)
- 68f6d2b [cloud] Auto-forward ports when services start (#490)