diff --git a/ETR-NodeScope-Sizzle-Reel.html b/ETR-NodeScope-Sizzle-Reel.html index 1576aec..ada321c 100644 --- a/ETR-NodeScope-Sizzle-Reel.html +++ b/ETR-NodeScope-Sizzle-Reel.html @@ -2,7 +2,7 @@ - ETR-NodeScope · Sizzle Reel + Event Tech Research · NodeScope — Sizzle Reel + + + +
+ + + + + + + + + NODESCOPE + ETR · STAY CONNECTED + +
+
Unpacking...
+ + + + + + + + + + \ No newline at end of file diff --git a/MYLan-DHCP-Interactive-Guide.html b/MYLan-DHCP-Interactive-Guide.html new file mode 100644 index 0000000..39b20cc --- /dev/null +++ b/MYLan-DHCP-Interactive-Guide.html @@ -0,0 +1,618 @@ + + + + + MYLan DHCP Interactive Guide | Event Tech Research + + + + + + + + + + + + + + + + + + +
+
+ +

MYLan / DHCP education

+

Understanding DHCP through a practical field network tool.

+

+ Every device on a network needs an IP address before it can talk. This Event Tech Research guide explains how DHCP works, why it matters, and how MYLan can support temporary audio, production, and engineering networks. +

+
+ Interactive + DHCP Protocol + MYLan + Field Networks +
+ +
+ + + +
+ +
+

Why DHCP Exists

+

Every device on an IP network needs a unique address to send and receive data. Without one, it cannot participate — it is invisible.

+

There are two ways a device can get an IP address:

+
+
+

Manual (Static)

+

Someone types the address into each device by hand. Works for small setups. Breaks at scale — one typo, one duplicate, and the network has a conflict.

+
+
+

Automatic (DHCP)

+

A server listens for new devices and hands out unique addresses from a pool. No human involvement. No duplicates. Devices just connect and work.

+
+
+

DHCP — Dynamic Host Configuration Protocol — is the automatic method. It has been the standard since 1993 (RFC 1531) and is used on virtually every network in the world, from home Wi-Fi to live event production.

+ +
+ MYLan in practice + You are setting up a temporary Dante audio network for a live show. 40 devices need IP addresses: consoles, stage boxes, amplifiers, wireless receivers. You plug in your laptop, launch MYLan, click Start. Every device that connects receives an address automatically. No spreadsheet. No conflicts. +
+
+ + +
+

The DORA Handshake

+

When a device connects to a network and needs an IP address, it performs a four-step conversation with the DHCP server. This is called DORA:

+ +
+
+
+
💻
Client
No IP
+
🖧
MYLan Server
192.168.1.1
+
+
+
D — Discover
+
O — Offer
+
R — Request
+
A — Acknowledge
+
+
+ + + + Step 0 / 4 +
+
Click Play to watch the full handshake, or Step to advance one message at a time.
+
+
+ +
+ What happens at each step +
+

1. Discover

+

The client has no IP address yet. It cannot send to a specific server because it does not know if one exists. So it broadcasts to the entire network: "Is there a DHCP server out there?"

+

This broadcast goes to the special address 255.255.255.255 on UDP port 67. Every device on the network segment receives it, but only DHCP servers respond.

+ +

2. Offer

+

The server receives the Discover and selects an available IP from its pool. It broadcasts an Offer back: "I can give you 192.168.1.50 with these settings."

+

The Offer includes the proposed IP, the subnet mask, the gateway, the DNS server, and how long the lease is valid for.

+ +

3. Request

+

The client broadcasts a Request confirming it wants the offered address: "Yes, I accept 192.168.1.50 from server 192.168.1.1."

+

This is broadcast (not unicast) because there might be multiple DHCP servers on the network. The Request tells all of them which offer was accepted.

+ +

4. Acknowledge

+

The server confirms the lease and commits it to its records: "Confirmed. 192.168.1.50 is yours for 8 hours."

+

The client can now configure its network stack with the assigned address and begin communicating on the network.

