Code Monkey home page Code Monkey logo

nixbox's Introduction

NixOS boxes for Vagrant

NixOS is a linux distribution based on a purely functional package manager. This project builds vagrant .box images.

Status

stable

Usage

vagrant init nixbox/nixos --box-version 23.11

Also have a look at the accompanying nixos vagrant plugin: https://github.com/nix-community/vagrant-nixos-plugin

Auto Vars File

iso_checksums

The nixos.auto.pkvars.hcl file contains two defined variables that are required to build a box. The packer template will dereference the iso checksum from the iso_checksums variable. If a checksum does not exist for the version and architecture you are trying to build, the packer build will fail. Be sure to add the proper checksum for the ISO you would like to use to the iso_checksums map, if it does not already exist, before building.

version

Use the version variable to set the version of NixOS you want to build. By convention, this is usually set to the latest stable version of NixOS.

Building the images

First install packer and virtualbox.

Four packer builders are currently supported:

  • BIOS
    • Virtualbox (BUILDER=virtualbox-iso.virtualbox)
    • qemu / libvirt (BUILDER=qemu.qemu)
    • VMware (BUILDER=vmware-iso.vmware)
    • Hyper-V (BUILDER=hyperv-iso.hyperv)
  • UEFI - Virtualbox (BUILDER=virtualbox-iso.virtualbox-efi) - qemu / libvirt (BUILDER=qemu.qemu-efi)

Have a look at the different make build target to build your image.

make build-all # Build latest version for all architectures
make VERSION=23.11 build # Build specific version for x86_64 architecture
make VERSION=23.11 ARCH=i686 build # Build specific version for specific architecture

make vagrant-add
make vagrant-push

If you build on a host that does not support Makefile, here are some examples:

packer build --only=virtualbox-iso.virtualbox -var version=23.11 --except=vagrant-cloud nixos.pkr.hcl
packer build --only=qemu.qemu -var version=23.11 --except=vagrant-cloud nixos.pkr.hcl
packer build --only=vmware-iso.vmware -var version=23.11 --except=vagrant-cloud nixos.pkr.hcl
packer build --only=hyperv-iso.hyperv -var version=23.11 --except=vagrant-cloud nixos.pkr.hcl

The vagrant .box image is now ready to go and you can use it in vagrant:

vagrant box add nixbox32 nixos-23.11-libvirt-i686.box
# or
vagrant box add nixbox64 nixos-23.11-virtualbox-x86_64.box

