From e4a36949de5827e7bf2b91cecaa0db02c6bb06a1 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 27 Feb 2023 21:51:19 +0100 Subject: [PATCH 1/3] website: init --- flake.nix | 1 + website/default.nix | 7 +++++ website/package.nix | 30 +++++++++++++++++++ website/src/header.html | 1 + website/src/index.md | 50 +++++++++++++++++++++++++++++++ website/src/nixified-ai-icon.png | Bin 0 -> 28907 bytes website/src/styles.css | 36 ++++++++++++++++++++++ 7 files changed, 125 insertions(+) create mode 100644 website/default.nix create mode 100644 website/package.nix create mode 100644 website/src/header.html create mode 100644 website/src/index.md create mode 100644 website/src/nixified-ai-icon.png create mode 100644 website/src/styles.css diff --git a/flake.nix b/flake.nix index 331505e0..38f81747 100644 --- a/flake.nix +++ b/flake.nix @@ -33,6 +33,7 @@ ./modules/aipython3 ./projects/invokeai ./projects/koboldai + ./website ]; }; } diff --git a/website/default.nix b/website/default.nix new file mode 100644 index 00000000..2f5d5339 --- /dev/null +++ b/website/default.nix @@ -0,0 +1,7 @@ +{ + perSystem = { pkgs, ... }: { + packages = { + website = pkgs.callPackage ./package.nix { }; + }; + }; +} diff --git a/website/package.nix b/website/package.nix new file mode 100644 index 00000000..af49b00a --- /dev/null +++ b/website/package.nix @@ -0,0 +1,30 @@ +{ lib, pandoc, stdenvNoCC }: + +lib.fix (self: stdenvNoCC.mkDerivation { + pname = "nixified-ai-website"; + version = "1.0.0"; + + src = ./src; + + nativeBuildInputs = [ + pandoc + ]; + + buildCommand = '' + unpackPhase + cd $sourceRoot + + pandoc \ + --css=./styles.css \ + -H header.html \ + -V pagetitle='Nixified AI' \ + -s index.md \ + -o index.html + + webroot=$out/share/www/nixified.ai + mkdir -p $webroot + cp -v index.html *.css *.png $webroot + ''; + + passthru.webroot = "${self}/share/www/nixified.ai"; +}) diff --git a/website/src/header.html b/website/src/header.html new file mode 100644 index 00000000..1aa0acc1 --- /dev/null +++ b/website/src/header.html @@ -0,0 +1 @@ + diff --git a/website/src/index.md b/website/src/index.md new file mode 100644 index 00000000..0e39fe60 --- /dev/null +++ b/website/src/index.md @@ -0,0 +1,50 @@ + +

+
+ + + +

