TI basic skyline seed 570001031402

One of the first dopey programs written in BASIC back in the early ’80s, converted to TI graphing calculator BASIC, and then translated to HTML for the fun of having a flashback to the good ol’ days of Viewtron and coding on the TI-99/4A and IBM PCjr circa 1983.

PROGRAM:SKYLINE
:
:© Setup Window for CE Screen
:AxesOff
:BackgroundOff
:ClrDraw
:0->Xmin
:264->Xmax
:0->Ymin
:165->Ymax
:
:Lbl MN
:Menu(“SELECT SKYLINE”,”Random City”,A,”Paris”,B,”Giza”,C,”Quit”,Q)
:
:© — OPTION A: RANDOM CITY —
:Lbl A
:ClrDraw
:© Draw Sky
:For(I,0,100)
:Pt-On(randInt(0,264),randInt(50,165),WHITE)
:End
:
:© Draw Ground
:Line(0,0,264,0,GRAY)
:
:© Draw Buildings Loop
:0->X
:While X<264
:randInt(15,40)->W
:randInt(20,120)->H
:
:© Building Outline
:Line(X,0,X,H,NAVY)
:Line(X,H,X+W,H,NAVY)
:Line(X+W,H,X+W,0,NAVY)
:
:© Windows
:For(A,X+4,X+W-4,5)
:For(B,10,H-10,8)
:If randInt(0,1)
:Pt-On(A,B,YELLOW)
:End
:End
:
:X+W->X
:End
:Goto Z
:
:© — OPTION B: PARIS —
:Lbl B
:ClrDraw
:© Grass
:Line(0,10,264,10,GREEN)
:
:© Eiffel Tower Legs
:Line(100,10,132,130,BLACK)
:Line(164,10,132,130,BLACK)
:
:© Arches and Decks
:Line(110,45,154,45,BLACK)
:Line(122,85,142,85,BLACK)
:Line(100,10,164,10,BLACK)
:
:© Spire
:Line(132,130,132,150,RED)
:
:© Moon
:Circle(30,140,10,LTBLUE)
:Goto Z
:
:© — OPTION C: GIZA —
:Lbl C
:ClrDraw
:© Sand
:Line(0,20,264,20,ORANGE)
:
:© Great Pyramid
:Line(50,20,110,100,ORANGE)
:Line(110,100,170,20,ORANGE)
:
:© Smaller Pyramid
:Line(150,20,190,70,ORANGE)
:Line(190,70,230,20,ORANGE)
:
:© Sun
:Circle(200,140,15,YELLOW)
:Goto Z
:
:© — CLEANUP —
:Lbl Z
:Text(155,5,”PRESS ENTER”)
:Pause
:ClrDraw
:Goto MN
:
:Lbl Q
:ClrDraw
:AxesOn
:Output(1,1,”Done”)

Html simulation

