How many times has he been rightfully called a pig?

Bubba’s eye view?

Answer: every time

‘Quiet, piggy’: Trump responds to reporter after Epstein question

When speaking to reporters on board Air Force One on 14 November, President Donald Trump was asked about recently released emails from Jeffrey Epstein which mentioned him.

Trump said he knew nothing about that and said the focus should be on other people named in those emails, including former President Bill Clinton.

After a journalist from Bloomberg News tried to ask a follow-up question on Epstein, the president turned to her and said: “Quiet. Quiet, piggy.”

The exchange occurred as calls grew for the US Department of Justice to release files related to its investigation into Epstein, the late financier and convicted sex offender who died in prison in 2019.

On Sunday, President Trump reversed his position and called for Republicans to vote for a bill that forces the Justice Department to release all of its files related to the Epstein case.

#doodle #politics #piggy #ochrejelly

Testing die roll html

https://svonberg.org/wp-content/uploads/2025/11/Dicehtm.html

https://svonberg.org/wp-content/uploads/2025/11/Dicehtm.html

Code

<!DOCTYPE html>
<html lang=”en”>
<head>
    <meta charset=”UTF-8″>
    <meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
    <title>Appalachian Dice Roller</title>
    <script src=”https://cdn.tailwindcss.com”></script>
    <link href=”https://fonts.googleapis.com/css2?family=Merriweather:wght@700&family=Open+Sans:wght@400;600&display=swap” rel=”stylesheet”>
    <style>
        body {
            margin: 0;
            overflow: hidden;
            font-family: ‘Open Sans’, sans-serif;
            color: #d8dee9;
            background: linear-gradient(to bottom, #4a6c8a, #78909c, #a7b7be);
            background-image: url(‘https://image.pollinations.ai/prompt/Blue%20Ridge%20Mountains%20at%20dawn,%20misty%20valleys,%20river,%20pine%20trees,%20photorealistic,%20cinematic%20lighting’);
            background-size: cover;
            background-position: center;
        }
        #canvas-container {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: 1;
            background-color: rgba(0, 0, 0, 0.3);
        }
        #ui-container {
            position: relative;
            z-index: 10;
            pointer-events: none;
            text-shadow: 1px 1px 3px rgba(0,0,0,0.5);
        }
        .interactive { pointer-events: auto; }
       
        h1, h2 { font-family: ‘Merriweather’, serif; }

        /* Custom Styles for Appalachian feel */
        .wood-panel {
            background-color: rgba(30, 40, 50, 0.85);
            border: 1px solid #4a6c8a;
            box-shadow: 0 4px 6px rgba(0,0,0,0.3), inset 0 0 8px rgba(74, 108, 138, 0.4);
        }
        .stone-input {
            background-color: rgba(20, 30, 40, 0.9);
            border: 1px solid #5a7d9b;
            color: #e0f2f1;
            text-shadow: 1px 1px 2px rgba(0,0,0,0.7);
        }
        .stone-button {
            background-color: #3b5a6d;
            border: 1px solid #6f8fa3;
            color: #ffffff;
            font-family: ‘Merriweather’, serif;
            text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
            box-shadow: 0 2px 4px rgba(0,0,0,0.3), inset 0 1px 2px rgba(255,255,255,0.1);
            transition: all 0.2s ease-in-out;
            display: flex;
            align-items: center;
            justify-content: center;
            text-align: center;
            line-height: 1.1;
        }
        .stone-button:hover {
            background-color: #4a6c8a;
            border-color: #8bb1c7;
            box-shadow: 0 3px 5px rgba(0,0,0,0.4), inset 0 1px 3px rgba(255,255,255,0.15);
            transform: translateY(-1px);
        }
        .stone-button:active {
            transform: translateY(0);
            box-shadow: 0 1px 2px rgba(0,0,0,0.2), inset 0 0 5px rgba(0,0,0,0.3);
        }

        /* Animations */
        @keyframes pulse-crit {
            0% { text-shadow: 0 0 8px #ffd700; transform: scale(1); color: #ffd700; }
            50% { text-shadow: 0 0 15px #ffd700, 0 0 30px #e74c3c; transform: scale(1.1); color: #ffd700; }
            100% { text-shadow: 0 0 8px #ffd700; transform: scale(1); color: #ffd700; }
        }
        .crit-anim { animation: pulse-crit 0.5s ease-in-out infinite; }
       
        @keyframes pulse-fail {
            0% { text-shadow: 0 0 5px #c0392b; color: #c0392b; }
            50% { text-shadow: 0 0 15px #c0392b; color: #c0392b; }
            100% { text-shadow: 0 0 5px #c0392b; color: #c0392b; }
        }
        .fail-anim { animation: pulse-fail 1s ease-in-out infinite; }

        .result-text {
            color: #d8dee9;
            text-shadow: 1px 1px 5px rgba(0,0,0,0.6);
        }
    </style>
</head>
<body class=”h-screen w-screen flex flex-col”>

    <div id=”canvas-container”></div>

    <div id=”ui-container” class=”h-full w-full flex flex-col justify-between p-4 sm:p-6″>
       
        <!– Header –>
        <div class=”w-full flex justify-between items-start”>
            <div>
                <h1 class=”text-2xl sm:text-3xl font-bold text-teal-200 tracking-wide”>MOUNTAIN <span class=”text-gray-400″>ROLL</span></h1>
                <p class=”text-xs sm:text-sm text-blue-300 mt-1″>ANCIENT STONES // ACTIVE</p>
            </div>
        </div>

        <!– Result Display –>
        <div class=”absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 text-center w-full pointer-events-none”>
            <div id=”result-label” class=”text-sm sm:text-lg text-blue-200 tracking-wider mb-2 sm:mb-3 opacity-0 transition-opacity duration-300″>TOTAL SUM</div>
            <div id=”result-display” class=”text-6xl sm:text-8xl font-bold result-text opacity-0 transition-all duration-200″>–</div>
            <div id=”result-breakdown” class=”text-base sm:text-xl text-green-300 mt-2 sm:mt-3 opacity-0 tracking-wider font-semibold”></div>
        </div>

        <!– Controls –>
        <div class=”w-full max-w-lg mx-auto p-3 sm:p-4 rounded-lg wood-panel interactive”>
            <div class=”flex flex-col gap-3 sm:gap-4″>
               
                <!– Input Row –>
                <div class=”flex items-end justify-between gap-2 sm:gap-4″>
                    <div class=”w-1/5 sm:w-1/4″>
                        <label class=”block text-[10px] sm:text-xs text-blue-300 mb-1 uppercase tracking-wider text-center”>Count</label>
                        <input type=”number” id=”count-input” value=”3″ min=”1″ max=”25″
                            class=”w-full p-2 rounded text-center text-lg sm:text-xl focus:outline-none stone-input”>
                    </div>
                    <div class=”text-blue-300 pb-2 sm:pb-3 font-bold text-xl sm:text-2xl”>X</div>
                    <div class=”w-1/5 sm:w-1/4″>
                        <label class=”block text-[10px] sm:text-xs text-blue-300 mb-1 uppercase tracking-wider text-center”>Faces</label>
                        <input type=”number” id=”faces-input” value=”6″ min=”2″ max=”100″
                            class=”w-full p-2 rounded text-center text-lg sm:text-xl focus:outline-none stone-input”>
                    </div>
                    <div class=”flex-1 min-w-0″> <!– min-w-0 prevents flex item from overflowing –>
                        <label class=”block text-[10px] sm:text-xs text-blue-300 mb-1 uppercase tracking-wider text-center”>Action</label>
                        <button id=”roll-btn”
                            class=”w-full py-2 px-1 sm:px-4 rounded stone-button uppercase h-[44px] sm:h-[46px] text-xs sm:text-sm font-bold tracking-wide whitespace-nowrap overflow-hidden text-ellipsis”>
                            ROLL STONES
                        </button>
                    </div>
                </div>

                <!– Quick Presets –>
                <div class=”grid grid-cols-5 gap-2 mt-1″>
                    <button class=”preset-btn py-2 stone-button text-xs sm:text-sm w-full” data-count=”1″ data-faces=”20″>1d20</button>
                    <button class=”preset-btn py-2 stone-button text-xs sm:text-sm w-full” data-count=”2″ data-faces=”20″>2d20</button>
                    <button class=”preset-btn py-2 stone-button text-xs sm:text-sm w-full” data-count=”3″ data-faces=”6″>3d6</button>
                    <button class=”preset-btn py-2 stone-button text-xs sm:text-sm w-full” data-count=”4″ data-faces=”6″>4d6</button>
                    <button class=”preset-btn py-2 stone-button text-xs sm:text-sm w-full” data-count=”2″ data-faces=”8″>2d8</button>
                </div>
            </div>
        </div>
    </div>

    <!– Three.js –>
    <script src=”https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js”></script>

    <script>
        // — SCENE SETUP —
        const container = document.getElementById(‘canvas-container’);
        const scene = new THREE.Scene();
        scene.fog = new THREE.FogExp2(0x4a6c8a, 0.02);

        const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        camera.position.z = 10;

        const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
        container.appendChild(renderer.domElement);
        renderer.setClearColor(0x000000, 0);

        // — LIGHTING —
        const ambientLight = new THREE.AmbientLight(0x708090);
        scene.add(ambientLight);
       
        const lights = [];
        const lightColors = [0x8fbc8f, 0xb0e0e6, 0xd8bfd8];
       
        lightColors.forEach((col, i) => {
            const l = new THREE.PointLight(col, 0.6, 50);
            l.position.set(Math.sin(i*2) * 10, Math.cos(i*2) * 10, 10);
            scene.add(l);
            lights.push(l);
        });

        // — MATERIALS —
        const fillMaterial = new THREE.MeshLambertMaterial({
            color: 0x5e6e7b,
            reflectivity: 0.1,
            shininess: 10,
            polygonOffset: true,
            polygonOffsetFactor: 1,
            polygonOffsetUnits: 1
        });
       
        const wireMaterial = new THREE.LineBasicMaterial({
            color: 0x8fbc8f,
            transparent: true,
            opacity: 0.7
        });

        // — STATE VARIABLES —
        let diceObjects = [];
        const mainGroup = new THREE.Group();
        scene.add(mainGroup);

        const countInput = document.getElementById(‘count-input’);
        const facesInput = document.getElementById(‘faces-input’);
        const rollBtn = document.getElementById(‘roll-btn’);
        const resultDisplay = document.getElementById(‘result-display’);
        const resultLabel = document.getElementById(‘result-label’);
        const resultBreakdown = document.getElementById(‘result-breakdown’);
        const presetBtns = document.querySelectorAll(‘.preset-btn’);

        let isRolling = false;

        // — GEOMETRY GENERATOR —
        function getGeometry(faces) {
            faces = parseInt(faces);
            switch(faces) {
                case 4: return new THREE.TetrahedronGeometry(0.9);
                case 6: return new THREE.BoxGeometry(1.2, 1.2, 1.2);
                case 8: return new THREE.OctahedronGeometry(0.9);
                case 12: return new THREE.DodecahedronGeometry(0.9);
                case 20: return new THREE.IcosahedronGeometry(0.9);
                default: return new THREE.IcosahedronGeometry(0.9, 1);
            }
        }

        // — LAYOUT ENGINE —
        function updateScene() {
            while(mainGroup.children.length > 0){
                const child = mainGroup.children[0];
                if(child.geometry) child.geometry.dispose();
                mainGroup.remove(child);
            }
            diceObjects = [];

            const count = parseInt(countInput.value) || 1;
            const faces = parseInt(facesInput.value) || 6;
           
            const cols = Math.ceil(Math.sqrt(count));
            const rows = Math.ceil(count / cols);
            const spacing = 3.0;
           
            const startX = -((cols – 1) * spacing) / 2;
            const startY = ((rows – 1) * spacing) / 2;

            const maxDim = Math.max(cols, rows);
            const targetZ = 5 + (maxDim * 2.0);
            camera.position.z = targetZ;

            const geometry = getGeometry(faces);
            const edges = new THREE.EdgesGeometry(geometry);

            for(let i = 0; i < count; i++) {
                const col = i % cols;
                const row = Math.floor(i / cols);

                const mesh = new THREE.Mesh(geometry, fillMaterial);
                const wireframe = new THREE.LineSegments(edges, wireMaterial.clone());
               
                mesh.add(wireframe);

                mesh.position.x = startX + (col * spacing);
                mesh.position.y = startY – (row * spacing);
               
                diceObjects.push({
                    mesh: mesh,
                    wire: wireframe,
                    speed: { x: 0.002, y: 0.002 },
                    baseY: mesh.position.y
                });

                mainGroup.add(mesh);
            }
        }

        // — INPUT LISTENERS —
        function handleUpdate() {
            if(isRolling) return;
            let c = parseInt(countInput.value);
            if(c > 25) { c = 25; countInput.value = 25; }
            if(c < 1) { c = 1; countInput.value = 1; }
            let f = parseInt(facesInput.value);
            if(f < 2) { f = 2; facesInput.value = 2; }
            updateScene();
        }

        countInput.addEventListener(‘change’, handleUpdate);
        facesInput.addEventListener(‘change’, handleUpdate);

        presetBtns.forEach(btn => {
            btn.addEventListener(‘click’, () => {
                if(isRolling) return;
                countInput.value = btn.getAttribute(‘data-count’);
                facesInput.value = btn.getAttribute(‘data-faces’);
                updateScene();
            });
        });

        // — ROLL LOGIC —
        rollBtn.addEventListener(‘click’, () => {
            if(isRolling) return;
            isRolling = true;
           
            const count = parseInt(countInput.value);
            const faces = parseInt(facesInput.value);

            resultDisplay.style.opacity = 0;
            resultLabel.style.opacity = 0;
            resultBreakdown.style.opacity = 0;
            resultDisplay.className = “text-6xl sm:text-8xl font-bold result-text opacity-0 transition-all duration-200”;
           
            // Store original text but show calculating text
            const originalText = rollBtn.innerText;
            rollBtn.innerText = “DIVINING…”;
            rollBtn.classList.add(‘opacity-50’, ‘cursor-not-allowed’);

            diceObjects.forEach(obj => {
                obj.speed = {
                    x: (Math.random() – 0.5) * 1.5,
                    y: (Math.random() – 0.5) * 1.5
                };
            });

            const results = [];
            let total = 0;
            for(let i=0; i<count; i++) {
                const r = Math.floor(Math.random() * faces) + 1;
                results.push(r);
                total += r;
            }

            setTimeout(() => {
                showResult(total, results, faces);
            }, 1000);
        });

        function showResult(total, results, faces) {
            const decayInt = setInterval(() => {
                let allStopped = true;
                diceObjects.forEach(obj => {
                    obj.speed.x *= 0.8;
                    obj.speed.y *= 0.8;
                    if(Math.abs(obj.speed.x) > 0.005) allStopped = false;
                });

                if(allStopped) {
                    clearInterval(decayInt);
                    diceObjects.forEach(obj => obj.speed = { x: 0.002, y: 0.002 });
                    isRolling = false;
                    rollBtn.innerText = “ROLL STONES”;
                    rollBtn.classList.remove(‘opacity-50’, ‘cursor-not-allowed’);
                }
            }, 50);

            resultLabel.style.opacity = 1;
            resultDisplay.textContent = total;
            resultDisplay.style.opacity = 1;
            resultBreakdown.textContent = `[ ${results.join(‘, ‘)} ]`;
            resultBreakdown.style.opacity = 1;

            const maxPossible = results.length * faces;
            const minPossible = results.length;

            diceObjects.forEach(obj => obj.wire.material.color.setHex(0x8fbc8f));

            if(total === maxPossible) {
                resultDisplay.classList.add(‘crit-anim’);
                diceObjects.forEach(obj => obj.wire.material.color.setHex(0xffd700));
            } else if (total === minPossible) {
                resultDisplay.classList.add(‘fail-anim’);
                diceObjects.forEach(obj => obj.wire.material.color.setHex(0xc0392b));
            } else {
                resultDisplay.classList.add(‘result-text’);
            }
        }

        // — ANIMATION LOOP —
        const clock = new THREE.Clock();
       
        function animate() {
            requestAnimationFrame(animate);
            const time = clock.getElapsedTime();

            diceObjects.forEach((obj, index) => {
                obj.mesh.rotation.x += obj.speed.x;
                obj.mesh.rotation.y += obj.speed.y;

                if(!isRolling) {
                    obj.mesh.position.y = obj.baseY + Math.sin(time + index) * 0.08;
                }
               
                obj.wire.material.opacity = 0.6 + Math.sin(time * 1.5) * 0.2;
            });

            renderer.render(scene, camera);
        }

        updateScene();
        animate();

        window.addEventListener(‘resize’, () => {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
        });

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

Close calls

Upcoming close approaches (November 2025)


2025VC4: Approaches on November 18, 2025, at 00:07 UTC


2025VP1: Approaches on November 18, 2025, at 00:24 UTC.


3361 Orpheus: Approaches on November 19, 2025, at 01:26 UTC.


2025VO2: Approaches on November 19, 2025, at 06:20 UTC.


Upcoming major close approach


Asteroid Apophis: This large asteroid will pass about 20,000 miles (32,000 km) from Earth’s surface on April 13, 2029, which is closer than the orbit of many geostationary satellites. While this will be the closest known approach by a large asteroid, it is not expected to impact Earth.

Via https://neo.ssa.esa.int/close-approacheshttps://neo.ssa.esa.int/close-approaches

Day 20,743

Pearl “Helpin”

Started the morning with a gentle shuffle out the door to the Salem YMCA. The pool was quiet, the kind of soft blue that invites you in without a word. Drifted through a few laps, letting the water unkink the knots and smooth out the leftover sleep. Afterward, did a little time on the machines, enough to get the muscles humming and the blood warmed up. The sort of modest workout that feels like a small high five from the universe.

Came home to the comforting rhythm of chores. Laundry tumbling in the background like a polite storm. In the kitchen, I set up a mini burrito workshop, this one powered by farmers market bounty and a little kitchen alchemy. Spring mix for a bit of crunch and green life, cheese for comfort, and “meat” made with Impossible burger cooked up with black beans and corn. A dollop of sour cream, a drizzle of taco sauce, then rolled each one up into tidy parcels. A whole tray of them, each smelling like a promise.

The cat arrived right on cue, her expression a blend of entitlement and curiosity. To ease her very real fear of missing out, she received a single dignified fingerprint of sour cream. Peace restored.

Plenty of burrito fixings left for tomorrow’s dinner, which feels like a small gift sent forward in time. The house is quiet now, laundry done, kitchen warm, day stitched together with simple goodness.

Day 20,742

Woke up this morning to a dippy doodle that crawled out of the subconscious when  still half-caffeinated. A little forest spirit stepped onto the page, bold as you please. A walking log with one big watchful eye, twig antlers like radio towers picking up secret frequencies. He carries a staff topped with another eye, which seems a bit redundant, unless you’re the sort of being who requires multiple viewpoints at once. Understandable. Mondays are like that.

There’s something friendly about him though. A guardian more than a threat. The sort of creature who wanders the twilight edge between trail and dream, tapping the earth with his knotted staff, checking for… well, whatever treefolk check for. Maybe he’s listening for root gossip. Maybe he’s making sure no one’s stealing the forest’s socks.

I like the way the lines shimmer around the eyes, like little bursts of silent magic. You can almost hear the gaze. He feels like the patron saint of getting slightly lost on purpose. Of wandering down the wrong path just to see where it goes. A fellow wanderer of green corridors and mossy shortcuts.

If I see him next time on the Greenway or tucked beside a foggy ridge, I’ll nod politely. You never ignore someone with that many eyes, disembodiedor not. He’s doing important work. Plus, he looks like he gives good trail advice.

#sketchbook #forestguardian #wyrdwoodwalker #doodle #oddfriends

Day 20,741


Cold morning light filtering in through the blinds today, the kind that makes the house feel like a quiet aquarium. I stayed in for most of it, body reminding me in its own grumbly language to take things slow. Sciatica humming along the back of my leg like an old electric wire, a collection of assorted aches chiming in just to form a chorus. Not the worst day, but not one for wandering far, either. The universe sometimes taps you on the shoulder and says stay close to home, friend, and listen.

So I did. Put the kettle on, shuffled from room to room like a hermit crab deciding which shell felt right. Every tiny movement a negotiation with muscles that have strong opinions. The cat was pleased with this, taking my enforced stillness as an invitation to supervise from nearby cushions. A slow day is a lap day, in her view.

Outside, the wind rattled the last stubborn leaves still hanging on, the trees looking a little more winter-boned with each passing hour. Clouds moved like old ships across the sky, and I watched them through the window instead of being under them. There’s a comfort in that. Some days the world can be observed from behind glass.

I read a little. I napped a little. I stretched the sciatic nerve in careful truce-seeking motions. It didn’t stop complaining, but it calmed down enough to let me breathe more easily. Pain has a way of shrinking the map of your day, but it also sharpens your attention to the small good things. Warm blankets. Hot tea. A favorite song drifting through the room like slow fog.

Not every day needs to be an adventure. Some are quieter, gentler, lived in short steps and soft corners. Today was one of those, and somehow that feels okay.

Tags: #dailyobservations #sciatica #cozyhermitday #stayingin #smallcomforts

Day 20,740

A little colder now, and the trees know it

The air nipped at me this morning. Not a bite, just that small, curious tap on the shoulder that says, Here it comes. I stepped outside with my mug and watched a thin veil of breath drift ahead of me like a shy ghost. The neighborhood birds felt it too; their calls were brisk, no-nonsense, as if they had errands.

The trees have started their slow retreat into winter colors. Not the fireburst of peak autumn anymore, but the quieter palette. Russet edges. Cinnamon browns. Golds sinking into umber. Each leaf looks like it is storing some last secret of warmth before letting go. Even the evergreens seem to be standing straighter, bracing for the season shift.

Walking the greenway, I noticed how the sunlight comes in at a different angle now, brushing everything with a steeper, paler glow. The mountains around Roanoke seemed half-dreaming under it, wrapped in those soft grays and dusty blues that show up when the year is winding down. Any day now, the morning fog will start clinging to the ridges like a blanket that refuses to be folded.

There’s a comfort in this little chill. A reminder that the world is always turning the page, even when I’m moving slow. I like that feeling of putting hands in pockets, tugging the hoodie a little tighter, listening to the leaves skitter across the pavement like tiny travelers on their own migration.

Winter is close enough to smell on the wind. Not here yet, but leaning in. Whispering. And I find myself ready for it, or as ready as anyone ever is. Let the cold come gently, like this. Let it arrive with soft footsteps and silver mornings. I’ll meet it on the porch with a warm cup and a grateful sigh.

It is now the temperature outside that makes me irresistible to chilly women and snuggly animals, as i throw off a wave of warmth that than put the most cranky baby into nap-mode.  I have used this power only for good since obtaining it in my youth.

Day 20,738

Seeing if I can crib the new design for the Salem RidgeYaks in my own style, just for the fun of it. Maybe I’ll get a tshirt made up to wear to a game?

Images are, 1. my doodle,2. actual design, and then 3. a more direct replica of the logo to make into stickers or something for laughs.

#SalemRidge Yaks #digitalmarkers #doodle #SalemVA #Roanokeva #stickerideas @ridgeyaksbaseball

november 11, late evening

salem, virginia
mood: quiet awe
listening to: rain against the window, faraway train whistle


The sky went strange last night.

Around 11:23 I stepped out to check the yard, just the usual ritual before bed. A deer wandered ahead, nose to the grass. Then I looked up and stopped breathing for a moment.

Green light.
Pink edges.
A slow moving curtain across the northern sky.

The Northern Lights, visiting Virginia.

They rippled so softly it felt like the air itself was dreaming. The kind of color that doesn’t make sense this far south, but there it was, spilling quietly over the ridge.

Neighbors came out in pajamas, phones held up, some barefoot, some whispering.
Someone said, “It looks fake.”
Someone else said nothing at all.

The light shifted. Mint to violet to something gold at the edge. I tried to take a photo but the camera flattened it into a dull smear. It wasn’t something meant to be kept, only witnessed.

When it faded, it left a hum behind, a shimmer just behind my eyes. The kind of beauty that insists on being temporary.

Later, inside, tea steaming on the desk, I scrolled through the local posts: aurora over Roanoke Valley , salem sky glowing last night, did anyone else see it?
Yes, we did. All of us looking north, just for a moment, remembering that the world still surprises.

Today is gray and ordinary again.
But the sky still feels like it’s holding a secret, waiting for someone to notice.


note to self:
Sometimes wonder sneaks up quietly, wearing borrowed light.

time: 12:41 a.m.
current thought: the sky has a memory, and sometimes it lets us borrow it.
quote of the night: “The world is full of magic things, patiently waiting for our senses to grow sharper.” – Yeats

Watched Spencer’s Mountain for the first time tonight. It’s one of those Technicolor postcards from the early 60s where everyone’s sunburned and smiling, even when the world’s rough around the edges. Henry Fonda with that mountain-man gentleness, Maureen O’Hara glowing like a lantern in every scene. You can almost smell the pine and hear the crickets through the static of an old tube TV.

It’s a story about family and pride and scraping by with your hands, about trying to make something bigger for your children than what you started with. The Spencers don’t have much beyond the land and each other, but that’s the whole sermon. No preacher needed. Just a little dust, a lot of heart, and the constant push to climb one more ridge before sundown.

The movie hums with that small town rhythm, laughter on the porch, work in the quarry, dreams that stretch just past the next hill. You can see the bones of The Waltons taking shape here, that same love for place and kin, the same ache between what is and what might be.

There’s something soft in it that movies don’t often have anymore, not sweet exactly, but earnest. Like it believes in decency. Like it trusts the land and the light to tell the truth.

#nowwatching #SpencersMountain #firsttime #AppalachianHeart #simplethings

My nervous system can’t handle Walmart, but I’ll drive hours through the backroads of remote Appalachia alone with no cell service just to explore an abandoned farmhouse.

Out on the backroads again, where the air hums low and steady and every bend of the road feels like it’s keeping a secret just for you. My nervous system, bless its fragile wiring, can’t manage the sensory assault of Walmart, too many lights, too many voices, too much everything all at once. But drop me in the hollers of remote Appalachia, no signal, no GPS, just the crackle of the radio fading out somewhere past civilization, and I’m at peace.

There’s something grounding about an old farmhouse half swallowed by weeds, the kind that seems to breathe on its own. Boards sigh when you step inside, dust motes drift like memories in the morning light. I can hear the wind crossing the mountains outside, slow and patient. Maybe I find comfort in the stillness of what’s been left behind, places that don’t ask anything from you but quiet attention.

It’s funny what feels safe and what doesn’t. Some people need crowds, others need ghosts. Me, I’ll take the soft creak of an abandoned porch over the hum of fluorescent aisles any day. Out here, my nerves finally unclench. Out here, even the silence feels like company.

#Appalachia #backroads #abandonedplaces #quietcorners #introvertlife #roanokeva #doodle

Snow! Salem Ridgeyaks!

A surprise sprinkling of snow drifted in before sunrise, soft and quiet as a held breath. Just a dusting – the kind that doesn’t quite stick but still turns the world silvery for a blink. The air held that hush that only snow brings, a sound thinner than silence. Later, as twilight settled in, the flakes returned again, swirling in streetlight cones like ash from some secret celestial fire.

Tonight the thermometer’s on its way down to 26°, sharp enough to remind the trees to tighten their bark and the rest of us to reach for another blanket. You could almost taste winter on the wind – the clean edge of it.

Stopped by to see the Salem RidgeYaks today – yes, actual yaks, shaggy and serene, standing like misplaced clouds in the pasture. Their coats are thick as storybook winter, long bangs hanging over calm, curious eyes. They move slow, deliberate, as if time itself runs a little gentler around them.

Some folks say they don’t really belong here – that yaks aren’t native to the Blue Ridge at all, that they’re creatures of the Himalayas, not these soft Virginia hills. Maybe that’s true, but looking at them under the gray November sky, with the mountains rising behind like folded blue paper, they seem right at home. Far be it for me to deny any creature welcome to this place.

The cold wind lifts their fur; they blink, unbothered. The ridges breathe mist, and for a moment it’s easy to believe the world fits together in ways that make quiet sense.

#SalemRidgeYaks #SalemVA #MountainLife #RoanokeValley #RoanokeVA #doodle #earlysnow

Dinner nosh

A variant on this

https://www.lemontreedwelling.com/jalapeno-popper-wonton-cups/

Made in the style of buffalo chicken dip, but with jackfruit, in wonton

Also played a little Dead Island 2 on ps5 – free if you already pay for plus

https://en.wikipedia.org/wiki/Dead_Island_2

Welcome to my wall scrawls.