├── layouts ├── partials │ └── sidebar.html └── _default │ ├── summary.html │ └── single.html ├── themes └── blank │ ├── static │ └── css │ │ └── style.css │ ├── images │ ├── tn.png │ ├── splash.png │ └── screenshot.png │ ├── archetypes │ └── default.md │ ├── layouts │ ├── partials │ │ ├── footer.html │ │ ├── pagination.html │ │ ├── sidebar.html │ │ └── header.html │ ├── index.html │ └── _default │ │ ├── summary.html │ │ ├── list.html │ │ ├── single.html │ │ └── baseof.html │ ├── theme.toml │ ├── README.md │ └── LICENSE ├── static ├── robots.txt ├── favicon.ico └── css │ └── style.css ├── content └── posts │ └── m1dev │ ├── vscode-nixos.png │ └── index.md ├── .gitignore ├── config.toml ├── netlify.toml └── .devcontainer ├── Dockerfile └── devcontainer.json /layouts/partials/sidebar.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /themes/blank/static/css/style.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Allow: / -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CoR/blog/master/static/favicon.ico -------------------------------------------------------------------------------- /themes/blank/images/tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CoR/blog/master/themes/blank/images/tn.png -------------------------------------------------------------------------------- /themes/blank/images/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CoR/blog/master/themes/blank/images/splash.png -------------------------------------------------------------------------------- /content/posts/m1dev/vscode-nixos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CoR/blog/master/content/posts/m1dev/vscode-nixos.png -------------------------------------------------------------------------------- /themes/blank/images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CoR/blog/master/themes/blank/images/screenshot.png -------------------------------------------------------------------------------- /themes/blank/archetypes/default.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "{{ replace .Name "-" " " | title }}" 3 | date = {{ .Date }} 4 | +++ 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /public 2 | 3 | ## OS Files 4 | # Windows 5 | Thumbs.db 6 | ehthumbs.db 7 | Desktop.ini 8 | $RECYCLE.BIN/ 9 | 10 | # OSX 11 | .DS_Store 12 | 13 | -------------------------------------------------------------------------------- /themes/blank/layouts/partials/footer.html: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /layouts/_default/summary.html: -------------------------------------------------------------------------------- 1 |
2 |

3 | {{ .Title }} 4 | 5 |

6 | 7 | {{ range .Params.tags }} 8 | {{ . }} 9 | {{ end }} 10 |
-------------------------------------------------------------------------------- /themes/blank/layouts/partials/pagination.html: -------------------------------------------------------------------------------- 1 |
2 | {{ if .Paginator.HasPrev }} 3 | Previous Page 4 | {{ end }} 5 | {{ .Paginator.PageNumber }} of {{ .Paginator.TotalPages }} 6 | {{ if .Paginator.HasNext }} 7 | Next Page 8 | {{ end }} 9 |
10 | -------------------------------------------------------------------------------- /themes/blank/layouts/index.html: -------------------------------------------------------------------------------- 1 | {{ define "main" }} 2 |
3 | {{ $paginator := .Paginate (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) }} 4 | {{ range $paginator.Pages }} 5 | {{ .Render "summary" }} 6 | {{ end }} 7 | {{ partial "pagination.html" . }} 8 |
9 | {{ partial "sidebar.html" . }} 10 | {{ end }} 11 | -------------------------------------------------------------------------------- /themes/blank/layouts/partials/sidebar.html: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /themes/blank/theme.toml: -------------------------------------------------------------------------------- 1 | name = "Blank" 2 | license = "MIT" 3 | licenselink = "https://github.com/vimux/blank/blob/master/LICENSE" 4 | description = "Starter Hugo theme for developers." 5 | homepage = "https://github.com/vimux/blank/" 6 | tags = ["blog", "plain", "blank", "starter", "development"] 7 | features = ["blog"] 8 | min_version = "0.20" 9 | 10 | [author] 11 | name = "Vimux" 12 | homepage = "https://github.com/vimux" 13 | -------------------------------------------------------------------------------- /themes/blank/layouts/_default/summary.html: -------------------------------------------------------------------------------- 1 |
2 |