+
+
+ +
+ MYLan's activity log + When you watch MYLan's log during a real connection, you see exactly this sequence: DISCOVER from [MAC] → Sent OFFER → REQUEST from [MAC] → Sent ACK. Each line is timestamped so you can trace exactly when each device joined the network. +
+
+ + +
+

Inside a DHCP Packet

+

DHCP messages are carried inside UDP datagrams using the BOOTP packet format. Every message — Discover, Offer, Request, Acknowledge — uses the same structure. Click on any field group to learn what it does.

+ +
+
+ Op / HW + Transaction ID + Your IP (yiaddr) + Server IP (siaddr) + Client MAC (chaddr) + Magic Cookie +
+
+
Click a coloured field group above to explore that part of the packet.
+
+ +
+ Key fields explained +
+

Op (byte 0)

+

1 = BOOTREQUEST (client → server). 2 = BOOTREPLY (server → client). MYLan only processes requests and only sends replies.

+

Transaction ID — xid (bytes 4–7)

+

A random 32-bit number chosen by the client. The server copies it into the reply so the client can match responses to requests, even if multiple DORA handshakes are in flight simultaneously.

+

yiaddr — "Your" IP Address (bytes 16–19)

+

In an Offer or Acknowledge, this is the IP the server is assigning to the client. In a Discover, it is all zeros because the client has no address yet.

+

chaddr — Client Hardware Address (bytes 28–33)

+

The client's MAC address. This is how the server identifies which device is which — it is the key that the lease table is indexed by.

+

Magic Cookie (bytes 236–239)

+

The fixed value 99.130.83.99 (hex 63.82.53.63). This marks the boundary between the fixed BOOTP header and the variable DHCP options that follow. Every valid DHCP packet contains this exact sequence.

+
+
+
+ + +
+

Lease Management

+

When a server assigns an IP, it does not give it away permanently. It creates a lease — a time-limited reservation that ties a MAC address to an IP address. This is the core data structure of any DHCP server.

+ +
+

Live Lease Simulator

+

Simulate devices connecting to a MYLan server. Watch how the lease table fills.

+
+ + + + +
+ + + +
StatusMAC AddressIP AddressExpires
+
Pool: 192.168.1.50 – 192.168.1.150 · 0 / 101 addresses used
+
+ +
+ Why leases expire +
+

If leases were permanent, a device that disconnected would hold its IP address forever. Over time, all addresses would be consumed by devices that are no longer on the network.

+

Expiry solves this. MYLan uses an 8-hour default lease. When the lease expires, the IP returns to the pool and can be assigned to the next device that connects.

+

Active clients renew their lease automatically before it expires — they send a new REQUEST and receive a fresh ACK with a reset timer. The user never notices this happening.

+
+
+ +
+ MYLan v2.1 — Lease persistence + MYLan saves active leases to mylan-leases.json on disk. If the server stops and restarts — even mid-show — it reloads the lease table and remembers which devices have which addresses. This prevents the duplicate IP issue that affects simpler DHCP implementations. +
+
+ + +
+

DHCP Options

+

After the fixed header and magic cookie, DHCP packets carry a variable list of options — key-value pairs that configure the client. Each option has a number, a length, and a value. Click any option to learn more.

+ +
+
+
Click an option above to see what it does and how MYLan uses it.
+
+
+ + +
+

Using MYLan in the Field

+

MYLan is a portable DHCP server built for field deployment. It runs on Windows and macOS, requires no installation, and provides a complete DHCP service from a single executable.

+ +
+ Step 1 — Connect and Launch +
+

Connect your laptop to the target network via Ethernet. Launch MYLan with elevated privileges — Run as Administrator on Windows, or sudo ./MYLan on macOS. The application window appears with the status indicator showing Idle.

+

If you do not run with elevated privileges, MYLan displays a warning in the footer bar. DHCP requires binding to UDP port 67, which is a privileged port on all operating systems.

+
+
+ +
+ Step 2 — Select Adapter and Configure +
+

Select the correct network adapter from the dropdown. Click Refresh NICs if you plugged in after launching. Review the network configuration:

+
+

Server IP

The address MYLan assigns to itself. Default: 192.168.1.1

+

Subnet Mask

Defines the network boundary. Default: 255.255.255.0 (/24)

+

Pool Range

The range of addresses available for clients. Default: .50 – .150

+

Gateway

The default route for client traffic. Auto-syncs with Server IP.

+

DNS

Domain name resolution server. Default: 8.8.8.8 (Google Public DNS)

+
+

For Dante audio networks, a common configuration uses 10.0.0.1 with a pool of 10.0.0.10 – 10.0.0.200.

+
+
+ +
+ Step 3 — Start and Monitor +
+

Click ▶ Start. MYLan configures the adapter with a static IP and begins listening for DHCP broadcasts. The status indicator turns green and the activity log begins recording.

+

Connect client devices. Watch the log for the DORA sequence. Each successful connection appears as four log entries (DISCOVER → OFFER → REQUEST → ACK) and a new row in the Active Leases table.

+
+
+ +
+ Step 4 — Stop and Tear Down +
+

Click ■ Stop. MYLan saves all active leases to disk and closes the UDP listener. Existing clients keep their addresses for the remaining lease duration (8 hours by default).

+

After stopping, restore the adapter to automatic (DHCP) configuration via your OS network settings if you need to reconnect to other networks.

+
+
+
+ + +
+

Troubleshooting

+

Click a symptom to see the diagnosis and resolution.

+ +
+
+ + +
+

Test Yourself

+

Seven questions to check your understanding. Select the best answer for each.