Troubleshooting

  • If you build on a Windows OS, please make sure you keep the unix file encoding of the generated configuration files (see issue#30

  • Timeouts are a common issue for build failures. These can be a bit tough to figure out. increase the boot_wait value in nixos.auto.pkvars.hcl if you think timeouts may be the cause of your build failures.

Sample Vagrantfile

Vagrant.configure("2") do |config|

  # Disable shared virtualbox mount path (not vboxsf installed on guest)
  config.vm.synced_folder '.', '/vagrant', disabled: true

  # Use a suitable NixOS base. VM built with nixbox are tested to work with
  # this plugin.
  config.vm.box = "nixos-23.11"

  # Add the htop package
  config.vm.provision :nixos,
    run: 'always',
    expression: {
      environment: {
        systemPackages: [ :htop ]
      }
    }

end

License

Copyright 2022 under the MIT Copyright 2015 under the MIT

nixbox's People

Contributors

badele avatar billwanjohi avatar cambid avatar cdituri avatar chronicc avatar dasj avatar davejagoda avatar dysinger avatar ethnt avatar ifurther avatar jeffbr13 avatar keblek avatar luckynum7 avatar manojkarthick avatar mic92 avatar nickryand avatar pdietl avatar pierrer avatar pradermecker avatar stefandeml avatar supersandro2000 avatar tboerger avatar zimbatm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nixbox's Issues

ssh connexion fails with packer > 1.3.3

Packer version 1.3.3 is the last version that is able to build a nixbox for vwmare (vmware-iso).

Later version of Packer works fine with the virtualbox builder.

Any progress on the nix-generators front (that would remove the need of packer if I understand correctly)

See attached screenshot
packer1 3+

Support for Virtualbox 7.0+

I was trying to build virtualbox-iso.virtualbox on macOS 12.4 using Virtualbox 7.0.4, and I noticed the HTTP server Packer creates was not reachable. After some research I found the issue here. With VBox 7.0+, the config option --nat-localhostreachable was introduced and is set to off by default.

So to fix the issue something like this will need to be done:

source "virtualbox-iso" "virtualbox" {
...
  vboxmanage           = [["modifyvm", ..., "--nat-localhostreachable1", "on"]]
...
}

With that in place the build works on Virtualbox 7.0+. However I haven't tested if this breaks builds with older versions of VBox.

Adding build time ERB/erubis dependency?

Would folks be open to adding ERB/erubis as a dependency to this project to customize config files during the provisioning step?

Use case

I'm adding support for the parallels-iso builder, which entails setting the hardware.parallels.enable = true option in NixOS to enable Parallels guest OS support. However, I'm currently stuck because this line in parallels-guest.nix conflicts with this line in configuration.nix, resulting in the following error when running packer build:

    parallels-iso: building the configuration in /mnt/etc/nixos/configuration.nix...
==> parallels-iso: error: The option `services.timesyncd.enable' has conflicting definitions, in `/mnt/etc/nixos/hardware-builder.nix' and `/mnt/etc/nixos/configuration.nix' and `/nix/var/nix/profiles/per-user/root/channels/nixos/nixos/modules/virtualisation/parallels-guest.nix'.
==> parallels-iso: (use '--show-trace' to show detailed location information)
==> parallels-iso: Unregistering virtual machine...
==> parallels-iso: Deleting output directory...
Build 'parallels-iso' errored: Script exited with non-zero exit status: 1.Allowed exit codes are: [0]

In my opinion, the proper way to deal with this is to generate configuration.nix from a template during the provisioning step before it's downloaded by install.sh. In this case, we would stick a conditional that would either emit or omit services.timesyncd.enable = false; from configuration.nix depending on which builder is being used.

I think that using ERB makes sense since Packer and Vagrant use Ruby and erubis is already a Packer dependency.

Replace Packer with Nix

This is just an idea. The main downside would be that the user needs to have Nix installed, but Nix builds are generally faster, and don't require the virtualization framework to build the images. That means it would be easier to target VMWare, HyperV, VirtualBox, ...

I have a prototype somewhere in this repo I think. And also pushed this to nixpkgs a while back:
https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/virtualisation/vagrant-guest.nix and https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/virtualisation/vagrant-virtualbox-image.nix

If you're interested of me going more in details @ifurther , let me know.

New Release

Hello!

Is there any reason why there haven't been any releases on Vagrant Cloud since 18.09? Is it possible to release a box for 19.03?

add packer configuration without atlas?

It took me some time to understand that I need to throw away all the stuff related to atlas from nixos-x86_64.json and have just

  "post-processors": [
    {
      "type": "vagrant",
      "keep_input_artifact": false
    }
  ]

PostInstallation script

@zimbatm would you mind explaining this line to me ?

Are you sure the postinstall.sh script is executed ?

Here is my output:

    vmware-iso: building the configuration in /mnt/etc/nixos/configuration.nix...
    vmware-iso: copying channel...
    vmware-iso: installing the boot loader...
==> vmware-iso: setting up /etc...
==> vmware-iso: updating GRUB 2 menu...
==> vmware-iso: installing the GRUB 2 boot loader on /dev/sda...
==> vmware-iso: Installing for i386-pc platform.
==> vmware-iso: Installation finished. No error reported.
    vmware-iso: installation finished!
    vmware-iso: building the configuration in /mnt/etc/nixos/configuration.nix...
==> vmware-iso:   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
==> vmware-iso:                                  Dload  Upload   Total   Spent    Left  Speed
==> vmware-iso: 100   618  100   618    0     0  18176      0 --:--:-- --:--:-- --:--:-- 18176
    vmware-iso: copying channel...
    vmware-iso: installing the boot loader...
==> vmware-iso: setting up /etc...
==> vmware-iso: updating GRUB 2 menu...
==> vmware-iso: installing the GRUB 2 boot loader on /dev/sda...
==> vmware-iso: Installing for i386-pc platform.
==> vmware-iso: Installation finished. No error reported.
    vmware-iso: installation finished!

The installer is running twice. Is this intended ?

Thx

Use permanent URL instead of latest

Currently both 32-bit and 64-bit templates are referring to the “latest” ISO of current release. For example, the 64-bit one refers to

https://channels.nixos.org/nixos-20.03/latest-nixos-minimal-x86_64-linux.iso

This has the problem that there will be a gap between a new release in the channel and an update in this repository. During this gap, the checksum would fail.

I hereby propose to change the link to one with exact version number, such as

https://releases.nixos.org/nixos/20.03/nixos-20.03.1795.d6c1b566b77/nixos-minimal-20.03.1795.d6c1b566b77-x86_64-linux.iso

for 64-bit. This doesn’t remove the gap, but it allows users to keep using the old (albeit outdated) version during the gap. This change isn’t expected to add much maintenance burden, since the checksum would need an update anyway.

I can certainly make a PR for this, but since this affects maintenance update, I think it’s better to discuss in advance.

Note: the version number 20.03.1795.d6c1b566b77 can be extracted into Packer variable.

17.03 release

Hi,

I have everything ready for 17.03 locally. It is working nicely (tested for x84). My sole question is about the atlas extra bit that have been regenerated again. Do you want me to push with or without it ?

iso_urls_update.rb web scrape broke

I think the web site put in a newline that breaks the assumption of the regex parse. I haven't had a moment to sort out the way I'd prefer to fix it, but I thought I'd issue the bug here now. I may put in a PR to fix it when I get the time.

In the meantime, it's easy enough to edit the generated JSON file manually.

Terminfo issues

Due to Issue #34364 going on over in NixOS/Nixpkgs land the image currently on vagrant cloud has very annoying terminfo issues.

This isn't really this project's issue but I thought I would open this for tracking (as a new box should probably be pushed once this is resolved). I also thought I would offer an easy mitigation.

The workaround (discovered by @ttamttam) is very easily implemented in a Vagrantfile.

Just add a shell provisioner like so:

config.vm.provision :shell, path: "ncurses-fix.sh"

And add the following as ncurses-fix.sh

#!/usr/bin/env 
sudo nix-store --repair-path /nix/store/*ncurses*
nixos-rebuild switch

Packer failing

Running packer on Windows fails

    virtualbox-iso: building path(s) ‘/nix/store/1yhdxv73pz31xc9qb7184js1m2wzwjjb-sudoers’
    virtualbox-iso: >>> /nix/store/i8534j6r4mhw19aixas5g2ah4r17vx6x-sudoers-in: syntax error near line 18 <<<
    virtualbox-iso: >>> /nix/store/i8534j6r4mhw19aixas5g2ah4r17vx6x-sudoers-in: syntax error near line 24 <<<
    virtualbox-iso: >>> /nix/store/i8534j6r4mhw19aixas5g2ah4r17vx6x-sudoers-in: syntax error near line 25 <<<
    virtualbox-iso: parse error in /nix/store/i8534j6r4mhw19aixas5g2ah4r17vx6x-sudoers-in near line 18
    virtualbox-iso: builder for ‘/nix/store/97d6mb47w9gvy80hiink67x3a0z1cpnx-sudoers.drv’ failed with exit code 1
    virtualbox-iso: cannot build derivation ‘/nix/store/qr9y5na2xr9x655hl3s68g0xf66lm0q1-etc.drv’: 1 dependencies couldn't be built
    virtualbox-iso: building path(s) ‘/nix/store/9cj3shisi6yh1kbhrlgjwl1lcw0hy6d2-users-groups.json’
    virtualbox-iso: cannot build derivation ‘/nix/store/0bs048837g4fippjxb211n9wb5hbxql6-nixos-system-nixbox-17.09.2853.b222a0713f4.drv’: 1 dependencies couldn't be built
    virtualbox-iso: error: build of ‘/nix/store/0bs048837g4fippjxb211n9wb5hbxql6-nixos-system-nixbox-17.09.2853.b222a0713f4.drv’ failed
==> virtualbox-iso: Deregistering and deleting VM...
==> virtualbox-iso: Deleting output directory...
Build 'virtualbox-iso' errored: Script exited with non-zero exit status: 100

==> Some builds didn't complete successfully and had errors:
--> virtualbox-iso: Script exited with non-zero exit status: 100

==> Builds finished but no artifacts were created.

Use Efi instead of BIOS

I currently have trouble exporting/importing vmware boxes created with nixbox. I would like to check if this is because the box is using the BIOS firware.

Unfortunately nixos is building boxes with BIOS whereas Efi might be a better default these days.

Failing with 21.11

If I use

{
  "variables": {
    "disk_size": "72000",
    "memory": "6800",
    "version": "21.11",
    "build": "334139.1bd4bbd49be",
    "checksum": "8259e4a841c624c98a02e24f35e8dfe3363af821cd31831c22b79414454e9379"
  },

The build is failing with

==> virtualbox-iso: Waiting 45s for boot...
==> virtualbox-iso: Typing the boot command...
==> virtualbox-iso: Using ssh communicator to connect: 127.0.0.1
==> virtualbox-iso: Waiting for SSH to become available...
==> virtualbox-iso: Error waiting for SSH: Packer experienced an authentication error when trying to connect via SSH. This can happen if your username/password are wrong. You may want to double-check your credentials as part of your debugging process. original error: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

If I revert back to 21.05 it works again.

Any idea about what would cause this failure ?

Thanks

VBoxGuestAdditions mount error

Could you please help solve this problem? Thanks!

==> default: Machine booted and ready!
[default] GuestAdditions versions on your host (5.2.18) and guest (5.2.8) do not match.
The guest's platform ("nixos") is currently not supported, will try generic Linux method...
Copy iso file /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso
Mounting Virtualbox Guest Additions ISO to: /mnt
mount: /mnt: mount point does not exist.
==> default: Checking for guest additions in VM...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

mount /tmp/VBoxGuestAdditions.iso -o loop /mnt

Stdout from the command:



Stderr from the command:

mount: /mnt: mount point does not exist.

`nix-shell` is an undocumented dependency

README doesn't mention this dependency which is a bit irritating.

I am trying to use this tool to build nixOS boxes because my host machine will not install nix and nix-shell...so having a dependency on nix-shell makes it unusable for me, unfortunately.

17.09 release

Is there anything blocking the release of an updated version?

Network warning on 18.03

trace: warning: The option `ipAddress' defined in `/etc/nixos/vagrant-network.nix' has been changed to `ipv4.addresses' that has a different type. Please read `ipv4.addresses' documentation and update your configuration accordingly.
trace: warning: The option `prefixLength' defined in `/etc/nixos/vagrant-network.nix' has been changed to `ipv4.addresses' that has a different type. Please read `ipv4.addresses' documentation and update your configuration accordingly.

Integrate github action

Heya I've managed to get nixbox building in github actions for virtualbox and libvirt in my own fork
They are currently published under my own namespace in vagrant cloud.
If the maintainers of this repo want to integrate it and publish under the nixos account I can open a PR

Atlas is becoming increasingly closed

It looks like Atlas doesn't allow to push new Vagrant boxes anymore, and Packer is on trial and will end in 9 days.

Just contacted the sales to see if we can still have access as an open source project, we'll see.

/cc @PierreR

metadata.json not found

Hi,

Here is an error I had when trying to bring zimbatm/nixbox64 machine up:

$ vagrant up --provider virtualbox
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'zimbatm/nixbox64' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'zimbatm/nixbox64'
    default: URL: https://atlas.hashicorp.com/zimbatm/nixbox64
==> default: Adding box 'zimbatm/nixbox64' (v14.12.496.5f7d374) for provider: virtualbox
    default: Downloading: https://atlas.hashicorp.com/zimbatm/boxes/nixbox64/versions/14.12.496.5f7d374/providers/virtualbox.box
    default: Progress: 100% (Rate: 1535k/s, Estimated time remaining: --:--:--)
The "metadata.json" file for the box 'zimbatm/nixbox64' was not found.
Boxes require this file in order for Vagrant to determine the
provider it was made for. If you made the box, please add a
"metadata.json" file to it. If someone else made the box, please
notify the box creator that the box is corrupt. Documentation for
box file format can be found at the URL below:

http://docs.vagrantup.com/v2/boxes/format.html

Looking for a new maintainer

I haven't touched VirtualBox for years now, I think it's time to pass on the maintenance.

Please leave a message here if you're interested in taking this project up.

Add support for hyperV

It would be nice to build an hyperv box for the next 17.03.

I have had a try on this but haven't managed to go far because packer won't find the guest IP.

My guess is that the relevant hyperv driver needs to be installed from the boot_command.

Checksum errors

I get consistent checksum errors for the download. Is it save to edit them? I assume the simply changed.

Context: I'm trying to build it on a fully updated Arch Linux on a x86_64 box.

Thanks :)

==> virtualbox-iso: Got: f53926a59612ae9515cc35f4ad17e5d41d4a5c80cb5dde1ec6e81a738c00c7c8
==> virtualbox-iso: *sha256.digest]
Build 'virtualbox-iso' errored after 33 seconds 442 milliseconds: error downloading ISO: [Checksums did not match for /home/pete/nixbox/packer_cache/2154d5541ec60461e4d23b8144e0d60e48e6a3ba.iso.
Expected: 4dcda77f30ff97832b80b74686068c896674d09c9b222e6c05f85f91cbbbbc5b
Got: f53926a59612ae9515cc35f4ad17e5d41d4a5c80cb5dde1ec6e81a738c00c7c8
*sha256.digest 

virtualbox__intnet option in Vagrantfile smashes vagrant-network.nix

Having this in Vagrantfile:

subconfig.vm.network "private_network", ip: "192.168.80.10", virtualbox__intnet: "mynetwork"
subconfig.vm.network "private_network", ip: "192.168.90.4"

makes a vagrant-network.nix:

{ config, pkgs, ... }:
{
  networking.interfaces = [
    { 
      name         = "enp0s8";
      prefixLength = 24;
    }
    { 
      name         = "enp0s9";
      ipAddress    = "192.168.90.4";
      prefixLength = 24;
    }
  ];
}

You see: The ip address is missing for enp0s8

Example Vagrantfile for a repository containing shell.nix

I'm in the situation that I have defined a "shell.nix" file inside one of my projects. I would like to be able to set up a Vagrantfile, which uses your nixbox and automatically drops you in a nix-shell for the specified file on vagrant up; vagrant ssh.
Is this use case possible using your nixbox?

Add NFS to the image

Vagrant depends on test -x /run/current-system/sw/sbin/mount.nfs to return successfully for NFS to work.

Timing issues

If I start packer and don't touch the VirtualBox window that opens (let GRUB timeout), then the timing ends up being off for the boot commands.

The first boot command (shown below), ends up not being run and only the .packer_http bit is executed, which then causes the third boot command to fail and SSH bombs out:

echo http://{{ .HTTPIP }}:{{ .HTTPPort}} > .packer_http

If i intervene during boot and hit enter at the GRUB screen (before 10 second timeout) the build goes perfectly. This seems less than ideal if the goal is to automate this, but then again this could just be my machine being slow.

Could you bump the boot_wait attribute up by an extra 10 seconds?

Full build logs below:

+$ packer build nixos-x86_64.json 
virtualbox-iso output will be in this color.

==> virtualbox-iso: Downloading or copying ISO
    virtualbox-iso: Downloading or copying: https://d3g5gsiof5omrk.cloudfront.net/nixos/17.09/nixos-17.09.1462.07ca7b64d2/nixos-minimal-17.09.1462.07ca7b64d2-x86_64-linux.iso
==> virtualbox-iso: Starting HTTP server on port 8180
==> virtualbox-iso: Creating virtual machine...
==> virtualbox-iso: Creating hard drive...
==> virtualbox-iso: Creating forwarded port mapping for communicator (SSH, WinRM, etc) (host port 3387)
==> virtualbox-iso: Executing custom VBoxManage commands...
    virtualbox-iso: Executing: modifyvm packer-virtualbox-iso-1516842047 --memory 1024
==> virtualbox-iso: Starting the virtual machine...
==> virtualbox-iso: Waiting 30s for boot...
==> virtualbox-iso: Typing the boot command...
==> virtualbox-iso: Waiting for SSH to become available...
==> virtualbox-iso: Error waiting for SSH: ssh: handshake failed: ssh: unable to authenticate, attempted methods [publickey none password keyboard-interactive], no supported methods remain
==> virtualbox-iso: Unregistering and deleting virtual machine...
==> virtualbox-iso: Deleting output directory...
Build 'virtualbox-iso' errored: ssh: handshake failed: ssh: unable to authenticate, attempted methods [publickey none password keyboard-interactive], no supported methods remain

==> Some builds didn't complete successfully and had errors:
--> virtualbox-iso: ssh: handshake failed: ssh: unable to authenticate, attempted methods [publickey none password keyboard-interactive], no supported methods remain

==> Builds finished but no artifacts were created.
+$

15.09 vagrant box not on Atlas

Hi,

Running the init command and then the up command fails, seemingly because vagrant cannot find the box in the remote catalog. Is the box online, or does it have to be built every time?

Ryan

Restore automated builds

Now that atlas is not taking care of the builds automatically for us anymore, we need a new way to automate the building of the boxes. The CI needs to support VirtualBox and ideally other hypervisors as well.

Add support for VMWare

Hey folks!

I know this is quite against the spirit of open source but I think you would reach a wider business audience by supporting VMWare for your images.

Missing ssh private key file

Seeing the following output when building a virtualbox box:

$ packer build --only=virtualbox-iso.virtualbox -var version=22.05 -var-file nixos.auto.pkvars.hcl nixos.pkr.hcl
Error: 1 error(s) occurred:

* ssh_private_key_file is invalid: stat ./scripts/install_rsa: no such file or directory

  on nixos.pkr.hcl line 93:
  (source code not available)



==> Wait completed after 8 microseconds

==> Builds finished but no artifacts were created.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.