{{ .Title }}

3 | 4 | {{ range .Params.tags }} 5 | {{ . }} 6 | {{ end }} 7 |
8 | {{ .Summary }} 9 | {{ if .Truncated }} 10 | Read more... 11 | {{ end }} 12 |
13 |
14 | -------------------------------------------------------------------------------- /themes/blank/layouts/_default/list.html: -------------------------------------------------------------------------------- 1 | {{ define "main" }} 2 |
3 | {{ if or .Title .Content }} 4 |
5 | {{ with .Title }}

{{ . }}

{{ end }} 6 | {{ with .Content }}
{{ . }}
{{ end }} 7 |
8 | {{ end }} 9 | 10 | {{ range .Paginator.Pages }} 11 | {{ .Render "summary" }} 12 | {{ end }} 13 | {{ partial "pagination.html" . }} 14 |
15 | {{ partial "sidebar.html" . }} 16 | {{ end }} 17 | -------------------------------------------------------------------------------- /config.toml: -------------------------------------------------------------------------------- 1 | baseURL = "https://calcagno.blog/" 2 | languageCode = "en-us" 3 | title = "Santiago Calcagno" 4 | theme = "blank" 5 | 6 | [markup] 7 | [markup.highlight] 8 | noClasses = false 9 | 10 | [menu] 11 | [[menu.main]] 12 | name = "GitHub" 13 | url = "https://github.com/santicalcagno" 14 | [[menu.main]] 15 | name = "LinkedIn" 16 | url = "https://linkedin.com/in/santicalcagno" 17 | 18 | [permalinks] 19 | posts = "/:slug" -------------------------------------------------------------------------------- /themes/blank/layouts/partials/header.html: -------------------------------------------------------------------------------- 1 |
2 | {{ .Site.Title }} 3 | {{ with .Site.Menus.main }} 4 | 13 | {{ end }} 14 |
15 | -------------------------------------------------------------------------------- /layouts/_default/single.html: -------------------------------------------------------------------------------- 1 | {{ define "main" }} 2 |
3 |
4 |

{{ .Title }}

5 | 6 | {{ .Content }} 7 | {{ with .Params.tags }} 8 | 13 | {{ end }} 14 |
15 |
16 | {{ partial "sidebar.html" . }} 17 | {{ end }} -------------------------------------------------------------------------------- /themes/blank/layouts/_default/single.html: -------------------------------------------------------------------------------- 1 | {{ define "main" }} 2 |
3 |
4 |

{{ .Title }}

5 | 6 |
7 | {{ .Content }} 8 |
9 | {{ with .Params.tags }} 10 |
11 |
    12 | {{ range . }} 13 |
  • {{ . }}
  • 14 | {{ end }} 15 |
