Author SHA1 Message Date
nicholas 1cd26839d3 add post 2026-03-31 16:08:02 -05:00
nicholas 87faf40194 🎄 Christmas 2025
Build & Push Hugo Site Image / Build & Push Image (push) Successful in 17s
2025-12-26 12:27:50 -06:00
nicholas 581f0d45da 🔌 Cable Managing
Build & Push Hugo Site Image / Build & Push Image (push) Successful in 53s
2025-12-26 10:10:43 -06:00
nicholas 28980cb3f9 🫓 Par-baking Pizza Crusts
Build & Push Hugo Site Image / Build & Push Image (push) Successful in 48s
2025-12-14 17:28:45 +00:00
nicholas c777230dc4 🛒 Plant Cart Upgrade
Build & Push Hugo Site Image / Build & Push Image (push) Successful in 28s
2025-12-11 23:34:12 +00:00
nicholas acf6c828a5 finish post
Build & Push Hugo Site Image / Build & Push Image (push) Successful in 1m0s
2025-12-07 09:54:21 -06:00
nicholas 0b2a701134 post 2025-10-28 16:04:45 -05:00
nicholas 0f2a3bb547 finish post (closes #14)
Build & Push Hugo Site Image / Build & Push Image (push) Successful in 2m16s
2025-08-27 23:45:33 +00:00
nicholas 5a3c9edf65 add intro content, outline (refs #14) 2025-08-27 23:45:33 +00:00
nicholas 03fd78debd add post, front matter 2025-08-27 23:45:33 +00:00
nicholas a07aa04389 finish post (closes #12)
Build & Push Hugo Site Image / Build & Push Image (push) Successful in 12s
2025-08-12 12:16:06 -05:00
10 changed files with 536 additions and 8 deletions
@@ -0,0 +1,35 @@
+++
categories = ["build","plants"]
tags = ["plants"]
date = 2025-08-08T08:00:00-05:00
description = ""
draft = false
slug = "2025-08-08-plant-cart-upgrade"
title = "🛒 Plant Cart Upgrade"
author = "nicholas"
+++
I need to upsize the plant cart. The current cart is undersized so I will replace it with a very large wire shelving unit.
## Overview
I use cable ties to affix the shop lights to the underside of the wire shelves. There are now three light units:
- 4 ft shop light (2)
- 2 ft shop light
The 2 ft shop light was meant for the old smaller plant cart. New lights are 4 ft long, matching the length of the shelving unit.The lights are powered by a power strip with a 6 ft cord. It is attached to the side of the wire shelf with yet more cable ties. I also removed the overhead EMT conduit-mounted spotlights since they have been replaced by a shop light. It is a cleaner look.
## Images
{{< image src="images/members-mark-6-tier-wire-shelving.png" >}}
{{< image src="images/braun-10000-lumen-LED-shop-light.png" >}}
{{< image src="images/shop-light-mounted.JPG" >}}
{{< image src="images/plant-cart.JPG" >}}
✅ Done.
@@ -0,0 +1,36 @@
+++
categories = ["food"]
date = 2025-12-07T09:00:00Z
description = ""
draft = false
slug = "2025-12-07-mod-pizza-crust-par-bake"
title = "🫓 Par-baking Pizza Crusts"
author = "nicholas"
+++
It is winter time. We live on the third and top floor of an apartment complex, top of the thermal strata. My downstairs neighbors' gas heaters, 250 W of plant lights, a server rack of computer equipment (which I have made some effort to make energy efficient for summertime), and various other, now 100% efficient heat-making household electrical appliances are all that are needed to heat our apartment, even at sustained temperatures as low as ~20°F.
This is the perfect time to batch-par-bake a few pizza crusts. No waste heat!
We made the dough on Saturday night, cold-fermented it in the fridge overnight in little pizza dough proofing pans. A half size sheet pan would not fit in the refrigerator. I moved them to a parchment-lined half size sheet pan to come up to room temperature the following day.
## Process
The process is:
- mix dough
- divide
- shape into balls
- cold ferment 24-72 hr
- allow to warm to room temperature
- preheat baking steel 45 min @ 500° F
- roll out to size (in this case, 14″)
- load onto parchment paper
- dock dough, thoroughly
- launch onto baking steel
- bake ≈ 1 min
- invert, cool on rack ≈ 10 min
- freeze immediately
## Images
{{< gallerynew name="par-bake-pizza-dough-gallery" >}}
@@ -0,0 +1,16 @@
images:
- src: "images/dough-in-proofing-pan.JPG"
alt: "Dough in proofing pan"
caption: "Dough in proofing pan"
- src: "images/dough-in-proofing-box.JPG"
alt: "Dough in proofing box"
caption: "Dough in proofing box"
- src: "images/dough-rolled-circle.JPG"
alt: "Dough rolled flat into a circle"
caption: "Dough rolled flat into a circle"
- src: "images/doughs-rolled-circle.JPG"
alt: "Many dough rolled into circle"
caption: "Many dough rolled into circle"
- src: "images/par-baked-crusts.JPG"
alt: "Par-baked pizza crusts"
caption: "Par-baked pizza crusts"
@@ -0,0 +1,32 @@
+++
categories = ["build"]
date = 2025-12-10T20:03:00-06:00
description = ""
draft = false
slug = "2025-12-10-cable-management"
title = "🔌 Cable Managing"
author = "nicholas"
+++
My computer rack would benefit from some better cable management. To facilitate this I need to make some modifications to the rack:
- Extend the rack to ≈30 in, up from ≈24 in. This wil give me more space at the rear to route cables.
- Move server chassis down for 0U gap. This will give me more space at the top.
- Put wheels back on the rack. This will allow me to roll out the entire rack from the wall for better access.
I purchased these server rack tie bars to give me something to fasten the cables to. I use hook-and-loop straps for this.
{{< image
src="images/server-rack-tie-bar-amazon.png"
alt="Screenshot of Amazon product Server rack tie bar"
caption="Tie bar" >}}
Computer desk needs tidying cables too. I attached a spare wire shelf to the underside of the desk using magnetic hooks. The hook base attaches to the desk's metal support rails.
{{< image
src="images/under-desk-cable-management.JPG"
alt="View under desk" >}}
## Images
{{< gallerynew name="server-rack-gallery" >}}
@@ -0,0 +1,28 @@
images:
- src: "images/server-rack-attach-wheels-half-1.JPG"
alt: ""
caption: ""
- src: "images/server-rack-attach-wheels-half-2.JPG"
alt: ""
caption: ""
- src: "images/server-rack-assembled-hardware.JPG"
alt: ""
caption: ""
- src: "images/server-rack-rear-high.JPG"
alt: ""
caption: ""
- src: "images/server-rack-rear-eye-level.JPG"
alt: ""
caption: ""
- src: "images/server-rack-roll-out-landscape.JPG"
alt: ""
caption: ""
- src: "images/server-rack-roll-out-portrait.JPG"
alt: ""
caption: ""
- src: "images/under-desk-cable-management.JPG"
alt: ""
caption: ""
- src: "images/cable-management-result.JPG"
alt: ""
caption: ""
@@ -0,0 +1,63 @@
+++
categories = ["christmas"]
date = 2025-10-28T16:00:00Z
description = ""
draft = false
slug = "2025-christmas"
title = "🎄 Christmas 2025"
author = "nicholas"
+++
We need Christmas decorations. The most important holiday. Late October is not too soon. How many Christmases do we get in a life? I do not want to think of it.
## ✨ Lights
I attached standard Christmas string lights to the plant cart, a little haphazardly. It will do. I am not sure I will ever take these down. I used maybe 50 cable ties and it will a little tedious to remove them all. Also, it looks not explicitly Christmasy in the mean time, and the room could use more light, although they seem to exhibit a kind of flickering which I read is due to cheap half-wave rectified LED drivers. 60 Hz flickering.
{{< image
src="images/plant-cart-christmas-lights.JPG"
caption="Plant cart Christmas lights" >}}
## 🌲 Tree
The tree is 3 ft tall unlit tree, ($15 at Hobby Lobby). I cannot trust that built-in LEDs on such disposable trees will survive long, so I outfit the tree with removable fairy lights.
A tree skirt covers the private parts of the tree. Also, battery-powered mini Christmas lights.
{{< image
src="images/christmas-tree-night.JPG"
caption="Christmas tree glowing at night" >}}
## 🍃 Wreath
Bailey made a wreath a very long time ago and it continues to decay each year. It will be a shame when it is no longer with us because it is beautiful. We hang this on the front door.
{{< image
src="images/wreath-day.JPG"
caption="Wreath" >}}
{{< image
src="images/wreath-night.JPG"
caption="Wreath glowing at night" >}}
## 🎁 Gifts for Me
Increasing dietary fiber could be a good thing for us, but the process of preparing digestible beans is annoying so I bought us a pressure cooker (**Instant Pot® Pro™ 6QT**). I made rice and it took 5 minutes. Incredible. Apparently legumes can be finished in something like 30 minutes. Wow.
I can play audio through the monitor, but of course they remind me of being on public transportation. Even these very cheap, small bookshelf speakers (**Micca MB42X G2**) are way overpowered for PC speakers, but I had a 50 W stereo amplifier (**SMSL-SA50**) from a very long time ago which can drive them, so I put it to good use.
{{< image
src="images/amazon-orders.png"
caption="Christmas gifts on the way" >}}
## 🎁 Gifts for Thee
Christmas ended up getting CANCELED. Too many illnesses. Now there is a pile of largely empty gift-wrapped boxes arranged merrily in the spare storage bedroom.
{{< image
src="images/gift-stack.JPG"
caption="Gifts" >}}
{{< image
src="images/baileys-sourdough.JPG"
caption="mini sourdough loaves" >}}
{{< image
src="images/baileys-cookies.JPG"
caption="pistachio shortbread cookies, ginger molasses cookies, earl grey macarons" >}}
@@ -0,0 +1,24 @@
+++
categories = ["vehicle"]
date = 2026-03-31T03:58:00-05:00
description = ""
draft = false
slug = "2026-03-31-car-maintenance"
title = "🚗 Car Issue"
author = "nicholas"
+++
Car Issue
## Symptoms
- Issue begins after refueling
- Engine sputters/rough idle when stopped (idle, park, red lights)
- Vehicle lurches while stopped
- Occurs without pressing gas pedal
- No sputtering while driving / under throttle
- Intermittent throttle non-response (pressing gas sometimes has no effect)
## Diagnosing
## Fix
Replace Vapor Canister Purge Solenoid Valve
@@ -0,0 +1,59 @@
+++
categories = ["food"]
tags = ["reverse-engineer","arbys","sauce"]
date = 2025-10-04T13:00:00-05:00
description = ""
draft = false
slug = "arbys-bronco-berry-sauce"
title = "🐎 Arby's Bronco Berry Sauce"
author = "nicholas"
+++
In this fast food reverse engineering post, I reference two documents:
- [Arby's Ingredients](files/arbys-bronco-berry-ingredient-list.pdf)
- [Arby's Nutrition](files/arbys-bronco-berry-nutrition.pdf)
## 📋 Ingredient List
Surpringly, the sauce contains absolutely no berries. In fact, it looks a lot like a basic **sweet and sour sauce**:
{{< image
src="images/arbys-bronco-berry-sauce-ingredient-list.png"
caption="Arby's bronco berry sauce ingredient list" >}}
```
High Fructose Corn Syrup, Water, Bell Pepper, Distilled Vinegar, Modified Corn Starch, Jalapeno Pepper, Vegetable Juice Concentrate (color), Potassium Sorbate and Sodium Benzoate (preservatives), Onion (dehydrated), Salt, Spice, Xanthan Gum, Citric Acid, Acetic Acid.
```
Compare this to *La Choy Sweet and Sour Sauce*. Curious....
{{< image
src="images/La-Choy-Sweet-and-Sour-Stir-Fry-Sauce.avif"
caption="La Choy Sweet and Sour Sauce" >}}
```
Water, Sugar, Distilled Vinegar, Modified Corn Starch, LESS THAN 2% OF: Salt, Pineapple Juice Concentrate, Dried Red Bell Peppers, Oleoresin Paprika.
```
Just look at the overlap. It's essence is a sweet and sour sauce:
| Ingredient | Arby's Bronco Berry | La Choy Sweet and Sour Sauce |
|---|---|---|
| Water | ✅ | ✅ |
| Distilled Vinegar | ✅ | ✅ |
| Modified Corn Starch | ✅ | ✅ |
| Salt | ✅ | ✅ |
| HFCS / Sugar | ✅ | ✅ |
| Bell Pepper | ✅ | ✅ |
| Jalapeno Pepper | ✅ | |
| Pineapple Juice Concentrate | ✅ | |
| Onion (dehydrated) | ✅ | |
| Xanthan Gum | ✅ | |
| Citric Acid | ✅ | |
| Acetic Acid | ✅ | |
| Spice / Oleoresin Paprika | ✅ | ✅ |
✅ Good enough.
@@ -1,7 +1,7 @@
+++
categories = ["build"]
tags = ["bicycle"]
date = 2025-08-07T08:00:00-05:00
date = 2025-08-12T12:15:00-05:00
description = ""
draft = false
slug = "bicycle-headlamp"
@@ -14,7 +14,7 @@ Nighttime bicycle rides in the summer are ideal:
- 🚘 little traffic
- 🦝 nocturnal wildlife
But it is not easy to see in the dark, so I bring a headlamp and okay, fine, this works. With my current head lamp I can see and be seen just fine. But there are some limitations. I see wonderfully directly ahead of me in the narrow cone of light provided, but at the edges of this light cone I see practically nothing at all, as though I am looking through a paper towel roll. The beam pattern is optimized for riding in a straight line, with little regard for what lies in the periphery. **I would like a greater field of view, so I will need a lamp with a wide beam pattern.**
But it is not easy to see in the dark, so I bring a headlamp and *okay, fine, this works*. With my current headlamp I can see and be seen just fine. But there are some limitations. I see wonderfully directly ahead of me in the narrow cone of light provided, but at the edges of this light cone I see practically nothing at all, as though I am looking through a paper towel roll. The beam pattern is optimized for riding in a straight line, with little regard for what lies in the periphery. **I would like a greater field of view, so I will need a lamp with a wide beam pattern.**
## 🔦 Headlamp
I start by selecting the headlamp. This is the most important component, and everything will revolve around it. My selection criteria is simple. The light must have these features:
@@ -36,11 +36,19 @@ I had to settle for the **OPL5 Motorcycle LED Headlamp**:
| Brightness | 3000 lm |
| Color Temperature | 6500K (Cool White) |
**This will have to do**.
{{< image src="images/opl5-motorcycle-led-headlamp.png" >}}
{{< image
src="images/beam-pattern.JPG"
caption="OPL5 Beam against the wall" >}}
Notice the sharp beam cutoff at the top. This is what allows me to have a very bright headlamp while also not blinding oncoming traffic. Also, the beam gradient at the bottom transitions from very bright to very dim, in a manner that maximizes usable light. It concentrates maximum light near the upper cutoff where it will disperse across a large surface area at long distances, while minimizing output in the near and mid field, where the illuminated surface area should be relatively small.
**This will do**.
---
## 🧰 Case
@@ -62,7 +70,7 @@ Since the headlamp consumes 48 W, I need a battery that can sustain this load fo
- $t$ = run time (hr)
- $E_\text{battery}$ = battery energy (Wh)
- $p_\text{load}$ = LED headlamp power (W)
- $P_\text{load}$ = LED headlamp power (W)
$$
t = \frac{12.8 \text{ V} \cdot 16 \text{ Ah}}{48 \text{ W}} = 4.27 \text{ hr}
@@ -113,6 +121,10 @@ Now for final assembly. This is all very simple and I ran into no issues.
- Sealed the power port and switch mounting holes with silicone
- Removed the battery enclosure lid since the battery terminals were ≈ 1 mm proud of the battery box lid. The battery box would still close, but it was straining the plastic and the weather sealing would be compromised.
{{< image
src="images/battery-box-open.JPG"
caption="Battery box inside" >}}
Here is a **wiring diagram** of the circuit.
{{< image src="images/bicycle-headlamp-wiring-diagram.svg" >}}
@@ -124,16 +136,32 @@ Here is a **wiring diagram** of the circuit.
| SW1 | SPST Switch |
| LED1 | 48 W |
I strap the battery box to the rear cargo rack with hook and loop straps.
That is all.
{{< image
src="images/battery-box-power-port.JPG"
caption="Battery box power port" >}}
--
{{< image
src="images/battery-box-switch.JPG"
caption="Battery box switch" >}}
{{< image
src="images/battery-box-mounted.JPG"
caption="Battery box fastened to the rear cargo rack with hook and loop straps" >}}
{{< image
src="images/headlamp-mounted.JPG"
caption="Headlamp on handlebars" >}}
---
## 🚴 Test Drive
All that remains is the test drive.
{{< image src="images/headlamp-night-test-drive.jpg" >}}
{{< image
src="images/headlamp-night-test-drive.jpg"
caption="Wide beam width" >}}
🎉 **It works!**
@@ -0,0 +1,207 @@
+++
categories = ["software"]
tags = ["router","opnsense"]
date = 2025-08-27T18:30:00-05:00
description = ""
draft = false
slug = "router-build"
title = "🔀 Router Build"
author = "nicholas"
+++
My router (**Netgear R6400v2**) lacks many of the features I would like to use and become familiar with:
- VLANs
- Advanced routing, firewall
- Monitoring, logging, alerts
- etc.
**I need a new router.**
I have a few options from here:
1.**Write custom firmware to existing router** (*DD-WRT, OpenWRT, Tomato, etc.*)
- Fun
- Free
- Too much jank
2.**Buy new hardware**
- Very easy setup
- Boring
- 💲 Could require expensive/high-end router hardware
3.**Repurpose existing hardware**
- Fun
- Makes use of an unused **Dell OptiPlex 5050 Micro**
- Can run proper router OS **OPNsense**
- Repurpose router as wireless access point
---
## 🪵 Router-on-a-stick (ROAS)
My VM host (where I will build my router) has only a single NIC, with only one physical port. That means I cannot replicate the exact behavior of ordinary consumer routers, which are typically configured with a dedicated WAN port, and several dedicated LAN ports. The router simply routes between the two. Very simple. I need to find a way to replicate the *function* of such a router without the same *hardware*.
I have a couple of options:
1. ❌ Configure the **virtual switch** on my VM host to perform 802.1Q VLAN tagging for router VM.
- Free, no additional hardware required
2. ✅ Configure a **managed physical switch** to handle 802.1Q VLAN tagging and trunking to the router
- Gain additional physical ports
- 💲 Addtional hardware required
I want the extra ports! I got a **Netgear GS108E-400NAS**. For no other reason than it was available at my local *Best Buy*.
---
## 🖧 Logical Network Topology
This diagram describes approxmiately what I my network will look like:
```mermaid
graph TD
isp["🌐ISP"]
modem["📡Modem"]
switch["🔀Switch"]
subgraph vm-host["VM Host"]
router["🛡️Router (OPNsense)"]
end
wap["🛜WAP"]
nas["🗄️NAS"]
workstation["🖥️Workstation"]
subgraph wireless["Wireless Devices"]
laptop["💻Laptop"]
phone["📱Phone"]
printer["🖨️Printer"]
end
isp --- modem
modem --- switch
switch --- |"🪵 Trunk (VLANs 10,100)"| router
switch --- wap
switch --- nas
switch --- workstation
wap -.- wireless
```
---
## 🔀 Switch Setup & Port VLAN Assignment Table
- First, I need to choose a subnet for my network and assign my switch an IP accordingly. I chose 10.0.0.0/8 subnet. It just looks good.
- Next I cofigure my switch with a **trunk port**. This port will link to the router and carry multiple VLANs: **VLAN 10** (LAN), **VLAN 100** (WAN). This allows my router to distinguish between WAN and LAN with just one physical port. Instead of a phyiscal port to ditinguish WAN and LAN, the distinction is made virtually using VLAN tags.
- This means I will also need to configure a separate port for VLAN 100 (modem/ISP uplink), so that all traffic on that port is tagged and forwarded as WAN traffic.
| Port | Device | VLAN Mode | PVID | Tagged VLANs |
|-|-|-|-|-|
| 1 | Router | Trunk | 10 | 10,100 |
| 2 | Workstation | Access | 10 | - |
| 3 | NAS | Access | 10 | - |
| 4 | WAP | Access | 10 | - |
| 5 | - | Access | 10 | - |
| 6 | - | Access | 10 | - |
| 7 | - | Management | 1 | - |
| 8 | Modem | Access | 100 | - |
---
**Switch VLAN tagging**
```mermaid
flowchart TD
lan["🏠LAN"]
modem["🌐Modem/ISP"]
switch[🔀Switch]
subgraph router["🛡️Router"]
wan_interface["🌐WAN Interface"]
lan_interface["🏠LAN Interface"]
end
lan -- "`
*🗅untagged*
🔵access port **VLAN 10**
`" --> switch
modem -- "`
*🗅untagged*
🔵access port **VLAN 100**`" --> switch
switch -- "*🏷️tagged* VLAN 10" --> lan_interface
switch -- "*🏷️tagged* VLAN 100" --> wan_interface
```
✅ Done. Now I configure a VM for the router.
---
## 🖥️ VM Configuration
I need to configure a VM to serve as a router:
- COnfigure VM specs:
- 20 GB vdisk
- 3 GB RAM
- 1 vCPU
- Install OPNsense OS
- Configure VM network adapter with static MAC address (spoof old netgear router MAC, keep current DHCP IP)
- Configure host OS network adapter to carry VLAN ID 10 only
- Configure VM network adapter to carry VLANs ID 10,100
✅ Done. Now I can configure OPNsense.
---
## 🛡️ OPNsense
{{< image
src="images/OPNsense-dashboard.png"
caption="OPNsense Dashboard" >}}
##### Interfaces
According to the plan, I need to configure OPNsense with an interface for each VLAN I configured:
- VLAN **10** for **LAN**
- VLAN **100** for **WAN**
##### DNSMasq DHCP
Since I want most of my devices to be assigned IPs dynamically, I enable DHCP on the LAN interface.
- Start address: 10.0.10.3
- End address: 10.0.10.100
- 10.0.10.100 - 10.0.10.200 are reserved for static / wired devices.
##### Unbound DNS
I also want to use my router as a DNS server for local DNS resolution, so I enable **Unbound DNS**. This is where I can configure A records (host override), and CNAME records (alias).
**For example:**
| Record Type | Name | Value |
|-|-|-|
| A | proxy.internal.domain.com | 10.0.10.100 |
| CNAME | git.domain.com | proxy.internal.domain.com |
##### Query Forwarding
Now that I have given my wired devices static IPs, I can do query forwarding to Pi-Hole. This will enable network-wide ad blocking.
```mermaid
flowchart LR
client[💻Client] --> router-dns["`
🛡️Router
(Local DNS)
`"]
router-dns --> pihole[🕳️Pi-hole]
pihole --> upstream["`
☁️ Upstream DNS
(e.g. 8.8.8.8)`"
]
```
##### Firewall - GeoIP
I use [MaxMind GeoIP database](https://AccountID:LicenseKey@download.maxmind.com/geoip/databases/GeoLite2-Country-CSV/download?suffix=zip) to create a firewall alias. Then I configured a firewall rule on WAN interface which blocks any IP that matches those configured in the alias. I am blocking IPs from most countries.
This nearly eliminates unwanted traffic from annoying and/or malicious bots scanning and scraping my network
**MaxMind GeoIP database**:`https://AccountID:LicenseKey@download.maxmind.com/geoip/databases/GeoLite2-Country-CSV/download?suffix=zip`
🎉 It works!
{{< video
src="videos/router-traffic-graph-live.mp4"
width="100%"
>}}
✅ Done.