+ +
+ +
+ +
+
+ + +
+
+ + + + + + diff --git a/assets/site OLD.css b/assets/site OLD.css new file mode 100644 index 0000000..57bbab9 --- /dev/null +++ b/assets/site OLD.css @@ -0,0 +1,537 @@ +:root{ + --bg:#02040a; + --panel:#10121a; + --panel-dark:#050609; + --text:#f9fafb; + --muted:#d1d5db; + --soft:#9ca3af; + --line:#3f3f46; + --line-soft:#27272f; + --accent:#70f0cf; + --accent-warm:#f5c86f; + --radius:8px; + --shadow:0 10px 30px rgba(0,0,0,.6); + --max:980px; +} + +*{box-sizing:border-box} + +html{ + scroll-behavior:smooth; + overflow-x:hidden; +} + +body{ + margin:0; + font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; + background:radial-gradient(circle at top,#061020,#02040a 48rem); + color:var(--text); + min-height:100vh; + overflow-x:hidden; +} + +body::selection{ + background:rgba(112,240,207,.35); +} + +a{color:inherit} + +.skip-link{ + position:absolute; + left:1rem; + top:-4rem; + z-index:100; + background:#f9fafb; + color:#02040a; + padding:.55rem .8rem; + border-radius:var(--radius); +} + +.skip-link:focus{top:1rem} + +.site-header{ + position:sticky; + top:0; + z-index:20; + display:flex; + align-items:center; + justify-content:space-between; + gap:1.2rem; + padding:1rem 7vw; + background:rgba(3,4,7,.96); + border-bottom:1px solid #111827; + backdrop-filter:blur(16px); +} + +.brand{ + display:flex; + align-items:center; + gap:.75rem; + color:var(--text); + text-decoration:none; + min-width:14rem; +} + +.logo-img{ + width:42px; + height:42px; + flex:0 0 auto; + display:grid; + place-items:center; +} + +.logo-img img{ + width:100%; + height:100%; + object-fit:contain; +} + +.brand-text-title{ + display:block; + font-weight:700; + letter-spacing:.04em; + text-transform:uppercase; +} + +.brand-text-sub{ + display:block; + font-size:.7rem; + color:var(--muted); + letter-spacing:.18em; + text-transform:uppercase; +} + +.site-nav{ + display:flex; + gap:.5rem; + flex-wrap:wrap; + justify-content:flex-end; + align-items:center; +} + +.nav-link, +.chip, +.button{ + display:inline-flex; + align-items:center; + gap:.4rem; + border-radius:999px; + border:1px solid var(--line-soft); + background:#09090b; + color:var(--muted); + text-decoration:none; + white-space:nowrap; + transition:border-color .15s ease,color .15s ease,background .15s ease,transform .15s ease; +} + +.nav-link{ + padding:.34rem .72rem; + font-size:.76rem; +} + +.chip{ + padding:.35rem .75rem; + font-size:.82rem; +} + +.button{ + padding:.62rem 1rem; + font-size:.9rem; + color:#f3f4f6; +} + +.button.primary{ + border-color:rgba(112,240,207,.7); + background:rgba(112,240,207,.12); + color:#f9fafb; +} + +.nav-link:hover, +.nav-link[aria-current="page"], +.chip:hover, +.button:hover{ + border-color:#e5e7eb; + color:#e5e7eb; + background:#111827; + transform:translateY(-1px); +} + +.dot{ + width:6px; + height:6px; + border-radius:50%; + background:var(--accent); + box-shadow:0 0 12px rgba(112,240,207,.55); + flex:0 0 auto; +} + +.site-main{ + max-width:var(--max); + margin:auto; + padding:0 7vw 3.2rem; + display:grid; + gap:1.55rem; + position:relative; +} + +.hero{ + position:relative; + text-align:center; + padding-top:5.7rem; + padding-bottom:3.25rem; + display:grid; + gap:1rem; +} + +.hero::before{ + content:""; + position:absolute; + top:-40px; + left:50%; + width:100vw; + height:calc(100% + 80px); + transform:translateX(-50%); + background: + linear-gradient(to bottom,rgba(5,10,25,.43),rgba(2,4,10,.92)), + linear-gradient(to right, + #02040a 0%, + rgba(2,4,10,.34) 18%, + rgba(2,4,10,.34) 82%, + #02040a 100% + ), + url("/assets/circuit-main.png") center top / cover no-repeat; + z-index:-1; +} + +.hero.compact{ + padding-top:4.9rem; + padding-bottom:2.7rem; +} + +.breadcrumb{ + display:flex; + flex-wrap:wrap; + justify-content:center; + gap:.45rem; + color:var(--muted); + font-size:.75rem; + letter-spacing:.14em; + text-transform:uppercase; +} + +.breadcrumb a{ + color:#f3f4f6; + text-decoration:none; +} + +.breadcrumb a:hover{text-decoration:underline} + +.kicker, +.section-title{ + margin:0; + color:var(--muted); + font-size:.78rem; + letter-spacing:.16em; + text-transform:uppercase; +} + +.kicker{ + justify-self:center; + display:inline-flex; + align-items:center; + gap:.45rem; + padding:.28rem .9rem; + border:1px solid var(--line-soft); + border-radius:999px; + background:rgba(15,23,42,.9); +} + +h1, +h2, +h3, +p{margin-top:0} + +h1{ + margin-bottom:0; + font-size:clamp(2.2rem,3.8vw,2.95rem); + line-height:1.2; + letter-spacing:0; +} + +h2{ + margin-bottom:.65rem; + font-size:1.2rem; + line-height:1.32; +} + +h3{ + margin-bottom:.4rem; + font-size:1rem; + line-height:1.35; +} + +.accent{ + text-decoration:underline; + text-decoration-color:var(--accent); + text-decoration-thickness:2px; + text-underline-offset:5px; +} + +.lead{ + max-width:56rem; + margin:0 auto; + color:#e5e7eb; + font-size:1rem; + line-height:1.9; +} + +.copy{ + color:#f3f4f6; + line-height:1.85; +} + +.muted{color:var(--muted)} +.soft{color:var(--soft)} + +.actions, +.pill-row{ + display:flex; + flex-wrap:wrap; + align-items:center; + justify-content:center; + gap:.55rem; +} + +.actions{margin-top:.2rem} + +.pill{ + display:inline-flex; + align-items:center; + gap:.45rem; + padding:.38rem .72rem; + border:1px solid var(--line-soft); + border-radius:999px; + background:rgba(9,9,11,.68); + color:#e5e7eb; + font-size:.82rem; +} + +.grid{ + display:grid; + gap:1.2rem; +} + +.grid-2, +.grid-3{ + grid-template-columns:1fr; +} + +.section-heading{ + display:grid; + gap:.35rem; +} + +.section-heading p{ + margin:0; + color:var(--muted); + line-height:1.75; +} + +.card{ + position:relative; + overflow:hidden; + padding:1.55rem 1.7rem; + background:linear-gradient(to bottom,var(--panel),var(--panel-dark)); + border:1px solid var(--line); + border-radius:var(--radius); + box-shadow:var(--shadow); +} + +.card::after{ + content:""; + position:absolute; + inset:0 0 auto; + height:1px; + background:linear-gradient(to right,transparent,rgba(249,250,251,.44),transparent); + opacity:.72; +} + +.card p{ + margin-bottom:.65rem; + color:#f3f4f6; + line-height:1.85; +} + +.card p:last-child{margin-bottom:0} + +ul{ + margin:.6rem 0 0; + padding-left:1.1rem; + color:#e5e7eb; + line-height:1.85; +} + +li{margin:.25rem 0} + +.plain-list{ + list-style:none; + padding:0; +} + +.plain-list li{ + display:flex; + gap:.55rem; +} + +.plain-list li::before{ + content:""; + width:6px; + height:6px; + margin-top:.72rem; + border-radius:50%; + background:var(--accent-warm); + flex:0 0 auto; +} + +.fine{ + color:var(--muted); + font-size:.86rem; + line-height:1.8; +} + +.split{ + display:grid; + gap:1.2rem; +} + +.metric{ + display:grid; + gap:.15rem; +} + +.metric strong{ + color:#fff; + font-size:1.35rem; +} + +.metric span{ + color:var(--muted); + font-size:.84rem; +} + +.contact-list{ + display:grid; + gap:.75rem; + margin:0; +} + +.contact-list dd{ + margin:.28rem 0 0; +} + +.contact-list a{ + color:#f9fafb; + text-decoration:none; +} + +.contact-list a:hover{text-decoration:underline} + +.site-footer{ + margin-top:2rem; + padding:2rem 7vw; + border-top:1px solid #111827; + color:var(--muted); + font-size:.82rem; +} + +.footer-inner{ + max-width:var(--max); + margin:auto; + display:flex; + flex-wrap:wrap; + align-items:center; + justify-content:space-between; + gap:1rem; +} + +.footer-links{ + display:flex; + flex-wrap:wrap; + gap:.75rem; +} + +.footer-links a{ + color:var(--muted); + text-decoration:none; +} + +.footer-links a:hover{ + color:#f3f4f6; + text-decoration:underline; +} + +@media (min-width:760px){ + .grid-2{grid-template-columns:1.1fr 1fr} + .grid-3{grid-template-columns:repeat(3,1fr)} + .split{grid-template-columns:1fr 1fr} +} + +@media (max-width:760px){ + .site-header{ + align-items:flex-start; + flex-direction:column; + gap:.8rem; + } + + .site-nav{ + width:100%; + justify-content:flex-start; + flex-wrap:nowrap; + overflow-x:auto; + padding-bottom:.15rem; + scrollbar-width:none; + -webkit-overflow-scrolling:touch; + } + + .site-nav::-webkit-scrollbar{display:none} + + .nav-link{ + flex:0 0 auto; + } +} + +@media (max-width:640px){ + .site-header, + .site-main, + .site-footer{ + padding-inline:5vw; + } + + .hero{ + padding-top:2.6rem; + padding-bottom:1.9rem; + } + + .hero.compact{ + padding-top:2.5rem; + padding-bottom:1.8rem; + } + + .hero::before{ + top:-30px; + height:calc(100% + 60px); + background-size:180% auto; + } + + .card{ + padding:1.25rem; + } + + h1{ + font-size:2rem; + } + + .brand{ + min-width:0; + } +} diff --git a/assets/site.css b/assets/site.css index 57bbab9..b13e5e9 100644 --- a/assets/site.css +++ b/assets/site.css @@ -9,9 +9,9 @@ --line-soft:#27272f; --accent:#70f0cf; --accent-warm:#f5c86f; - --radius:8px; + --radius:10px; --shadow:0 10px 30px rgba(0,0,0,.6); - --max:980px; + --max:1280px; } *{box-sizing:border-box} @@ -56,8 +56,8 @@ a{color:inherit} display:flex; align-items:center; justify-content:space-between; - gap:1.2rem; - padding:1rem 7vw; + gap:1.5rem; + padding:1.1rem 5vw; background:rgba(3,4,7,.96); border-bottom:1px solid #111827; backdrop-filter:blur(16px); @@ -66,15 +66,15 @@ a{color:inherit} .brand{ display:flex; align-items:center; - gap:.75rem; + gap:.9rem; color:var(--text); text-decoration:none; - min-width:14rem; + min-width:16rem; } .logo-img{ - width:42px; - height:42px; + width:52px; + height:52px; flex:0 0 auto; display:grid; place-items:center; @@ -88,6 +88,7 @@ a{color:inherit} .brand-text-title{ display:block; + font-size:1rem; font-weight:700; letter-spacing:.04em; text-transform:uppercase; @@ -95,7 +96,7 @@ a{color:inherit} .brand-text-sub{ display:block; - font-size:.7rem; + font-size:.75rem; color:var(--muted); letter-spacing:.18em; text-transform:uppercase; @@ -125,18 +126,18 @@ a{color:inherit} } .nav-link{ - padding:.34rem .72rem; - font-size:.76rem; + padding:.42rem .9rem; + font-size:.88rem; } .chip{ - padding:.35rem .75rem; - font-size:.82rem; + padding:.42rem .9rem; + font-size:.9rem; } .button{ - padding:.62rem 1rem; - font-size:.9rem; + padding:.72rem 1.25rem; + font-size:1rem; color:#f3f4f6; } @@ -157,8 +158,8 @@ a{color:inherit} } .dot{ - width:6px; - height:6px; + width:7px; + height:7px; border-radius:50%; background:var(--accent); box-shadow:0 0 12px rgba(112,240,207,.55); @@ -168,19 +169,19 @@ a{color:inherit} .site-main{ max-width:var(--max); margin:auto; - padding:0 7vw 3.2rem; + padding:0 5vw 4rem; display:grid; - gap:1.55rem; + gap:2rem; position:relative; } .hero{ position:relative; text-align:center; - padding-top:5.7rem; - padding-bottom:3.25rem; + padding-top:7rem; + padding-bottom:4.5rem; display:grid; - gap:1rem; + gap:1.4rem; } .hero::before{ @@ -204,8 +205,8 @@ a{color:inherit} } .hero.compact{ - padding-top:4.9rem; - padding-bottom:2.7rem; + padding-top:5.5rem; + padding-bottom:3.5rem; } .breadcrumb{ @@ -230,7 +231,7 @@ a{color:inherit} .section-title{ margin:0; color:var(--muted); - font-size:.78rem; + font-size:.88rem; letter-spacing:.16em; text-transform:uppercase; } @@ -239,8 +240,8 @@ a{color:inherit} justify-self:center; display:inline-flex; align-items:center; - gap:.45rem; - padding:.28rem .9rem; + gap:.5rem; + padding:.36rem 1.1rem; border:1px solid var(--line-soft); border-radius:999px; background:rgba(15,23,42,.9); @@ -253,20 +254,20 @@ p{margin-top:0} h1{ margin-bottom:0; - font-size:clamp(2.2rem,3.8vw,2.95rem); - line-height:1.2; - letter-spacing:0; + font-size:clamp(2.8rem,4.5vw,3.8rem); + line-height:1.18; + letter-spacing:-.01em; } h2{ - margin-bottom:.65rem; - font-size:1.2rem; + margin-bottom:.75rem; + font-size:1.45rem; line-height:1.32; } h3{ - margin-bottom:.4rem; - font-size:1rem; + margin-bottom:.5rem; + font-size:1.15rem; line-height:1.35; } @@ -278,15 +279,16 @@ h3{ } .lead{ - max-width:56rem; + max-width:68rem; margin:0 auto; color:#e5e7eb; - font-size:1rem; + font-size:1.15rem; line-height:1.9; } .copy{ color:#f3f4f6; + font-size:1.05rem; line-height:1.85; } @@ -307,18 +309,18 @@ h3{ .pill{ display:inline-flex; align-items:center; - gap:.45rem; - padding:.38rem .72rem; + gap:.5rem; + padding:.48rem .9rem; border:1px solid var(--line-soft); border-radius:999px; background:rgba(9,9,11,.68); color:#e5e7eb; - font-size:.82rem; + font-size:.92rem; } .grid{ display:grid; - gap:1.2rem; + gap:1.5rem; } .grid-2, @@ -340,7 +342,7 @@ h3{ .card{ position:relative; overflow:hidden; - padding:1.55rem 1.7rem; + padding:2rem 2.2rem; background:linear-gradient(to bottom,var(--panel),var(--panel-dark)); border:1px solid var(--line); border-radius:var(--radius); @@ -357,21 +359,23 @@ h3{ } .card p{ - margin-bottom:.65rem; + margin-bottom:.75rem; color:#f3f4f6; + font-size:1.05rem; line-height:1.85; } .card p:last-child{margin-bottom:0} ul{ - margin:.6rem 0 0; - padding-left:1.1rem; + margin:.7rem 0 0; + padding-left:1.2rem; color:#e5e7eb; + font-size:1.05rem; line-height:1.85; } -li{margin:.25rem 0} +li{margin:.3rem 0} .plain-list{ list-style:none; @@ -437,11 +441,11 @@ li{margin:.25rem 0} .contact-list a:hover{text-decoration:underline} .site-footer{ - margin-top:2rem; - padding:2rem 7vw; + margin-top:2.5rem; + padding:2.2rem 5vw; border-top:1px solid #111827; color:var(--muted); - font-size:.82rem; + font-size:.9rem; } .footer-inner{ @@ -470,13 +474,13 @@ li{margin:.25rem 0} text-decoration:underline; } -@media (min-width:760px){ +@media (min-width:960px){ .grid-2{grid-template-columns:1.1fr 1fr} .grid-3{grid-template-columns:repeat(3,1fr)} .split{grid-template-columns:1fr 1fr} } -@media (max-width:760px){ +@media (max-width:960px){ .site-header{ align-items:flex-start; flex-direction:column; @@ -508,13 +512,13 @@ li{margin:.25rem 0} } .hero{ - padding-top:2.6rem; - padding-bottom:1.9rem; + padding-top:3rem; + padding-bottom:2.2rem; } .hero.compact{ - padding-top:2.5rem; - padding-bottom:1.8rem; + padding-top:2.8rem; + padding-bottom:2rem; } .hero::before{ @@ -524,11 +528,11 @@ li{margin:.25rem 0} } .card{ - padding:1.25rem; + padding:1.4rem 1.5rem; } h1{ - font-size:2rem; + font-size:2.2rem; } .brand{ diff --git a/software.html b/software.html index c81d695..b5a8aca 100644 --- a/software.html +++ b/software.html @@ -50,12 +50,36 @@

Practical software for event engineers and production teams.

Software at Event Tech Research is built around real show workflows: clear control, useful monitoring, - fast troubleshooting, and documentation that stays connected to the system it describes. + fast troubleshooting, field networking, and documentation that stays connected to the system it describes.

Featured software

+ +
+

MYLan

+

+ MYLan is a portable DHCP server and field network utility built for temporary event, audio, and + production networks. It is designed to help engineers quickly deploy a simple DHCP service from a + laptop when devices need reliable automatic IP addressing on site. +

+

+ The interactive DHCP guide explains the DORA handshake, packet structure, lease handling, DHCP + options, and practical troubleshooting using MYLan as the example field tool. +

+ + +

Field utility / public software resource

+
+

ETR-NodeScope