16 |
17 | {{ end }} 18 | {{ with .Site.DisqusShortname }} 19 |
20 | {{ template "_internal/disqus.html" . }} 21 |
22 | {{ end }} 23 |
24 |
25 | {{ partial "sidebar.html" . }} 26 | {{ end }} 27 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "public" 3 | command = "hugo" 4 | 5 | [context.production.environment] 6 | HUGO_VERSION = "0.75.1" 7 | HUGO_ENV = "production" 8 | HUGO_ENABLEGITINFO = "true" 9 | 10 | [context.split1] 11 | command = "hugo --enableGitInfo" 12 | 13 | [context.split1.environment] 14 | HUGO_VERSION = "0.75.1" 15 | HUGO_ENV = "production" 16 | 17 | [context.deploy-preview] 18 | command = "hugo -b $DEPLOY_PRIME_URL" 19 | 20 | [context.deploy-preview.environment] 21 | HUGO_VERSION = "0.75.1" 22 | 23 | [context.branch-deploy] 24 | command = "hugo -b $DEPLOY_PRIME_URL" 25 | 26 | [context.branch-deploy.environment] 27 | HUGO_VERSION = "0.75.1" 28 | 29 | [context.next.environment] 30 | HUGO_ENABLEGITINFO = "true" 31 | 32 | 33 | -------------------------------------------------------------------------------- /themes/blank/layouts/_default/baseof.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {{ .Title }} 8 | {{ with .Site.Params.description }}{{ end }} 9 | {{ with .Site.Params.author }}{{ end }} 10 | 11 | {{ with .OutputFormats.Get "RSS" -}} 12 | {{ printf `` .Rel .MediaType.Type .RelPermalink $.Site.Title | safeHTML }} 13 | {{- end }} 14 | 15 | 16 | {{ partial "header" . }} 17 | {{ block "main" . }}{{ end }} 18 | {{ partial "footer" . }} 19 | 20 | 21 | -------------------------------------------------------------------------------- /themes/blank/README.md: -------------------------------------------------------------------------------- 1 | # Blank 2 | 3 | Blank — starter [Hugo](https://gohugo.io/) theme for developers. Use it to make your own theme. 4 | 5 | [Live Demo](https://themes.gohugo.io/theme/blank/) 6 | 7 | ![Blank theme screenshot](https://github.com/Vimux/blank/blob/master/images/splash.png) 8 | 9 | ## Installation 10 | 11 | In your Hugo site `themes` directory, run: 12 | 13 | ``` 14 | git clone https://github.com/vimux/blank 15 | ``` 16 | 17 | Next, open `config.toml` in the base of the Hugo site and ensure the theme option is set to `blank`. 18 | 19 | ``` 20 | theme = "blank" 21 | ``` 22 | 23 | For more information read the official [quick start guide](https://gohugo.io/getting-started/quick-start/) of Hugo. 24 | 25 | ## Contributing 26 | 27 | Have you found a bug or got an idea for a new feature? Feel free to use the [issue tracker](https://github.com/Vimux/blank/issues) to let me know. Or make directly a [pull request](https://github.com/Vimux/blank/pulls). 28 | 29 | ## License 30 | 31 | This theme is released under the [MIT license](https://github.com/Vimux/blank/blob/master/LICENSE). 32 | -------------------------------------------------------------------------------- /themes/blank/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Vimux 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.13 2 | 3 | # VARIANT can be either 'hugo' for the standard version or 'hugo_extended' for the extended version. 4 | ARG VARIANT=hugo 5 | # VERSION can be either 'latest' or a specific version number 6 | ARG VERSION=latest 7 | 8 | # Download and patch selected Hugo binary 9 | RUN apt-get update && apt-get install -y ca-certificates openssl git curl && \ 10 | rm -rf /var/lib/apt/lists/* && \ 11 | case ${VERSION} in \ 12 | latest) \ 13 | export VERSION=$(curl -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4)}') ;;\ 14 | esac && \ 15 | echo ${VERSION} && \ 16 | wget -O ${VERSION}.tar.gz https://github.com/gohugoio/hugo/releases/download/v${VERSION}/${VARIANT}_${VERSION}_Linux-64bit.tar.gz && \ 17 | tar xf ${VERSION}.tar.gz && \ 18 | mv hugo* /usr/bin/hugo && \ 19 | go get github.com/yaegashi/muslstack && \ 20 | muslstack -s 0x800000 /usr/bin/hugo 21 | 22 | # Copy patched hugo binary from build stage 23 | FROM mcr.microsoft.com/vscode/devcontainers/base 24 | COPY --from=0 /usr/bin/hugo /usr/bin 25 | EXPOSE 1313 26 | 27 | # [Optional] Uncomment this section to install additional OS packages you may want. 28 | # 29 | # RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ 30 | # && apt-get -y install --no-install-recommends 31 | 32 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.134.1/containers/hugo 3 | { 4 | "name": "Hugo", 5 | "build": { 6 | "dockerfile": "Dockerfile", 7 | "args": { 8 | // Update VARIANT to pick hugo variant. 9 | // Example variants: hugo, hugo_extended 10 | // Rebuild the container if it already exists to update. 11 | "VARIANT": "hugo", 12 | // Update VERSION to pick a specific hugo version. 13 | // Example versions: latest, 0.73.0, 0,71.1 14 | // Rebuild the container if it already exists to update. 15 | "VERSION": "latest", 16 | } 17 | }, 18 | // Set *default* container specific settings.json values on container create. 19 | "settings": { 20 | "terminal.integrated.shell.linux": "/bin/zsh" 21 | }, 22 | // Add the IDs of extensions you want installed when the container is created. 23 | "extensions": [ 24 | "bungcip.better-toml", 25 | "davidanson.vscode-markdownlint" 26 | ], 27 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 28 | "forwardPorts": [ 29 | 1313 30 | ], 31 | // Use 'postCreateCommand' to run commands after the container is created. 32 | // "postCreateCommand": "uname -a", 33 | // Uncomment to use Docker from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker. 34 | // "mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" ], 35 | // Uncomment when using a ptrace-based debugger like C++, Go, and Rust 36 | // "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], 37 | // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. 38 | "remoteUser": "vscode" 39 | } -------------------------------------------------------------------------------- /static/css/style.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --background-body: #ffffff; 3 | --background: #efefef; 4 | --background-alt: #f7f7f7; 5 | 6 | --text-main: #363636; 7 | --text-bright: #000000; 8 | --text-muted: #999999; 9 | 10 | --links: #0076d1; 11 | --focus: #0096bfab; 12 | --border: #dbdbdb; 13 | --code: #000000; 14 | 15 | --variable: #39a33c; 16 | --highlight: #ffff00; 17 | } 18 | 19 | @media (prefers-color-scheme: dark) { 20 | :root { 21 | --background-body: #202b38; 22 | --background: #161f27; 23 | --background-alt: #1a242f; 24 | 25 | --text-main: #dbdbdb; 26 | --text-bright: #ffffff; 27 | --text-muted: #717880; 28 | 29 | --links: #41adff; 30 | --focus: #0096bfab; 31 | --border: #dbdbdb; 32 | --code: #ffbe85; 33 | 34 | --variable: #d941e2; 35 | --highlight: #efdb43; 36 | } 37 | } 38 | 39 | body { 40 | font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; 41 | line-height: 1.4; 42 | 43 | max-width: 800px; 44 | margin: 20px auto; 45 | padding: 0 10px; 46 | 47 | color: var(--text-main); 48 | background: var(--background-body); 49 | 50 | text-rendering: optimizeLegibility; 51 | } 52 | 53 | h1 { 54 | font-size: 2.2em; 55 | margin-top: 0; 56 | } 57 | 58 | h1, h2, h3, h4, h5, h6 { 59 | margin-bottom: 12px; 60 | color: var(--text-bright); 61 | font-weight: 600; 62 | } 63 | 64 | strong { 65 | color: var(--text-bright); 66 | font-weight: 600; 67 | } 68 | 69 | b, th { 70 | font-weight: 600; 71 | } 72 | 73 | a { 74 | text-decoration: none; 75 | color: var(--links); 76 | } 77 | 78 | a:hover { 79 | text-decoration: underline; 80 | } 81 | 82 | mark { 83 | background-color: var(--highlight); 84 | border-radius: 2px; 85 | padding: 0px 2px 0px 2px; 86 | color: #000000; 87 | } 88 | 89 | blockquote , q{ 90 | border-left: 4px solid var(--focus); 91 | margin: 1.5em 0em; 92 | padding: 0.5em 1em; 93 | font-style: italic; 94 | } 95 | 96 | blockquote > footer { 97 | font-style: normal; 98 | border: 0; 99 | } 100 | 101 | blockquote cite { 102 | font-style: normal; 103 | } 104 | 105 | code, samp, time { 106 | background: var(--background); 107 | color: var(--code); 108 | padding: 2.5px 5px; 109 | border-radius: 6px; 110 | font-size: 1em; 111 | } 112 | 113 | pre > code { 114 | padding: 10px; 115 | display: block; 116 | overflow-x: auto; 117 | } 118 | 119 | a code { 120 | color: var(--links); 121 | } 122 | 123 | var { 124 | color: var(--variable); 125 | font-style: normal; 126 | font-family: monospace; 127 | } 128 | 129 | kbd { 130 | background: var(--background); 131 | border: 1px solid var(--border); 132 | border-radius: 2px; 133 | color: var(--text-main); 134 | padding: 2px 4px 2px 4px; 135 | } 136 | 137 | img { 138 | max-width: 100%; 139 | height: auto; 140 | } 141 | 142 | hr { 143 | border: none; 144 | border-top: 1px solid var(--border); 145 | } 146 | 147 | table { 148 | border-collapse: collapse; 149 | margin-bottom: 10px; 150 | width: 100%; 151 | } 152 | 153 | td, th { 154 | padding: 6px; 155 | text-align: left; 156 | } 157 | 158 | thead { 159 | border-bottom: 1px solid var(--border); 160 | } 161 | 162 | tfoot { 163 | border-top: 1px solid var(--border); 164 | } 165 | 166 | tbody tr:nth-child(even) { 167 | background-color: var(--background-alt); 168 | } 169 | 170 | footer { 171 | border-top: 1px solid var(--background); 172 | padding-top: 10px; 173 | font-size: 0.8em; 174 | color: var(--text-muted); 175 | } -------------------------------------------------------------------------------- /content/posts/m1dev/index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "M1 dev setup using a NixOS virtual machine" 3 | date = 2021-08-01 4 | slug = "m1dev" 5 | +++ 6 | 7 | For the last two months I have been doing dev work on an M1 MacBook Air. Kind of a big change in retrospective, having used Linux in bare metal almost uninterruptedly for 10 years, give or take. Needless to say at this point, the hardware is great and the main reason that made me go with it, and I did not find any blockers on the software side for the things I normally do. 8 | 9 | One of the reasons I suspect made everything a bit smoother is being prepared to leverage my comfort using Linux to set up a [virtual machine](https://gopensource.com/m1-dev-setup-with-a-virtual-linux-box-1a2688231667?gi=1e171b8d2228) with [UTM](https://mac.getutm.app/) (a frontend for [QEMU](https://www.qemu.org/) in macOS) or [Docker containers](https://code.visualstudio.com/docs/remote/containers) using the Docker Desktop app for my work. Given that Docker in macOS uses virtualization to run a Linux kernel anyway, I decided to go with the "bare" VM approach for more ~~tinkering~~ control. 10 | 11 | [NixOS](https://nixos.org/) and Nix were also tools I wanted to start using more instead of on-and-off experiments as I was doing. I feel like giving even an intro to these projects would make this post quite long because they can do [a lot](https://nix.dev)! But I can mention that I felt attracted to try them, among others, because I can: 12 | 13 | - handle multiple development environments with [`nix-shell`](https://nix.dev/tutorials/declarative-and-reproducible-developer-environments); 14 | - backup my `configuration.nix` file and treat my VM as something I can torch whenever I want - for the most part, the VM "state" and configuration including programs are encapsulated there in a declarative form; 15 | - have a "reasonable" level of reproducibility within reach by pinning `nixpkgs` to a commit hash; 16 | - start with a console-only NixOS VM that I SSH into, and use its configuration as a baseline in case I want to run NixOS in the Air natively by the time Linux is ready for it ([soon™](https://asahilinux.org/)), adding a [graphical session](https://twitter.com/mitchellh/status/1346136404682625024) and stuff like that. 17 | 18 | When I started looking into running NixOS using UTM, I could not find a proper ISO to boot with, so I went with Ubuntu + Nix to hit the ground running. This week I decided to search again and I finally could find an image in the [UEFI](https://nixos.wiki/wiki/NixOS_on_ARM/UEFI) section of [NixOS on ARM](https://nixos.wiki/wiki/NixOS_on_ARM). I do not know why I did not find it earlier, but eh. Incidentally I also found another reference in a [blog post](https://grahamc.com/blog/nixos-on-framework) by a NixOS dev this week. 19 | 20 | So the [release](https://hydra.nixos.org/jobset/nixos/release-21.05#tabs-jobs) and [unstable](https://hydra.nixos.org/jobset/nixos/trunk-combined#tabs-jobs) ISOs can be found at Hydra, NixOS' CI system. Search for "`nixos.iso_minimal`" there and you will get the latest built ones. I went with the `nixos.iso_minimal_new_kernel.aarch64-linux` from the unstable branch, mainly because I can roll back to a previous machine state easily from the boot menu if something breaks, but I imagine going with the release version would be OK as well. You can always [pick single packages](https://discourse.nixos.org/t/installing-only-a-single-package-from-unstable/5598) from unstable if you want to. 21 | 22 | After downloading and mounting the ISO in a newly created VM, I followed the [installation section](https://nixos.org/manual/nixos/stable/index.html#sec-installation) of the manual pretty much verbatim. I did not have to configure GRUB as stated in the ARM section of the wiki for this setup. Also, take into account that you have to forward port 22 (or the one you use for SSH) to some other local port in your machine in the configuration of the VM in UTM to access it from macOS. 23 | 24 | ![Visual Studio Code window showing NixOS as the output from neofetch in the integrated terminal](vscode-nixos.png) 25 | 26 | A big downside of committing to "the Nix way" at this point in time is that fixing broken stuff might need learning the language and digging through docs and issues which are not always clear or complete. So far though, working with Node.js, Docker, Docker Compose and VSCode through SSH has been flawless. The VM is really snappy and, as a small curiosity, it does not show up in the list of apps using "significant battery" where Docker Desktop would be at all times! For the occasional container that only has a x86_64 version I can always set up another VM with NixOS amd64 to replace the one I already have with [Alpine](https://alpinelinux.org/), but I do not see the urgent need for it. 27 | 28 | Keep in mind running Nix in macOS is also an option, one that is being nicely shaped thanks to the [Nix 🖤 macOS Open Collective](https://opencollective.com/nix-macos). As far as I read, it can work as a replacement for [Homebrew](https://wickedchicken.github.io/post/macos-nix-setup/). Some [nice](https://github.com/NixOS/nix/pull/4289#issuecomment-842797556) improvements might still need to wait for a backport or a new Nix release though. For me, needing Docker already made me go with the VM approach instead, and after some time I find the logical separation of integrated OS apps and the dev environment "cozy", if that makes any sense. 29 | 30 | A couple of elements I recommend complementing this setup with: 31 | 32 | - The [Nix Environment Selector](https://marketplace.visualstudio.com/items?itemName=arrterian.nix-env-selector) extension to make VSCode aware of the development environment defined in `shell.nix` files, so that it can use tooling declared there and not in the general system configuration. 33 | - [Code Server support for NixOS](https://github.com/msteen/nixos-vscode-server) (you will need this if you plan to use VSCode as your editor with the remote SSH extension). 34 | 35 | Finally, here's my current [`configuration.nix`](https://gist.github.com/santicalcagno/1860b709f0e91c861ba8f59fcad5613c) file in case it helps with anything. Not much added from the base one though. 36 | --------------------------------------------------------------------------------