Critters

A few visitors dropped by the backyard today, each stopping in at their own hour like they were checking into a tiny woodland hotel with flexible scheduling.

Before dawn, the tailless mouse made the first appearance of the day. A small, round shadow skittering across the dim camera view, moving with that cautious little hop-hop-hop that only nighttime creatures seem to master. No tail, but plenty of determination. It lingered just long enough to be seen, then slipped back into the pre-dawn hush, leaving only a faint ripple in the stillness.

Hours later, once the sun had rubbed the sleep out of its eyes, a chipmunk arrived around 8:30. This one had attitude. It zipped up onto the concrete like it was clocking in for mischief, then made a very deliberate show of glancing toward the house. There’s a good chance it was taunting the cat, who watched from behind the glass with that slow-tail-swishing, offended dignity only a cat can manage. The chipmunk seemed pleased with itself before dashing off to whatever important acorn diplomacy awaited.

And then, a final visitor: a deer, calm and quiet, wandering into the frame just long enough to gather itself. One moment there, the next leaping up the hill in a single smooth arc, like gravity was only a suggestion. A brief cameo, elegant and gone.

Three tiny chapters, stitched into the morning. I love catching these fragments of the world going about its business while we rub the sleep from our eyes.

Tags: #backyardzoo #taillessmouse #chipmunkantics #catdrama #morningdeer #salemva #littlewildthings

Deer visit

Just one deer on the backyard camera last night, stepping into frame like it wasn’t sure if it was allowed to be there. It came up to the concrete slab out back, gave everything a long, thoughtful once-over, ears perked and tail flicking like Morse code to the darkness.

It lingered just long enough to think about taking another step… then changed its mind and drifted away, soft as breath, back into the shadows. A tiny moment, but it feels like a small blessing every time the wild edges of the world brush up against the house.

Nice to have that little heartbeat of nature checking in before dawn.

#deer #backyardzoo  #roanokeva

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