` like below:
+
+
+
+If you got all the way here, then congratulations! You can now successfully
+code from your Windows 10 machine using VSCode and see those changes
+reflected in real time in your server. Try it out by creating a hello-world
+view inside your helloworld app!
+
+### Test VSCode by Making Hello World View
+
+From your `helloworld` app folder, go to `config > routes.rb` and double
+click the file to open. Add the following line inside the `Rails.application.routes.draw do` block:
+
+```ruby
+ root 'application#hello'
+```
+
+
+
+Then go to `app > controllers > application_controller.rb` and open the file.
+Inside the `ApplicationController` class, add the following instance method:
+
+```ruby
+ def hello
+ render html: ("Hello worlddd 🔥!!!
").html_safe
+ end
+```
+
+
+
+
+
+Now let's boot up the server again, and let's do it well. At the menu on the
+top, click on `Terminal > New Terminal`, or better yet, press ``CTRL+SHIFT+` ``
+(*" \` " is the key next to "1" in your keyboard*).
+
+
+
+Once you open the terminal, **make sure that the commands are being run from the helloworld folder.** This can be double-checked by looking at the
+terminal line:
+
+
+
+If everything is going according to plan, then type the following in this
+new terminal:
+
+```bash
+rails server -b 0.0.0.0 -p 3000
+```
+
+If you have done everything well up to this point, visit
+and you will see this:
+
+
+
+> **Don't forget to stop the server again, CTRL+C.**
+
+Congratulations, you are now up and running with VSCode + WSL2 + Ruby on Rails.
+Nothing is stopping you now.
+
+
+
+TODO
+
+* Windows terminal
+* Setting up VSCode via WSL 2 connection
+* Forwarding ports, making website discoverable in local
+network on startup (NIC bridge)
+* Allowing connection via hostname instead of IP
+* Advanced: Setting up VSCode via SSH, automating SSH Daemon
+on startup
+
+
+
+
+
\ No newline at end of file
diff --git a/img/fstupdate.png b/img/fstupdate.png
new file mode 100644
index 0000000..a5fa142
Binary files /dev/null and b/img/fstupdate.png differ
diff --git a/img/gorails1.png b/img/gorails1.png
new file mode 100644
index 0000000..4704fad
Binary files /dev/null and b/img/gorails1.png differ
diff --git a/img/helloworld-controller.png b/img/helloworld-controller.png
new file mode 100644
index 0000000..bcf7562
Binary files /dev/null and b/img/helloworld-controller.png differ
diff --git a/img/helloworld-routes.png b/img/helloworld-routes.png
new file mode 100644
index 0000000..5c29f4e
Binary files /dev/null and b/img/helloworld-routes.png differ
diff --git a/img/helloworld-success.png b/img/helloworld-success.png
new file mode 100644
index 0000000..d8d55b3
Binary files /dev/null and b/img/helloworld-success.png differ
diff --git a/img/insider1.png b/img/insider1.png
new file mode 100644
index 0000000..ae771c0
Binary files /dev/null and b/img/insider1.png differ
diff --git a/img/new-terminal.png b/img/new-terminal.png
new file mode 100644
index 0000000..2fc8b62
Binary files /dev/null and b/img/new-terminal.png differ
diff --git a/img/pumaboot.png b/img/pumaboot.png
new file mode 100644
index 0000000..d3ac884
Binary files /dev/null and b/img/pumaboot.png differ
diff --git a/img/remoteext.png b/img/remoteext.png
new file mode 100644
index 0000000..51ced19
Binary files /dev/null and b/img/remoteext.png differ
diff --git a/img/terminal-right.png b/img/terminal-right.png
new file mode 100644
index 0000000..0e7ac72
Binary files /dev/null and b/img/terminal-right.png differ
diff --git a/img/vimins.png b/img/vimins.png
new file mode 100644
index 0000000..a025f7c
Binary files /dev/null and b/img/vimins.png differ
diff --git a/img/vimpaste.png b/img/vimpaste.png
new file mode 100644
index 0000000..a7baf35
Binary files /dev/null and b/img/vimpaste.png differ
diff --git a/img/winfeatures.png b/img/winfeatures.png
new file mode 100644
index 0000000..4920f1b
Binary files /dev/null and b/img/winfeatures.png differ
diff --git a/img/winstore.png b/img/winstore.png
new file mode 100644
index 0000000..4037fa9
Binary files /dev/null and b/img/winstore.png differ
diff --git a/img/winver.png b/img/winver.png
new file mode 100644
index 0000000..dc15ee1
Binary files /dev/null and b/img/winver.png differ
diff --git a/img/wsl-available.png b/img/wsl-available.png
new file mode 100644
index 0000000..df10646
Binary files /dev/null and b/img/wsl-available.png differ
diff --git a/img/wsl-installing.png b/img/wsl-installing.png
new file mode 100644
index 0000000..4c98848
Binary files /dev/null and b/img/wsl-installing.png differ
diff --git a/img/wsl-successful.png b/img/wsl-successful.png
new file mode 100644
index 0000000..ed96922
Binary files /dev/null and b/img/wsl-successful.png differ
diff --git a/img/wsllist.png b/img/wsllist.png
new file mode 100644
index 0000000..2d6a91e
Binary files /dev/null and b/img/wsllist.png differ
diff --git a/img/yayrails.png b/img/yayrails.png
new file mode 100644
index 0000000..c337bce
Binary files /dev/null and b/img/yayrails.png differ
diff --git a/ports/config.ps1 b/ports/config.ps1
new file mode 100644
index 0000000..a74881a
--- /dev/null
+++ b/ports/config.ps1
@@ -0,0 +1,68 @@
+# Give process admin privileges:
+param([switch]$Elevated)
+
+function Test-Admin {
+ $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
+ $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
+}
+
+if ((Test-Admin) -eq $false) {
+ if ($elevated)
+ {
+ # tried to elevate, did not work, aborting
+ }
+ else {
+ Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
+ # If we want to keep the window open after running:
+ # Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
+}
+
+exit
+}
+
+'Running with full privileges'
+
+# Get WSL virtual IP:
+$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
+$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
+
+if( $found ){
+ $remoteport = $matches[0];
+} else{
+ Write-Output "The Script Exited, the ip address of WSL 2 cannot be found";
+ exit;
+}
+
+#[Ports]
+
+#All the ports you want to forward separated by coma
+$ports=@(80,2223,3000);
+
+
+#[Static ip]
+#You can change the addr to your ip config to listen to a specific address
+$addr='0.0.0.0';
+$ports_a = $ports -join ",";
+
+#[Firewall]
+#More often than not, Windows firewall will block connections even from local network, so
+#we will open the ports above for PRIVATE connections only. It is STRONGLY advised against
+#opening ports in Public networks, specially for mobile devices that may automatically
+#connect to unsafe networks. If you're sure you want Public access to your server, then
+#change the rules below under the "-Profile" option (look up the right syntax online):
+
+#Remove existing Firewall Exception Rules, if any
+Invoke-Expression "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";
+
+#Adding Exception Rules for inbound and outbound Rules
+Invoke-Expression "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Profile Private -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
+Invoke-Expression "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Profile Private -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
+
+#Bridge the connection such that your
+for( $i = 0; $i -lt $ports.length; $i++ ){
+ $port = $ports[$i];
+ Invoke-Expression "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
+ Invoke-Expression "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
+}
+
+exit
\ No newline at end of file