diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..abde234
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+/build
+/dist
+/plugin.so
+/plugin.dylib
+/plugin.dll
+.DS_Store
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..07b5733
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,23 @@
+# If RACK_DIR is not defined when calling the Makefile, default to two directories above
+RACK_DIR ?= ../..
+
+# FLAGS will be passed to both the C and C++ compiler
+FLAGS +=
+CFLAGS +=
+CXXFLAGS +=
+
+# Careful about linking to shared libraries, since you can't assume much about the user's environment and library search path.
+# Static libraries are fine, but they should be added to this plugin's build system.
+LDFLAGS +=
+
+# Add .cpp files to the build
+SOURCES += $(wildcard src/*.cpp)
+
+# Add files to the ZIP package when running `make dist`
+# The compiled plugin and "plugin.json" are automatically added.
+DISTRIBUTABLES += res
+DISTRIBUTABLES += $(wildcard LICENSE*)
+DISTRIBUTABLES += $(wildcard presets)
+
+# Include the Rack plugin Makefile framework
+include $(RACK_DIR)/plugin.mk
diff --git a/plugin.json b/plugin.json
new file mode 100644
index 0000000..bda9d65
--- /dev/null
+++ b/plugin.json
@@ -0,0 +1,25 @@
+{
+  "slug": "a10u8r_plugin",
+  "name": "A10U8R",
+  "version": "2.0.0",
+  "license": "GPL-2.0-or-later",
+  "brand": "ewpratten",
+  "author": "Evan Pratten",
+  "authorEmail": "contact@ewpratten.com",
+  "authorUrl": "https://ewpratten.com",
+  "pluginUrl": "https://ewpratten.com/products/vcvrack/a10u8r",
+  "manualUrl": "",
+  "sourceUrl": "https://github.com/ewpratten/A10U8R",
+  "donateUrl": "https://ewpratten.com/donate",
+  "changelogUrl": "",
+  "modules": [
+    {
+      "slug": "a10u8r_module",
+      "name": "a10u8r_module",
+      "description": "A simple, hacky, attenuator",
+      "tags": [
+        "Attenuator"
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/res/module.svg b/res/module.svg
new file mode 100644
index 0000000..68121cd
--- /dev/null
+++ b/res/module.svg
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="30.48mm"
+   height="128.5mm"
+   viewBox="0 0 30.480002 128.50002"
+   version="1.1"
+   id="svg8"
+   inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
+   sodipodi:docname="module.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:dc="http://purl.org/dc/elements/1.1/">
+  <defs
+     id="defs2" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="28.571429"
+     inkscape:cy="196.07143"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="mm"
+     inkscape:snap-bbox="true"
+     inkscape:snap-page="true"
+     inkscape:bbox-nodes="false"
+     inkscape:snap-bbox-edge-midpoints="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1043"
+     inkscape:window-x="0"
+     inkscape:window-y="268"
+     inkscape:window-maximized="1"
+     inkscape:snap-bbox-midpoints="true"
+     inkscape:snap-nodes="false"
+     inkscape:showpageshadow="2"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1" />
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-168.49998)">
+    <rect
+       style="display:inline;opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.64935839;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
+       id="rect420"
+       width="30.48"
+       height="128.5"
+       x="5.9211732e-17"
+       y="168.49997" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="components">
+    <circle
+       inkscape:label="output"
+       r="4"
+       cy="110.49068"
+       cx="15.24"
+       id="circle66-6"
+       style="display:inline;vector-effect:none;fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+    <circle
+       inkscape:label="input"
+       r="4"
+       cy="25.80987"
+       cx="15.24"
+       id="circle66"
+       style="display:inline;opacity:1;vector-effect:none;fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+    <circle
+       inkscape:label="value"
+       r="4"
+       cy="64.25"
+       cx="15.24"
+       id="circle66-7"
+       style="display:inline;vector-effect:none;fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal" />
+  </g>
+</svg>
diff --git a/src/module.cpp b/src/module.cpp
new file mode 100644
index 0000000..65942b7
--- /dev/null
+++ b/src/module.cpp
@@ -0,0 +1,55 @@
+#include "plugin.hpp"
+
+
+struct A10u8r_module : Module {
+	enum ParamId {
+		VALUE_PARAM,
+		PARAMS_LEN
+	};
+	enum InputId {
+		INPUT_INPUT,
+		INPUTS_LEN
+	};
+	enum OutputId {
+		OUTPUT_OUTPUT,
+		OUTPUTS_LEN
+	};
+	enum LightId {
+		LIGHTS_LEN
+	};
+
+	A10u8r_module() {
+		config(PARAMS_LEN, INPUTS_LEN, OUTPUTS_LEN, LIGHTS_LEN);
+		configParam(VALUE_PARAM, 0.f, 1.f, 0.f, "");
+		configInput(INPUT_INPUT, "");
+		configOutput(OUTPUT_OUTPUT, "");
+	}
+
+	void process(const ProcessArgs& args) override {
+		float value = params[VALUE_PARAM].getValue();
+		float input = inputs[INPUT_INPUT].getVoltage();
+		outputs[OUTPUT_OUTPUT].setVoltage(value * input);
+	}
+};
+
+
+struct A10u8r_moduleWidget : ModuleWidget {
+	A10u8r_moduleWidget(A10u8r_module* module) {
+		setModule(module);
+		setPanel(createPanel(asset::plugin(pluginInstance, "res/a10u8r_module.svg")));
+
+		addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0)));
+		addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0)));
+		addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
+		addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
+
+		addParam(createParamCentered<RoundBlackKnob>(mm2px(Vec(15.24, 64.25)), module, A10u8r_module::VALUE_PARAM));
+
+		addInput(createInputCentered<PJ301MPort>(mm2px(Vec(15.24, 25.81)), module, A10u8r_module::INPUT_INPUT));
+
+		addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(15.24, 110.491)), module, A10u8r_module::OUTPUT_OUTPUT));
+	}
+};
+
+
+Model* modelA10u8r_module = createModel<A10u8r_module, A10u8r_moduleWidget>("a10u8r_module");
\ No newline at end of file
diff --git a/src/plugin.cpp b/src/plugin.cpp
new file mode 100644
index 0000000..dc08710
--- /dev/null
+++ b/src/plugin.cpp
@@ -0,0 +1,15 @@
+#include "plugin.hpp"
+
+
+Plugin* pluginInstance;
+
+
+void init(Plugin* p) {
+	pluginInstance = p;
+
+	// Add modules here
+	p->addModel(modelA10u8r_module);
+
+	// Any other plugin initialization may go here.
+	// As an alternative, consider lazy-loading assets and lookup tables when your module is created to reduce startup times of Rack.
+}
diff --git a/src/plugin.hpp b/src/plugin.hpp
new file mode 100644
index 0000000..178736f
--- /dev/null
+++ b/src/plugin.hpp
@@ -0,0 +1,11 @@
+#pragma once
+#include <rack.hpp>
+
+
+using namespace rack;
+
+// Declare the Plugin, defined in plugin.cpp
+extern Plugin* pluginInstance;
+
+// Declare each Model, defined in each module source file
+extern Model* modelA10u8r_module;