diff --git a/rrnl/README.md b/rrnl/README.md
new file mode 100644
index 0000000000..fc3100cdb1
--- /dev/null
+++ b/rrnl/README.md
@@ -0,0 +1,21 @@
+# Creating RRNLs for Vega
+
+Using this program, you can easily create your own reference range number lines.
+
+* RRNL visualizations are created using the `numberline_to_vega.py` program. When running it, make sure that the file for creating your RRNL is in the same directory as this program, and that the files `classes.py` and `setters.py` are there as well.
+ - make sure that your JSON file for creating your RRNL is valid in the RRNL domain-specific language. Look at one of the included examples, like `plateletcount.json`, to see how these files are formatted.
+* When you run the program, you will be prompted to put in the name of a file. Type the name of a file in the directory that you wish to convert to a Vega object.
+* The generated `vega.json` file will be a valid Vega object that will generate a RRNL based on the inputted file. You can insert the Vega object into [the Vega Editor](https://vega.github.io/editor) to view and export the RRNL.
+ - You can also view the RRNL embedded in an HTML file using the generated `vega.html` file.
+ - If your file is an array of multiple objects in the RRNL domain-specific language, then a separate JSON file will be created for each object, titled `vega1.json`, `vega2.json`, etc. Every RRNL in the file will be included in `vega.html`.
+* If you are familiar with Vega, you can edit the outputted Vega object to make any changes to your RRNL that aren't possible with this program.
+
+## Adding Gradients
+
+If you wish to add a gradient to your RRNL, you can do so using `d3.html`.
+
+* Paste the output from `numberline_to_vega.py` into the Vega Editor and click "Export" at the top of the page.
+* Click "Download" under "Export to SVG".
+* Add the downloaded SVG file to the same directory as `d3.html`.
+* In `d3.html`, change the path nme in the line `const svg = await d3.xml("/rrnl/visualization.svg");` to the path to your SVG file.
+* Open `d3.html` locally to view your RRNL.
\ No newline at end of file
diff --git a/rrnl/__pycache__/classes.cpython-312.pyc b/rrnl/__pycache__/classes.cpython-312.pyc
new file mode 100644
index 0000000000..0a1cf539ed
Binary files /dev/null and b/rrnl/__pycache__/classes.cpython-312.pyc differ
diff --git a/rrnl/__pycache__/setters.cpython-312.pyc b/rrnl/__pycache__/setters.cpython-312.pyc
new file mode 100644
index 0000000000..fc9381a72a
Binary files /dev/null and b/rrnl/__pycache__/setters.cpython-312.pyc differ
diff --git a/rrnl/asthmacontrol.json b/rrnl/asthmacontrol.json
new file mode 100644
index 0000000000..a9efaf297d
--- /dev/null
+++ b/rrnl/asthmacontrol.json
@@ -0,0 +1,31 @@
+{
+ "title": {
+ "text": "Level of Asthma Control",
+ "font": "Arial",
+ "fontSize": 13,
+ "color": "black"
+ },
+ "data": {
+ "categories": [
+ {"name": "Controlled", "end": 1.5, "color": "green"},
+ {"name": "Not Controlled", "end": 6.0, "color": "red"}
+ ],
+ "start": 0
+ },
+ "separation": {
+ "color": "black",
+ "width": 5
+ },
+ "labels": {
+ "position": "on"
+ },
+ "tickmarks": {
+ "tickCount": 12,
+ "position": "bottom"
+ },
+ "value_indicator": {
+ "value": 3.2,
+ "title": "Victor's Score",
+ "overlap": false
+ }
+}
\ No newline at end of file
diff --git a/rrnl/classes.py b/rrnl/classes.py
new file mode 100644
index 0000000000..cd500ea1aa
--- /dev/null
+++ b/rrnl/classes.py
@@ -0,0 +1,73 @@
+class Title:
+ def __init__ (self, text: str):
+ self.text = text
+ self.align = "center"
+ self.font = "Arial"
+ self.fontSize = 14
+ self.color = "black"
+
+ def set_align(self, align: str):
+ self.align = align
+
+ def set_font(self, font: str):
+ self.font = font
+
+ def set_fontSize(self, fontSize: int):
+ self.fontSize = fontSize
+
+ def set_color(self, color: str):
+ self.color = color
+
+class Data:
+ def __init__ (self, categories: list):
+ self.categories = categories
+ self.start = 0
+
+ def set_start(self, start: int):
+ self.start = start
+
+class CategorySeparation:
+ def __init__ (self):
+ self.color = "black"
+ self.width = 0
+
+ def set_color(self, color: str):
+ self.color = color
+
+ def set_width(self, width: int):
+ self.width = width
+
+class CategoryLabels:
+ def __init__ (self):
+ self.position = "on"
+
+ def set_position(self, position: str):
+ self.position = position
+
+class TickMarks:
+ def __init__ (self):
+ self.tickCount = 10
+ self.position = "bottom"
+
+ def set_tickCount(self, tickCount: int):
+ self.tickCount = tickCount
+
+ def set_position(self, position: str):
+ self.position = position
+
+
+
+class ValueIndicator:
+ def __init__ (self, value: float, title: str):
+ self.value = value
+ self.title = title
+ self.overlap = False
+
+ def set_value(self, value: int):
+ self.value = value
+
+ def set_title(self, title: str):
+ self.title = title
+
+ def set_overlap(self, overlap: bool):
+ self.overlap = overlap
\ No newline at end of file
diff --git a/rrnl/d3.html b/rrnl/d3.html
new file mode 100644
index 0000000000..460fd6d6c5
--- /dev/null
+++ b/rrnl/d3.html
@@ -0,0 +1,98 @@
+
+
+