diff --git a/.envrc b/.envrc
index 1d953f4..3550a30 100644
--- a/.envrc
+++ b/.envrc
@@ -1 +1 @@
-use nix
+use flake
diff --git a/.gitignore b/.gitignore
index ea8c4bf..cb8c9e0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
/target
+.direnv
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..0baf00e
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,5 @@
+{
+ "rust-analyzer.linkedProjects": [
+ "./helloworld/Cargo.toml",
+ ]
+}
\ No newline at end of file
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..97a944e
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "helloworld"
+version = "0.1.0"
diff --git a/Cargo.toml b/Cargo.toml
index d31d346..0bda405 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,8 +1,2 @@
-[package]
-name = ""
-version = "0.1.0"
-edition = "2021"
-
-# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-
-[dependencies]
+[workspace]
+members = ["helloworld"]
\ No newline at end of file
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..5b171c7
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,114 @@
+/*
+TODO
+1. Find and replace "helloworld" with your package name for **ALL FILES IN REPOSITORY**
+2. Add a flake description that describes the workspace on line 27
+3. Add a package description on line 70
+4. (optional) uncomment `nativeBuildInputs` and `buildInputs` on lines 43 and 44 if you need openssl
+5. (optional) set your project homepage, license, and maintainers list on lines 48-51
+6. (optional) uncomment the NixOS module and update it for your needs
+7. Delete this comment block
+*/
+
+/*
+Some utility commands:
+- `nix flake update --commit-lock-file`
+- `nix flake lock update-input `
+- `nix build .#helloworld`
+- `nix run .#helloworld`
+
+Updating `cargoHash`:
+- Set `cargoHash` to an empty string
+- run `nix run .#helloworld`
+- Update `cargoHash` with correct hash from output
+rust-project TODO: write shell script for automatically updating `cargoHash`
+*/
+
+{
+ description = "";
+
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+ rust-overlay.url = "github:oxalica/rust-overlay";
+ };
+
+ outputs = { self, nixpkgs, rust-overlay }:
+ let
+ overlays = [ (import rust-overlay) ];
+ system = "x86_64-linux";
+ pkgs = import nixpkgs {
+ inherit system overlays;
+ };
+ rustSettings = with pkgs; {
+ src = ./.;
+ #nativeBuildInputs = [ pkg-config ];
+ #buildInputs = [ openssl ];
+ cargoHash = nixpkgs.lib.fakeHash;
+ };
+ meta = with nixpkgs.lib; {
+ #homepage = "https://example.com";
+ #license = [ licenses.gpl3 ];
+ platforms = [ system ];
+ #maintainers = with maintainers; [ ];
+ };
+ in {
+ devShells.${system}.default = with pkgs; mkShell {
+ packages = [
+ (pkgs.rust-bin.stable.latest.default.override {
+ extensions = [ "rust-src" ];
+ })
+ bacon
+ ];
+ inputsFrom = with self.packages.${system}; [ helloworld ];
+ };
+ packages.${system} = {
+ helloworld = pkgs.rustPlatform.buildRustPackage (rustSettings // {
+ pname = "helloworld";
+ version = "0.1.0";
+ buildAndTestSubdir = "helloworld";
+ cargoHash = "sha256-+TaGIiKf+Pz2bTABeG8aCZz0/ZTCKl5398+qbas4Nvo=";
+ meta = meta // {
+ description = "";
+ };
+ });
+ };
+ /*
+ nixosModules.default = { config, ... }: let
+ lib = nixpkgs.lib;
+ in {
+ options.services.helloworld = {
+ enable = lib.mkEnableOption (lib.mdDoc "helloworld service");
+ package = lib.mkOption {
+ type = lib.types.package;
+ default = self.packages.${system}.helloworld;
+ defaultText = "pkgs.helloworld";
+ description = lib.mdDoc ''
+ The helloworld package that should be used.
+ '';
+ };
+ port = lib.mkOption {
+ type = lib.types.port;
+ default = 8000;
+ description = lib.mdDoc ''
+ The port at which to run.
+ '';
+ };
+ };
+ config.systemd.services.helloworld = let
+ cfg = config.services.helloworld;
+ pkg = self.packages.${system}.helloworld;
+ in lib.mkIf cfg.enable {
+ description = pkg.meta.description;
+ after = [ "network.target" ];
+ wantedBy = [ "network.target" ];
+ serviceConfig = {
+ ExecStart = ''
+ ${cfg.package}/bin/helloworld --port ${builtins.toString cfg.port}
+ '';
+ Restart = "always";
+ DynamicUser = true;
+ };
+ };
+ };
+ */
+ };
+}
diff --git a/helloworld/Cargo.toml b/helloworld/Cargo.toml
new file mode 100644
index 0000000..5371865
--- /dev/null
+++ b/helloworld/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "helloworld"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/src/main.rs b/helloworld/src/main.rs
similarity index 100%
rename from src/main.rs
rename to helloworld/src/main.rs
diff --git a/shell.nix b/shell.nix
deleted file mode 100644
index bd75433..0000000
--- a/shell.nix
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-{ pkgs ? import {}}:
-
-let
- rust_overlay = import (builtins.fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz");
- pkgs = import { overlays = [ rust_overlay ]; };
- ruststable = (pkgs.rust-bin.stable.latest.default.override {
- extensions = [
- "rust-src"
- ];
- });
-in
-pkgs.mkShell {
- buildInputs = with pkgs; [
- ruststable
- rust-analyzer
- bacon
- #pkg-config
- #openssl
- ];
-}