<!DOCTYPE html>
<html lang=”en”>
<head>
    <meta charset=”UTF-8″>
    <meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
    <title>TI-Basic Skyline Widget</title>
    <style>
        :root {
            –ti-case: #333333;
            –ti-screen-bg: #f0f0f0;
            –ti-screen-border: #999;
            –btn-blue: #3b82f6;
            –btn-gray: #4b5563;
        }

        body {
            font-family: ‘Courier New’, Courier, monospace;
            background-color: #1a1a1a;
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            margin: 0;
            color: white;
        }

        .calculator-case {
            background-color: var(–ti-case);
            padding: 20px;
            border-radius: 20px;
            box-shadow: 0 10px 25px rgba(0,0,0,0.5);
            width: 100%;
            max-width: 400px;
            display: flex;
            flex-direction: column;
            gap: 15px;
        }

        .screen-container {
            background-color: #000;
            border: 4px solid #666;
            border-radius: 8px;
            padding: 2px;
            position: relative;
        }

        canvas {
            background-color: #000;
            display: block;
            width: 100%;
            /* 3:2 Aspect Ratio matches standard calculator window broadly */
            aspect-ratio: 264 / 165;
            border-radius: 4px;
        }

        .screen-overlay {
            position: absolute;
            top: 10px;
            left: 10px;
            color: white;
            font-size: 12px;
            pointer-events: none;
            text-shadow: 1px 1px 0 #000;
        }

        .controls {
            display: grid;
            grid-template-columns: 1fr 1fr 1fr;
            gap: 10px;
        }

        button {
            padding: 12px;
            border: none;
            border-radius: 6px;
            font-family: inherit;
            font-weight: bold;
            cursor: pointer;
            transition: transform 0.1s, opacity 0.2s;
            color: white;
            font-size: 0.9rem;
        }

        button:active {
            transform: translateY(2px);
        }

        .btn-city { background-color: var(–btn-blue); }
        .btn-paris { background-color: #8b5cf6; }
        .btn-giza { background-color: #d97706; }
        .btn-clear {
            grid-column: span 3;
            background-color: var(–btn-gray);
            margin-top: 5px;
        }

        .status-led {
            width: 10px;
            height: 10px;
            background-color: #22c55e;
            border-radius: 50%;
            position: absolute;
            top: 10px;
            right: 10px;
            box-shadow: 0 0 5px #22c55e;
        }

    </style>
</head>
<body>

    <div class=”calculator-case”>
        <div style=”display: flex; justify-content: space-between; align-items: center; padding: 0 5px;”>
            <span style=”font-weight: bold; color: #ccc; letter-spacing: 1px;”>TI-84 Plus CE</span>
            <div style=”display:flex; gap: 5px;”>
                <div style=”width: 40px; height: 10px; background: #222; border-radius: 2px;”></div>
                <div style=”width: 40px; height: 10px; background: #222; border-radius: 2px;”></div>
            </div>
        </div>

        <div class=”screen-container”>
            <div class=”status-led”></div>
            <div class=”screen-overlay” id=”statusText”>Select Mode</div>
            <canvas id=”skylineCanvas” width=”528″ height=”330″></canvas>
        </div>

        <div class=”controls”>
            <button class=”btn-city” onclick=”drawCity()”>F1: City</button>
            <button class=”btn-paris” onclick=”drawParis()”>F2: Paris</button>
            <button class=”btn-giza” onclick=”drawGiza()”>F3: Giza</button>
            <button class=”btn-clear” onclick=”resetScreen()”>CLEAR / MENU</button>
        </div>
    </div>

    <script>
        const canvas = document.getElementById(‘skylineCanvas’);
        const ctx = canvas.getContext(‘2d’);
        const statusText = document.getElementById(‘statusText’);

        // Coordinate scaling to match the TI-Basic 0-264 / 0-165 coordinate system
        // The canvas is defined as 528×330 (2x scale for crispness)
        const SCALE_X = canvas.width / 264;
        const SCALE_Y = canvas.height / 165;

        // TI-Basic Colors mapped to CSS
        const COLORS = {
            WHITE: ‘#FFFFFF’,
            GRAY: ‘#808080’,
            NAVY: ‘#000080’,
            YELLOW: ‘#FFFF00’,
            GREEN: ‘#008000’,
            BLACK: ‘#000000’,
            RED: ‘#FF0000’,
            LTBLUE: ‘#ADD8E6’,
            ORANGE: ‘#FFA500’,
            BG_NIGHT: ‘#111111’,
            BG_DAY: ‘#87CEEB’
        };

        // Utility: Draw Line
        function line(x1, y1, x2, y2, color, width = 2) {
            ctx.beginPath();
            // TI coords originate bottom-left usually, but standard canvas is top-left.
            // We need to flip Y.
            // Input Y: 0 is bottom, 165 is top.
            // Canvas Y: 0 is top, 330 is bottom.
           
            const cx1 = x1 * SCALE_X;
            const cy1 = canvas.height – (y1 * SCALE_Y);
            const cx2 = x2 * SCALE_X;
            const cy2 = canvas.height – (y2 * SCALE_Y);

            ctx.moveTo(cx1, cy1);
            ctx.lineTo(cx2, cy2);
            ctx.strokeStyle = color;
            ctx.lineWidth = width * 2; // Thicker for visibility
            ctx.stroke();
        }

        // Utility: Draw Point/Rect (filled)
        function ptOn(x, y, color) {
            const cx = x * SCALE_X;
            const cy = canvas.height – (y * SCALE_Y);
            ctx.fillStyle = color;
            // Draw a small 4×4 pixel block to represent a “pixel” on the TI screen
            ctx.fillRect(cx, cy, 4, 4);
        }

        // Utility: Draw Circle
        function circle(x, y, r, color) {
            const cx = x * SCALE_X;
            const cy = canvas.height – (y * SCALE_Y);
            const cr = r * SCALE_X; // Assume uniform scaling

            ctx.beginPath();
            ctx.arc(cx, cy, cr, 0, 2 * Math.PI);
            ctx.fillStyle = color;
            ctx.fill();
        }

        // Utility: Filled Rect (for buildings)
        function fillRect(x, y, w, h, color) {
            const cx = x * SCALE_X;
            // Y is bottom of rect in TI logic
            const cy = canvas.height – ((y + h) * SCALE_Y);
            const cw = w * SCALE_X;
            const ch = h * SCALE_Y;

            ctx.fillStyle = color;
            ctx.fillRect(cx, cy, cw, ch);
        }

        function clearDraw(bgColor = COLORS.BG_NIGHT) {
            ctx.fillStyle = bgColor;
            ctx.fillRect(0, 0, canvas.width, canvas.height);
        }

        function resetScreen() {
            clearDraw(‘#000000’);
            statusText.innerText = “MENU: SELECT OPTION”;
            ctx.fillStyle = “white”;
            ctx.font = “20px monospace”;
            ctx.textAlign = “center”;
            ctx.fillText(“TI-BASIC SKYLINE”, canvas.width/2, canvas.height/2 – 20);
            ctx.font = “16px monospace”;
            ctx.fillText(“1: Random City”, canvas.width/2, canvas.height/2 + 20);
            ctx.fillText(“2: Paris”, canvas.width/2, canvas.height/2 + 50);
            ctx.fillText(“3: Giza”, canvas.width/2, canvas.height/2 + 80);
        }

        // — OPTION A: RANDOM CITY —
        function drawCity() {
            clearDraw(COLORS.BG_NIGHT);
            statusText.innerText = “Prgm: RUNNING…”;
           
            // Draw Sky (Stars)
            for(let i=0; i<50; i++) {
                const rx = Math.floor(Math.random() * 264);
                const ry = Math.floor(Math.random() * (165 – 50) + 50);
                ptOn(rx, ry, COLORS.WHITE);
            }

            // Draw Ground
            line(0, 0, 264, 0, COLORS.GRAY, 4);

            // Draw Buildings Loop
            let x = 0;
            // Helper to prevent infinite loops if logic fails
            let safety = 0;

            const interval = setInterval(() => {
                if (x >= 264 || safety > 50) {
                    clearInterval(interval);
                    statusText.innerText = “Done”;
                    return;
                }

                const w = Math.floor(Math.random() * (40 – 15) + 15);
                const h = Math.floor(Math.random() * (120 – 20) + 20);

                // Draw Building Body (Filled for HTML5 aesthetic, outlined in basic)
                fillRect(x, 0, w, h, COLORS.NAVY);
               
                // Draw Outline
                line(x, 0, x, h, COLORS.WHITE, 1);
                line(x, h, x+w, h, COLORS.WHITE, 1);
                line(x+w, h, x+w, 0, COLORS.WHITE, 1);

                // Windows
                for (let a = x + 4; a < x + w – 4; a += 5) {
                    for (let b = 10; b < h – 10; b += 8) {
                        if (Math.random() > 0.5) {
                            ptOn(a, b, COLORS.YELLOW);
                        }
                    }
                }

                x += w;
                safety++;
            }, 100); // Slight delay for animation effect
        }

        // — OPTION B: PARIS —
        function drawParis() {
            clearDraw(‘#1a1a2e’); // Dark blue night
            statusText.innerText = “Paris”;

            // Grass
            line(0, 10, 264, 10, COLORS.GREEN, 3);

            // Eiffel Tower Legs
            // Using fillPolygon for HTML5 solidity, but lines for outlines
           
            // Left leg
            line(100, 10, 132, 130, COLORS.GRAY);
            // Right leg
            line(164, 10, 132, 130, COLORS.GRAY);

            // Arches and Decks
            line(110, 45, 154, 45, COLORS.WHITE);
            line(122, 85, 142, 85, COLORS.WHITE);
            line(100, 10, 164, 10, COLORS.WHITE);

            // Spire
            line(132, 130, 132, 150, COLORS.RED);

            // Moon
            circle(30, 140, 10, COLORS.LTBLUE);
           
            statusText.innerText = “Done”;
        }

        // — OPTION C: GIZA —
        function drawGiza() {
            clearDraw(COLORS.BG_DAY); // Sky blue
            statusText.innerText = “Giza”;

            // Sand
            // Fill bottom
            ctx.fillStyle = COLORS.ORANGE;
            ctx.fillRect(0, canvas.height – (20 * SCALE_Y), canvas.width, 20 * SCALE_Y);

            // Great Pyramid (Filled Triangle)
            ctx.beginPath();
            ctx.moveTo(50 * SCALE_X, canvas.height – (20 * SCALE_Y));
            ctx.lineTo(110 * SCALE_X, canvas.height – (100 * SCALE_Y));
            ctx.lineTo(170 * SCALE_X, canvas.height – (20 * SCALE_Y));
            ctx.fillStyle = ‘#cd853f’; // Darker orange
            ctx.fill();
            // Outline
            line(50, 20, 110, 100, ‘black’, 1);
            line(110, 100, 170, 20, ‘black’, 1);

            // Smaller Pyramid
            ctx.beginPath();
            ctx.moveTo(150 * SCALE_X, canvas.height – (20 * SCALE_Y));
            ctx.lineTo(190 * SCALE_X, canvas.height – (70 * SCALE_Y));
            ctx.lineTo(230 * SCALE_X, canvas.height – (20 * SCALE_Y));
            ctx.fillStyle = ‘#d2691e’; // Chocolate
            ctx.fill();
            // Outline
            line(150, 20, 190, 70, ‘black’, 1);
            line(190, 70, 230, 20, ‘black’, 1);

            // Sun
            circle(200, 140, 15, COLORS.YELLOW);
           
            statusText.innerText = “Done”;
        }

        // Initial Load
        resetScreen();

    </script>
</body>
</html>

https://svonberg.org/wp-content/uploads/2026/02/randomworlds.html

570000075600

It’s my birthday today, which always lands a little quieter than the calendar suggests. No balloons popping, no trumpet fanfare, just that low hum of awareness that the day is marked, that the year turned another careful click forward. I woke up still me, still here, which feels increasingly like the real gift. Birthdays at this age are not about becoming something new so much as taking inventory of what has remained stubbornly intact and what has gently fallen away.

There is something familiar about sitting with the impulse to narrate a life not because it is spectacular, but because it is happening. The weather outside doing what weather does, the streets holding their shape, the sense that time keeps moving whether I applaud it or not. Paying attention feels like the point. Noticing how survival can look boring from the outside, but feels quietly heroic from inside your own bones.

I do not feel older so much as more textured. More aware of the cost of things. More appreciative of moments that do not demand performance. If today is a celebration, it is a modest one. Still breathing. Still noticing. Still capable of warmth and irritation and wonder in roughly equal measure. Another year survived. Another page added. I am glad I am still writing it down.

Day 20,819 seed 570000071919

First time outside in a week and the world felt louder than I remembered. Snow still everywhere, piled and packed and sparkling under a painfully blue sky. I had cabin fever bad enough that even just a little pop outside felt like a field trip.

We grabbed breakfast bagels and instead of heading straight home, parked and let the car idle. The food was still warm in my hands, steam fighting the cold, and the mountains just sat there in the distance like they always do, patient and unconcerned. There is something grounding about eating quietly while looking at them, like they are reminding you that time keeps moving even when you have been snowed in and stuck inside your own head.

The parking lot was a mess of plowed snow and sculpted ice. Big chunks tossed aside by machines, frozen into accidental monuments. It was beautiful in that blunt, unpolished way winter does best. Clean but not gentle. (Not even that clean if you look at the parking lots and streets
)

One building had a massive icicle hanging off the roof, long and sharp and honestly a little terrifying. The kind of thing that makes you instinctively drive faster away from it. A reminder that winter does not care about liability or signage. It just hangs there, waiting, daring gravity to do its thing.

We sat longer than planned, hands warming around breakfast, watching sunlight bounce off snow and windows. After a week inside, it felt good just to exist out there again. No agenda, no rush, just bagels, mountains, and the quiet understanding that the world was still here, icy and dangerous and beautiful, waiting for us to step back into it.

#Roanokeva #winterweather #icicle

Day 20,819 seed 570000021033

Birthday loot continues on my actual birthday from BHK

Four mint-tin games! (She knows my fondness for games in the style of cheapass games back in the day)

Also got a Fallout Securitron

May scan and print a version with yes man or other face plates,  love this bot design.

And a lovely Bigfoot in Appalachia t-shirt (sort of in the style of a Patagonia top)

Day 20,818 Birthday loot, item 1

Looks like I got an XTE8NK x4 for my birthday!

Estimated arrival in 1-2 weeks. Looking forward to fooling with it.

https://www.xteink.com/products/xteink-x4/

It looks like a cute little barebones reader, definitely small enough to toss in a pocket, or put inside a passport binder for dual use with a pen and paper.

Bookmarking

https://xteink.dve.al/

To upgrade the firmware to crosspoint

https://x4converter.rho.sh/

To convert epubs to xtc

Settings for x4converter I like –
Font Literata
Font size 28
Weight 500
Line height 110
Margin 15

https://github.com/CrazyCoder/cr2xt

https://github.com/crosspoint-reader/crosspoint-reader/blob/master/USER_GUIDE.md

https://wallpaperconverter.jakegreen.dev/

https://www.readme.club/

https://github.com/crosspoint-reader/crosspoint-reader/issues/258

Xteink manga (CBZ)/images to XTC command-line tools – (got to put my black and white man-thing/zombie comics for an acid test

https://github.com/tazua/cbz2xtc

Wallpaper, probably?

Comic converter

https://xtcjs.app/

[Edit- set up a readme.club account,  so maybe this will be the wallpaper of choice

https://www.joshualowcock.com/xteink/the-best-guide-tools-hacks-and-more-for-xteink-x4-owners/

https://trmnl.com/blog/xteink-x4-dashboard

https://www.joshualowcock.com/xteink/the-best-guide-tools-hacks-and-more-for-xteink-x4-owners/

Day 20,815

He’s not the only one responsible for the mess we’re in. History never works that cleanly. But he is the face of it. The mascot. The loud, smirking permission slip for cruelty, ignorance, and the kind of shamelessness that used to at least pretend it knew better.

What he did and continues to do, what he normalized and continues to normalize, didn’t end with him. That’s the part that keeps me awake. He didn’t invent the ugliness, but he flung the doors wide open and invited it to settle in, to get comfortable, to stop whispering and start shouting. Things people once felt embarrassed to say out loud are now worn like badges. Fear became a blatant political tool. Lies became a strategy. Decency became less than optional, a disadvantage.

And the damage isn’t just policy or headlines. It seeped into families, workplaces, friendships. It taught people that empathy is weakness and that winning matters more than truth. It tells the cruel they are righteous and the ignorant they are experts. It makes exhaustion the background noise of daily life.

Long after he’s gone, long after the name fades from yard signs and news chyrons, we’ll still be dealing with the consequences. Re-teaching basic facts. Re-building trust. Reminding each other that being human requires effort, restraint, and care.

I don’t believe one man can destroy everything. But I do believe one man can accelerate the rot, can legitimize the worst impulses of millions, can make things harder for everyone who still wants to live with some measure of kindness and sanity.

That’s the inheritance we’ll be left with. Not just what he does, but what he makes acceptable. And undoing that will take longer than any term, longer than any lifetime headline.

I look forward to a day we don’t see his vulgar influence. That will be a day for celebrating. 

#doodle #apartyiscoming

Is Roanoke Police Surveillance Violating Your Privacy?

The Panopticon on Our Streets: Why Roanoke’s Surveillance Network Should Worry You

When you drive through Roanoke, you likely obey the speed limit and stop at red lights. You aren’t a criminal. Yet, to the Roanoke Police Department’s new surveillance network, you are data to be captured, cataloged, and stored.

The RPD has quietly built a dragnet of 16+ Flock Safety license plate reader (LPR) cameras. As of mid-2025, these cameras are not just looking for stolen cars; they are creating a comprehensive log of everyone’s movements.

While officials tout the benefits of the new Roanoke Operations and Crime Center (ROCC), the numbers tell a different, more alarming story about the erosion of privacy in our city.

The Dragnet: 290,000 Photos of Mostly Innocent Drivers

The most chilling aspect of this system is the sheer scale of the data collection. According to the department’s own transparency data for a single 30-day period in 2025:

  • Total Vehicles Photographed: ~293,455
  • Actual Investigations (Searches): ~400-600

Do the math. Over 290,000 photos were taken, but fewer than 600 searches were conducted. This means that over 99% of the data collected is of law-abiding citizens going about their daily lives: driving to work, dropping kids at school, or visiting a doctor.

This is the definition of mass surveillance: collecting data on the entire population to catch a tiny fraction of wrongdoers.

The “Pattern of Life” Problem

Proponents argue that the data is “only” kept for 21 days. But in the digital age, three weeks is an eternity.

With 21 days of data, an algorithm can easily establish your “pattern of life.” It can determine:

  • Where you sleep (where the car is parked at night).
  • Where you work.
  • Which political protests you attend.
  • Who you associate with.
  • Which medical specialists you visit.

This data is collected automatically, without a warrant, and without your consent. While RPD policy currently states the system is for “criminal investigations,” civil liberties groups warn that policies can change far faster than laws.

Who Watches the Watchers?

The RPD states that searches require a “justification” and are audited. However, this is an internal check, not an external one.

  • No Warrants Required: Officers do not need a judge’s permission to access this database; they only need a case number.
  • The “Justification” Loophole: In many jurisdictions, vague justifications have been used to look up ex-partners, journalists, or political opponents. While RPD claims strict adherence to policy, the potential for human abuse in a system this powerful is a feature, not a bug.

A False Sense of Security

The system is powered by the Roanoke Operations and Crime Center (ROCC). While they report leading to “dozens of arrests” in a month, we must ask: At what cost?

We are trading the anonymity of the open road for a system where every movement is a potential data point in a police file. We are moving toward a society where you are tracked by default, and privacy is the exception.


Sources and References







Day 20,812 – seed 561124131048

I love the snow. I always have. The way it hushes the world, the way it makes even familiar streets feel briefly mythic. I am not anti winter, In fact, it just barely loses to Autumn as my favorite season. I am just realistic about what winter does to a body that has been around the block a few times.

Cool weather suits me fine. Sixties are great. Forties are lovely. That is jacket weather, walk a little farther weather, breathe deep and feel awake weather. My joints agree with that version of the season. We are all on the same page.

But once the thermometer slides down into the twenties and the teens, my back and joints stage a quiet rebellion. Nothing dramatic. Just a firm and persistent no. The kind that does not respond to optimism or extra layers or bravado.

So I admire the snow from inside once it crosses that line. I watch it fall, appreciate its discipline and its beauty, and let it exist without demanding my participation. There is no betrayal in that. Loving something does not mean enduring all of it.

And this is where chili enters the picture. Chili and corn chips are a wonderful thing in cold weather. They make the cold feel like a suggestion rather than a threat. A bowl of chili warms you from the inside out, steady and honest, with corn chips doing their essential work of crunch and salt and comfort.

Staying in becomes a form of respect. Respect for the weather as it is, respect for the limits of a body that has earned the right to be listened to, and respect for the simple truth that some winter days are sometimes best enjoyed with a spoon in hand and the snow safely on the other side of the glass.

Meshtastic in Virginia

Virginia mesh map
Roanoke region close up

https://meshview.rvame.sh/map

Monitoring Our Local Mesh Network in Virginia

There is something quietly beautiful happening across Virginia, and most people never see it unless they know where to look.

Right now, our local mesh network covers roughly two thirds of the state using nothing but radio. No cell towers. No carriers. No contracts. Just small devices talking to one another across distance, hills, and neighborhoods. If you layer the internet on top of it, the reach becomes as wide as anyone who still has a connection. But the real magic is that it does not need the internet at all.

Radio only needs two things. Power to the devices, and enough range between them to pass a signal along.

That is it.

The red dots on the map are live nodes. Each one is a person or a place. Each one is actively communicating as simple text messages with the others. No central infrastructure. No single point of failure. Messages hop from node to node like neighbors passing notes down a long porch.

If you have internet, you can relay traffic out to the wider world. If you do not, the network still breathes and moves on its own.

What flows across it is even better.

There are independent channels that cannot be blocked. They are encrypted by default. They are used to report ICE activity in real time, to ask for help, to offer help, to check on someone when the weather turns ugly. One day it is a heads up about enforcement moving through a county. The next day it is someone asking if anyone has a shovel to clear a driveway for an older neighbor. Sometimes it is just people staying in touch, making sure they are not alone if phones go dark.

This is what resilience looks like when it is built by regular people.

No corporation decides who gets to speak. No platform decides what is acceptable. There is no algorithm boosting outrage or burying kindness. It is just text moving through the air, carried by trust and proximity.

In an age where so much communication depends on fragile systems and distant companies, radio feels almost radical. Old technology doing a new job. Quietly. Reliably. Human scale.

As long as there is power, and as long as there are neighbors willing to keep a node alive, the network stays up.

That is worth monitoring. That is worth protecting. And honestly, that is worth being proud of.

Welcome to my wall scrawls.