+ +--- + +## Making AI reproducible and easy to run + +The goal of nixified.ai is to simplify and make available a large repository of +AI executable code that would otherwise be impractical to run yourself, due to +package management and complexity issues. + +- Self-contained +- Easy to run +- Support for NVIDIA and AMD GPUs +- Works with Windows Subsystem for Linux + +--- + +# KoboldAI + +- [Official website](https://github.com/KoboldAI/KoboldAI-Client) + +A browser-based front-end for AI-assisted writing with multiple local & remote AI models. + +#### Get started + +- `nix run github:nixified-ai/flake#koboldai-amd` +- `nix run github:nixified-ai/flake#koboldai-nvidia` + +![](https://raw.githubusercontent.com/nixified-ai/flake/images/koboldai.webp) + +--- + +# InvokeAI (A Stable Diffusion WebUI) + +- [Official website](https://invoke-ai.github.io/InvokeAI/) + +InvokeAI is an implementation of Stable Diffusion, the open source text-to-image and image-to-image generator. It provides a streamlined process with various new features and options to aid the image generation process. + +#### Get started + +- `nix run github:nixified-ai/flake#invokeai-amd` +- `nix run github:nixified-ai/flake#invokeai-nvidia` + +![](https://raw.githubusercontent.com/nixified-ai/flake/images/invokeai.webp) diff --git a/website/src/nixified-ai-icon.png b/website/src/nixified-ai-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..34411dc4f9ec5b43d1566a4287c512a5e308f4c8 GIT binary patch literal 28907 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�)(2q%m?U({?^QwtZ$lSY%27f?CDfcgFo| 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 literal 0 HcmV?d00001 diff --git a/website/src/styles.css b/website/src/styles.css new file mode 100644 index 00000000..7911948c --- /dev/null +++ b/website/src/styles.css @@ -0,0 +1,36 @@ +* { + color: #eeeeee; + font-family: sans-serif; +} + +body { + background: radial-gradient(circle, #4362a0 0%, #000000 100%); + margin-left: 20%; + margin-right: 20%; +} + +img { + max-width: 100%; +} + +li code { + font-family: monospace; + font-size: 1.2em; + background-color: #111111; + border-radius: 0.3em; + padding: 0.2em; +} + +li { + margin-bottom: 0.5em; +} + +hr { + border-color: #7ebae4; + color: #7ebae4; +} + +h2 { + text-align: center; + width: 100%; +} From bd8f65bfbc90e4eaab475dc24ac900fa56aa8fb1 Mon Sep 17 00:00:00 2001 From: matthewcroughan Date: Mon, 27 Feb 2023 23:13:37 +0000 Subject: [PATCH 2/3] website: push to gh-pages via hercules-ci.github-pages This is pretty awesome, just two lines and the website is deployed. --- flake.lock | 191 +++++++++++++++++++++++++++++++++++++++++++- flake.nix | 7 +- website/default.nix | 4 +- website/package.nix | 2 +- website/src/CNAME | 1 + 5 files changed, 201 insertions(+), 4 deletions(-) create mode 100644 website/src/CNAME diff --git a/flake.lock b/flake.lock index 2d87dbe9..59222bc6 100644 --- a/flake.lock +++ b/flake.lock @@ -20,6 +20,100 @@ "type": "github" } }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1673362319, + "narHash": "sha256-Pjp45Vnj7S/b3BRpZEVfdu8sqqA6nvVjvYu59okhOyI=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "82c16f1682cf50c01cb0280b38a1eed202b3fe9f", + "type": "github" + }, + "original": { + "id": "flake-parts", + "type": "indirect" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": [ + "hercules-ci-effects", + "hercules-ci-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1666885127, + "narHash": "sha256-uXA/3lhLhwOTBMn9a5zJODKqaRT+SuL5cpEmOz2ULoo=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "0e101dbae756d35a376a5e1faea532608e4a4b9a", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "locked": { + "lastModified": 1667077288, + "narHash": "sha256-bdC8sFNDpT0HK74u9fUkpbf1MEzVYJ+ka7NXCdgBoaA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "6ee9ebb6b1ee695d2cacc4faa053a7b9baa76817", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "hercules-ci-agent": { + "inputs": { + "flake-parts": "flake-parts_3", + "nix-darwin": "nix-darwin", + "nixpkgs": "nixpkgs", + "pre-commit-hooks-nix": "pre-commit-hooks-nix" + }, + "locked": { + "lastModified": 1673183923, + "narHash": "sha256-vb+AEQJAW4Xn4oHsfsx8H12XQU0aK8VYLtWYJm/ol28=", + "owner": "hercules-ci", + "repo": "hercules-ci-agent", + "rev": "b3f8aa8e4a8b22dbbe92cc5a89e6881090b933b3", + "type": "github" + }, + "original": { + "id": "hercules-ci-agent", + "type": "indirect" + } + }, + "hercules-ci-effects": { + "inputs": { + "flake-parts": "flake-parts_2", + "hercules-ci-agent": "hercules-ci-agent", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1676558019, + "narHash": "sha256-obUHCMMWbffb3k0b9YIChsJ2Z281BcDYnTPTbJRP6vs=", + "owner": "hercules-ci", + "repo": "hercules-ci-effects", + "rev": "fdbc15b55db8d037504934d3af52f788e0593380", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "hercules-ci-effects", + "type": "github" + } + }, "invokeai-src": { "flake": false, "locked": { @@ -54,7 +148,78 @@ "type": "github" } }, + "nix-darwin": { + "inputs": { + "nixpkgs": [ + "hercules-ci-effects", + "hercules-ci-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1667419884, + "narHash": "sha256-oLNw87ZI5NxTMlNQBv1wG2N27CUzo9admaFlnmavpiY=", + "owner": "LnL7", + "repo": "nix-darwin", + "rev": "cfc0125eafadc9569d3d6a16ee928375b77e3100", + "type": "github" + }, + "original": { + "owner": "LnL7", + "repo": "nix-darwin", + "type": "github" + } + }, "nixpkgs": { + "locked": { + "lastModified": 1672262501, + "narHash": "sha256-ZNXqX9lwYo1tOFAqrVtKTLcJ2QMKCr3WuIvpN8emp7I=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e182da8622a354d44c39b3d7a542dc12cd7baa5f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1672350804, + "narHash": "sha256-jo6zkiCabUBn3ObuKXHGqqORUMH27gYDIFFfLq5P4wg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "677ed08a50931e38382dbef01cba08a8f7eac8f6", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1673760129, + "narHash": "sha256-m8JdWtElEMd4TY5eUUTbw+3yEjImsE9ifo/UVSbdU7g=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e8e9febf8bc4e90f1b38d3b22a704d347a99a74a", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { "locked": { "lastModified": 1675763311, "narHash": "sha256-bz0Q2H3mxsF1CUfk26Sl9Uzi8/HFjGFD/moZHz1HebU=", @@ -70,12 +235,36 @@ "type": "github" } }, + "pre-commit-hooks-nix": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": [ + "hercules-ci-effects", + "hercules-ci-agent", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1667760143, + "narHash": "sha256-+X5CyeNEKp41bY/I1AJgW/fn69q5cLJ1bgiaMMCKB3M=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "06f48d63d473516ce5b8abe70d15be96a0147fcd", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, "root": { "inputs": { "flake-parts": "flake-parts", + "hercules-ci-effects": "hercules-ci-effects", "invokeai-src": "invokeai-src", "koboldai-src": "koboldai-src", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs_3" } } }, diff --git a/flake.nix b/flake.nix index 38f81747..3e12db7a 100644 --- a/flake.nix +++ b/flake.nix @@ -22,13 +22,18 @@ url = "github:hercules-ci/flake-parts"; inputs.nixpkgs-lib.follows = "nixpkgs"; }; + hercules-ci-effects = { + url = "github:hercules-ci/hercules-ci-effects"; + inputs.nixpkgs-lib.follows = "nixpkgs"; + }; }; - outputs = { flake-parts, invokeai-src, ... }@inputs: + outputs = { flake-parts, invokeai-src, hercules-ci-effects, ... }@inputs: flake-parts.lib.mkFlake { inherit inputs; } { systems = [ "x86_64-linux" ]; imports = [ + hercules-ci-effects.flakeModule ./modules/dependency-sets ./modules/aipython3 ./projects/invokeai diff --git a/website/default.nix b/website/default.nix index 2f5d5339..e357dc7d 100644 --- a/website/default.nix +++ b/website/default.nix @@ -1,5 +1,7 @@ { - perSystem = { pkgs, ... }: { + hercules-ci.github-pages.branch = "master"; + perSystem = { pkgs, config, ... }: { + hercules-ci.github-pages.settings.contents = config.packages.website.webroot; packages = { website = pkgs.callPackage ./package.nix { }; }; diff --git a/website/package.nix b/website/package.nix index af49b00a..d4ec6896 100644 --- a/website/package.nix +++ b/website/package.nix @@ -23,7 +23,7 @@ lib.fix (self: stdenvNoCC.mkDerivation { webroot=$out/share/www/nixified.ai mkdir -p $webroot - cp -v index.html *.css *.png $webroot + cp -v index.html *.css *.png CNAME $webroot ''; passthru.webroot = "${self}/share/www/nixified.ai"; diff --git a/website/src/CNAME b/website/src/CNAME new file mode 100644 index 00000000..5bf001ef --- /dev/null +++ b/website/src/CNAME @@ -0,0 +1 @@ +nixified.ai From d45e2eb41c7ae9f1797f55bada3efd975e109fc7 Mon Sep 17 00:00:00 2001 From: matthewcroughan Date: Tue, 28 Feb 2023 01:52:36 +0000 Subject: [PATCH 3/3] website: modify index to include more details --- website/src/index.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/website/src/index.md b/website/src/index.md index 0e39fe60..385749df 100644 --- a/website/src/index.md +++ b/website/src/index.md @@ -14,14 +14,27 @@ The goal of nixified.ai is to simplify and make available a large repository of AI executable code that would otherwise be impractical to run yourself, due to package management and complexity issues. -- Self-contained +- Self-contained, without containers: + - Each AI project in the repository is packaged as a self-contained Nix package, including all the necessary dependencies to run the code. This guarantees that you don't have to worry about version conflicts, missing dependencies, or the state of your operating system. Nix uses an approach different from containers, which eliminates the need for complex container runtimes or virtualization. +- Easy to contribute to: + - nixified.ai is an open-source project that welcomes contributions from the community. If there is a project you think you could help with packaging, or want packaged, then please [make an issue on GitHub](https://github.com/nixified-ai/flake/issues) +- Reproducible + - By using a reproducible build process, nixified.ai aims to provide users with the ability to confidently run AI workloads in the long term, without worrying about the shifting sands of the software ecosystem +- Built from source + - Each AI project in the repository is built from source, along with all of its input dependencies, ensuring that the code is reproducible and can be trusted. Nix allows advanced users to customize and modify the build process at any granularity if desired. +- Cached + - Thanks to a Nix concept called "Binary Substitution", any `nix` command ran by the user will not need to be built from source unless they have made modifications to the source code. This is because when code is built by our CI [(Hercules CI)](https://hercules-ci.com), it is pushed to cachix.org, where it can be pulled by any `nix` client like a traditional binary distribution. If this infrastructure were to disappear however, the user could still reproduce everything locally thanks to Nix. - Easy to run + - Users can install and run AI executable code from the nixified.ai repository using a single `nix` command, on any distribution of Linux, and even Windows by using the Nix package manager. - Support for NVIDIA and AMD GPUs - Works with Windows Subsystem for Linux + - nixified.ai provides support for running AI executable code on the Windows Subsystem for Linux (WSL), a compatibility layer for running Linux applications on Windows. With the help of [NixOS-WSL](https://github.com/nix-community/NixOS-WSL), users can run GPU-accelerated AI workloads on WSL, providing a seamless experience for users who prefer to use Windows as their primary operating system. --- -# KoboldAI +# Packaged Projects + +### KoboldAI - [Official website](https://github.com/KoboldAI/KoboldAI-Client) @@ -36,7 +49,7 @@ A browser-based front-end for AI-assisted writing with multiple local & remote A --- -# InvokeAI (A Stable Diffusion WebUI) +### InvokeAI (A Stable Diffusion WebUI) - [Official website](https://invoke-ai.github.io/InvokeAI/)