This library provides a virtual operating system to run Haskell App. Checkout the introduction blog post.
The goal of butler is to implement modular abstractions by simulating a traditional computer.
To validate the abstractions, the project also feature some proof of concept demos:
Serve App behind nginx with:
upstream butler {
server 127.0.0.1:8042;
}
server {
location / {
proxy_pass http://butler/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
}
Start the service with:
BUTLER_ADDR=http:8042 cabal run
A window-xp clone with support for multiple "seats":
Start the service with:
./bin/run-vnc
./bin/run-ghcid
firefox https://localhost:8080
Recover session from command line (after getting "Permission denied" error):
cabal run exe:butler -- run show-recovery $USERNAME
Use the electron client instead of firefox to forward your ssh-agent and enables Ctrl-T and Ctrl-N key code:
nix run --impure .#electron https://localhost:8080
Start the service with the pre-built container usage:
podman run -p 8080:8080 -v butler-data:/var/lib/butler --rm ghcr.io/butleros/haskell-butler:latest
Desktop workspace can be isolated using bubblewrap:
podman run --privileged --env BUTLER_ISOLATION=bwrap -p 8080:8080 -v butler-data:/var/lib/butler --rm ghcr.io/butleros/haskell-butler:latest
Contributions and bug reports are welcome! To work on this project you need a Haskell toolchain: get-started.
Run the ./bin/run-tests script to validate a commit.
Run the test through ghcid with: ./bin/run-ghcid Main.main.
Setup binary cache with: nix run nixpkgs/release-22.11#cachix use haskell-platform.
240 commits
50 commits
Haskell
96.0%
JavaScript
2.3%
Nix
1.6%
This library provides a virtual operating system to run Haskell App. Checkout the introduction blog post.
The goal of butler is to implement modular abstractions by simulating a traditional computer.
To validate the abstractions, the project also feature some proof of concept demos:
Serve App behind nginx with:
upstream butler {
server 127.0.0.1:8042;
}
server {
location / {
proxy_pass http://butler/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
}
Start the service with:
BUTLER_ADDR=http:8042 cabal run
A window-xp clone with support for multiple "seats":
Start the service with:
./bin/run-vnc
./bin/run-ghcid
firefox https://localhost:8080
Recover session from command line (after getting "Permission denied" error):
cabal run exe:butler -- run show-recovery $USERNAME
Use the electron client instead of firefox to forward your ssh-agent and enables Ctrl-T and Ctrl-N key code:
nix run --impure .#electron https://localhost:8080
Start the service with the pre-built container usage:
podman run -p 8080:8080 -v butler-data:/var/lib/butler --rm ghcr.io/butleros/haskell-butler:latest
Desktop workspace can be isolated using bubblewrap:
podman run --privileged --env BUTLER_ISOLATION=bwrap -p 8080:8080 -v butler-data:/var/lib/butler --rm ghcr.io/butleros/haskell-butler:latest
Contributions and bug reports are welcome! To work on this project you need a Haskell toolchain: get-started.
Run the ./bin/run-tests script to validate a commit.
Run the test through ghcid with: ./bin/run-ghcid Main.main.
Setup binary cache with: nix run nixpkgs/release-22.11#cachix use haskell-platform.
240 commits
50 commits
Haskell
96.0%
JavaScript
2.3%
Nix
1.6%