home.social

Search

1000 results for “dev_ric”

  1. Kotlin and Go couldn't be approaching their error handling pains more differently.

    Go: go.dev/blog/error-syntax
    Kotlin: medium.com/@internetcreationis

    TL;DR: While Kotlin is getting rich errors, Go is getting... nothing. And please stop asking for it, the community clearly won't come to a consensus.

    Like it or not, `if err != nil` is here to stay.

    #GoLang #Kotlin #ErrorHandling #LanguageDesign #ProgrammingLanguages #DevThoughts

  2. Kotlin and Go couldn't be approaching their error handling pains more differently.

    Go: go.dev/blog/error-syntax
    Kotlin: medium.com/@internetcreationis

    TL;DR: While Kotlin is getting rich errors, Go is getting... nothing. And please stop asking for it, the community clearly won't come to a consensus.

    Like it or not, `if err != nil` is here to stay.

    #GoLang #Kotlin #ErrorHandling #LanguageDesign #ProgrammingLanguages #DevThoughts

  3. The Picture of Kfit Merlaub

    A quiet library filled with books reflects the peaceful solitude Kfir Merlaub sought in his rich imagination The black and white portrait captures a moment of transcendent social harmony

    See More Seeds: aidyslexic.raupulus.dev/collec

    #StableDiffusion #ai #ArtificialIntelligence #3D-design #realistic #characters #Kfir-Merlaub #quiet-library #books #peaceful-solitude #black-and-white-portrait #social-harmony

  4. Sip and Savour in the Serenity of Our Outdoor Winery Tasting Room

    Step into our tranquil winery tasting room and indulge in the rich complexity of our highly-acclaimed wines harmonized with delectable fruit pairing Your senses are in for a divine treat

    See More Seeds: aidyslexic.raupulus.dev/collec

    #StableDiffusion #ai #ArtificialIntelligence #winery #tasting-room #wine #pairings #fruit #outdoor-dining

  5. Sip and Savour in the Serenity of Our Outdoor Winery Tasting Room

    Step into our tranquil winery tasting room and indulge in the rich complexity of our highly-acclaimed wines harmonized with delectable fruit pairing Your senses are in for a divine treat

    See More Seeds: aidyslexic.raupulus.dev/collec

    #StableDiffusion #ai #ArtificialIntelligence #winery #tasting-room #wine #pairings #fruit #outdoor-dining

  6. Sip and Savour in the Serenity of Our Outdoor Winery Tasting Room

    Step into our tranquil winery tasting room and indulge in the rich complexity of our highly-acclaimed wines harmonized with delectable fruit pairing Your senses are in for a divine treat

    See More Seeds: aidyslexic.raupulus.dev/collec

    #StableDiffusion #ai #ArtificialIntelligence #winery #tasting-room #wine #pairings #fruit #outdoor-dining

  7. Sip and Savour in the Serenity of Our Outdoor Winery Tasting Room

    Step into our tranquil winery tasting room and indulge in the rich complexity of our highly-acclaimed wines harmonized with delectable fruit pairing Your senses are in for a divine treat

    See More Seeds: aidyslexic.raupulus.dev/collec

    #StableDiffusion #ai #ArtificialIntelligence #winery #tasting-room #wine #pairings #fruit #outdoor-dining

  8. Sip and Savour in the Serenity of Our Outdoor Winery Tasting Room

    Step into our tranquil winery tasting room and indulge in the rich complexity of our highly-acclaimed wines harmonized with delectable fruit pairing Your senses are in for a divine treat

    See More Seeds: aidyslexic.raupulus.dev/collec

    #StableDiffusion #ai #ArtificialIntelligence #winery #tasting-room #wine #pairings #fruit #outdoor-dining

  9. WinterJS 1.0 · Blog · Wasmer

    @programmazione

    "WinterJS 1.0 è finalmente arrivato.

    WinterJS è un runtime Javascript incredibilmente veloce, compatibile con WinterCG e scritto in Rust, che utilizza il motore SpiderMonkey per eseguire JavaScript e Tokio per gestire le richieste HTTP e il ciclo di eventi JS. Il runtime WinterJS può anche essere compilato in WebAssembly e come tale è il primo runtime[...]"

    #programmazione #js #dev #winterjs #webasm

    wasmer.io/posts/winterjs-v1

  10. Devil in the grooves: The case against forensic firearms analysis radleybalko.substack.com/p/dev Wonder how many wrongful convictions were based on the dubious science of forensic firearms analysis? The judge in "Illinois v. Rickey Winfield" decided it wouldn't be allowed in his courtroom
    #legal #guns #ballistics

  11. Wer irgendwann in letzter Zeit mal testweise die Remote-Desktop-Software NX NoMachine installiert hatte, sollte seinen Linux-Rechner auf Überbleibsel dieser Installation kontrollieren:

    wiki.archlinux.org/title/NoMac…

    Die verbliebene Gerätekonfigurationsregel /etc/udev/rules.d/99-virtualgl-dri.rules hatte mir die Berechtigungen für /dev/dri/renderD128 dergestalt verbogen, dass Vulkan nicht richtig funktionierte.

    #NoMachine #VulkanAPI #udev

  12. So #GameDev

    I'm gonna start talking about a game I want to make, a little. I have a few things of this nature that are just in my head so far, because historically as soon as I reveal an idea to someone, I tend to lose enthusiasm, like, merely expressing the idea to someone satisfies the part of my brain that spurs to action. I don't even worry about being ripped off, cause if someone rips off one of my good ideas and makes it exist, I win too cause the thing I wanted exists now. I need enough money to live, but the idea of Big Money has never motivated me at all.

    This one, however, will never be made without me finding partners with complementary skillsets and a passion for Free Software, so I'm not hoarding it all to myself, this is me putting out feelers for people who want to get involved in a CC-licensed Myst-like game project.

    Of course, the licensing and the topic of monetization are to be discussed, I'm not against money but I have had too damn many projects, musical mostly, that could have been great but get shoved out half-assed and earn the success that half-ass deserves. My money success trajectory for this looks more like, me and my partners build a humble but unique and fun game and give it away, we gain public profile for it, and people come and offer us jobs or even commissions to build their stuff.

    I will also say, the world building allows for massive expansion - unlimited, in fact. Not algorithmic, expansions would be expansions of mythology, environment, and new puzzles, built entirely by humans.

    The people responsible for those debacles are now avid Slop users, by the way, and this will be a 100% slop-free project. Once AI coding is available in a usable way on local hardware, real centaurs who do not participate in the scorching of the midwest are welcome to use assistance.

    NO vibe coders. I could vibe code the whole thing myself in a week, from what I'm hearing, and learn absolutely nothing. I don't need you to do for me what I can do myself.

    But speaking of vibes, the overall Vibe is #Myst, because I have no compunctions about imitation of great art, and frankly there are not enough GOOD imitations. Lots that match the visual richness, but have shit puzzles. Lots that build good world & culture, but either fail at visual, or again at puzzles, or sometimes both. The closest I've seen from a company that isn't Cyan is Chants Of Sennarr.

    Puzzles, indeed, are the most difficult bit of this type of game, really, and as far as I know, absolutely nobody out there is as good as the Rand brothers at making the puzzles a naturalistic piece of the environment. Slapping a sliding tile puzzle onto a machine that you have to solve before you turn it on is not world building.

    Not that every single puzzle in the D'Ni world makes sense in that way, but even when they don't, they have a completely novel form that feels natural. For instance, SPOILER FOR RIVEN IN THE NEXT PARAGRAPH

    The "fire marbles" thingy in Riven, which I still don't fully grasp the underlying "theory" in the way that Terry Pratchett's Discworld magic is intuitively easy to grasp because it's so damn scientific about it. But basically in one spot there's a machine that pushes up pins to represent the landscape of the island on a grid. There's five power plants on the island, and they are in specific grid squares. Then later, to power up a machine, you need to place the correctly coloured marble into the corresponding square on a grid in the machine. Effectively, not much different than a slider puzzle to solve it, but it feels perfectly reasonable, in the context of the game, which has its own odd ideas about technology, geology, etc. It is not that complex or difficult, but it is rich.

    (there is a similar game mechanic at play in how you solve the underground railroad in the original Myst, too)

    I am not going to talk too specifically about the world history of the setting, but suffice to say, it takes place almost entirely underground in a network of tunnels that spans at least a continent. One of my big frustrations with game engine environment tutorials is that nobody is interested in doing small, enclosed spaces, it's always "we're gonna build Far Cry in five minutes!" Maybe this is so easy that I shouldn't need help, I dunno.

    Design aesthetic is Vaporwave, but realistic, not a psychedelic vaporwave world. Like, some of the underground spaces are luxury malls, I'm sure some of you have already deduced; since someone was somehow able to build a continent-wide tunnel network, that someone is gonna want luxury malls. In game time, the malls are perhaps... past their best days. But past glory still turns its lights on, sometimes. So not so much overt Vaporwave, but rather, the world's aesthetics draw from the same source material as #Vaporwave.

    Who am I: James Paskaruk. You will find my name on imdb connected to the cartoon features "Ozzy," "NextGen," "Maya and the Three," and "Thelma The Unicorn," two as a Systems Admin in which I managed the network and servers and on-prem render farm, and two as a Technical Director, in which I did higher-level Systems stuff like CI/CD and dev containers, as well as Python add-ons for Blender and Nuke. I am also a musician and occasional music producer.

    I will be able to wrangle Assets like a rodeo champion, handle all our server and Systems needs, ensure our backups are in order, provide scripts and new 3D tools for Blender, create in-house automations where there is no Free tool at hand, and all the other things you would expect from a professional 3D Studio IT department with DevOps experience and a heavy focus on Free Software. I will also handle sound and score, unless someone better volunteers and understands the vibe.

    I will also participate in all other parts of the development process on a Capable Monkey basis. While I was at Tangent Animation, both as IT and TD, I studied hard on Blender, which was our centrepiece of the studio and obviously of the asset dev process of this project. I understand how every part of Blender works, down to the data structures, other than I haven't touched Geometry Nodes yet, but look forward to having a reason to do so. If you do 3D but don't code or don't want to code, I will be able to help you work quickly and with an absolute minimum of repetition and drudgery.

    What I need:

    -At least a good Godot mentor who can help me make sense of things as I come up against them. If you know Godot well and want to give the project itself time, that would be amazing, and all game devs (particularly Environment artists) who wish to do so are welcome to contact me to discuss their possible part in the road forward, as well as help me to map the specifics of that path, because I have not done game dev yet at all, to speak of. I can learn it though, for sure, but I will never accomplish this project all by myself, beyond maybe a demo room or two, but I do get the hang of things.

    -3D Modeler(s) and Surfacer(s) who use Blender, with an understanding of Vaporwave aesthetics at the genetic level. Not to be ageist, but I think only #GenX devs will really understand at a visceral level what I'm after here, once I explain the overall thing. We will need characters eventually, but most of the game is gonna be Blair Witch type eerieness, with cultural poignance and perhaps some antique gadgets and Great Machines. Not Doom or Zombie.

    I have actually built the skeleton of the first Scene already in Blender, but it's just rough geometry, no surfacing and almost nothing in it. The idea of starting to build up a collection of off-the-shelf assets has occurred to me, but that's a long way down a list of things we have to pay for first. Music and Wood are two expensive hobbies I already have. :>

    If you build assets and are interested in giving me access to your stuff on spec, with the understanding that in the event of eventual monetization, you will be paid first in a fully equitable way, please get in touch, especially if you do Art Deco, Trains, Underground Environments, or Postmodern Architecture and Furniture. If I had some "action figures" to play with, it might help me move the thing forward a little. I'm surprised more asset-selling shops don't make lo-res versions of things available for free as dev standins, there are a lot of things I could be using, but I'd be spending a few thousand that I don't have right out of the gate.

    But again, No Slop. Please do not offer to use one of the Silicon Valley datacentres to generate the assets I need, I will only hate you back, and you will probably be puzzled as to why. This is an attempt to create or join a community of curious doers, not status seekers.

    Ok? Good.

  13. Wer irgendwann in letzter Zeit mal testweise die Remote-Desktop-Software NX NoMachine installiert hatte, sollte seinen Linux-Rechner auf Überbleibsel dieser Installation kontrollieren:

    wiki.archlinux.org/title/NoMac…

    Die verbliebene Gerätekonfigurationsregel /etc/udev/rules.d/99-virtualgl-dri.rules hatte mir die Berechtigungen für /dev/dri/renderD128 dergestalt verbogen, dass Vulkan nicht richtig funktionierte.

    #NoMachine #VulkanAPI #udev

  14. Wer irgendwann in letzter Zeit mal testweise die Remote-Desktop-Software NX NoMachine installiert hatte, sollte seinen Linux-Rechner auf Überbleibsel dieser Installation kontrollieren:

    wiki.archlinux.org/title/NoMac…

    Die verbliebene Gerätekonfigurationsregel /etc/udev/rules.d/99-virtualgl-dri.rules hatte mir die Berechtigungen für /dev/dri/renderD128 dergestalt verbogen, dass Vulkan nicht richtig funktionierte.

    #NoMachine #VulkanAPI #udev

  15. Wer irgendwann in letzter Zeit mal testweise die Remote-Desktop-Software NX NoMachine installiert hatte, sollte seinen Linux-Rechner auf Überbleibsel dieser Installation kontrollieren:

    wiki.archlinux.org/title/NoMac…

    Die verbliebene Gerätekonfigurationsregel /etc/udev/rules.d/99-virtualgl-dri.rules hatte mir die Berechtigungen für /dev/dri/renderD128 dergestalt verbogen, dass Vulkan nicht richtig funktionierte.

    #NoMachine #VulkanAPI #udev

  16. Wer irgendwann in letzter Zeit mal testweise die Remote-Desktop-Software NX NoMachine installiert hatte, sollte seinen Linux-Rechner auf Überbleibsel dieser Installation kontrollieren:

    wiki.archlinux.org/title/NoMac…

    Die verbliebene Gerätekonfigurationsregel /etc/udev/rules.d/99-virtualgl-dri.rules hatte mir die Berechtigungen für /dev/dri/renderD128 dergestalt verbogen, dass Vulkan nicht richtig funktionierte.

    #NoMachine #VulkanAPI #udev

  17. I’ve Spent My Whole Life Refusing to Break, and It’s Slowly Breaking Everything I Love

    8,993 words, 48 minutes read time.

    They call me “the rock” at work.

    At first, I thought it was a joke. Some intern started it during a brutal deadline last year. Half our team was losing it, one guy had a full-on meltdown in the stairwell, and I just… didn’t. I stayed late, knocked out my part, kept my voice even, answered questions, didn’t yell. Next day in standup, the intern goes, “Ask the rock, he never cracks,” and everyone laughed.

    But it stuck.

    Now my manager calls me that. “Put it on Matt’s plate, he’s a rock.” People say it like a compliment. Like it’s this badge of honor, being the guy who doesn’t flinch, doesn’t cry, doesn’t panic.

    I pretended I didn’t like it. “C’mon, I’m just doing my job.” But I liked it. A lot. It felt like proof I’d finally escaped where I came from.

    Growing up, the only thing worse than being poor in our neighborhood was being soft. I remember one time, I was probably eight or nine, playing basketball in the driveway, and I tripped. Scraped my knee so bad the skin just peeled back. I started crying, like loud ugly kid-crying—snot, hiccups, the works.

    My dad walked out, looked at me, then at my knee, then back at me.

    “You done?” he said.

    “It hurts,” I blubbered.

    He shook his head. “It’s a scrape, not a bullet. Stop crying, be a man.”

    He went back inside. That phrase seared itself into my brain: Stop crying, be a man. I stopped crying. Not just that day. In general.

    Whole life since then has been me trying to prove I listened.

    So yeah, “the rock” fits.

    What nobody at the office knows is I had to lock myself in a stall in the men’s room last week because my heart was racing so hard I thought I might pass out. I sat on the toilet lid, head in my hands, breathing like a woman in labor, trying not to make a sound because God forbid someone hears me having a panic attack.

    Rocks don’t hyperventilate in bathroom stalls.

    But that’s kind of my thing: feel something, shove it down, slap a lid on it, move on. I’m a professional at it now.

    Church people call it “being strong.” Clinical people call it “emotional repression.” I just call it survival.

    My wife, Emily, calls it “shutting down.” She says it calmly, like she’s reading a weather report, but her eyes get that glossy look that tells me I’m supposed to say something deep right there. I never do. I go for safe. Joke. Change the subject. Or pull the nuclear option: “I’m just tired, can we not do this right now?”

    Which is basically our marriage in twelve words.

    We’ve been married nine years. We have a seven-year-old daughter, Lily, who looks exactly like Emily except with my eyebrows, which feels unfair to her, but whatever. We met in college at some Christian campus thing I only went to because there were free burritos. She saw through most of my crap from day one, which I think is why I married her and also why I can’t stand her sometimes.

    She’s a feeler. Like, professionally. She does counseling with teens at a nonprofit. She comes home wrecked from some kid’s story and wants to sit on the couch and process it for an hour. She cries at TV commercials. She said “I feel” more in the first month I knew her than my dad probably has in his entire life.

    First time she cried in front of me, I freaked out internally. Panic, sirens, red lights. Externally, I was smooth. I put my arm around her, said all the right words. I didn’t know what I was doing, but she looked at me like I’d just parted the Red Sea. “I feel safe with you,” she said.

    I should’ve told her then: “I don’t do feelings. I just do rescue.” But I liked being the safe guy. The rock.

    Now, nine years in, that “safe” guy has turned into something else. A wall. A locked door. A black hole.

    She sits at our kitchen table some Tuesday night, wine glass in hand, staring at me over a half-eaten plate of chicken and rice.

    “You’re not here,” she says. “I mean, you’re physically here, but you’re not here.”

    “I’m literally sitting right in front of you,” I say, stabbing a piece of chicken. “What do you want, a hologram?”

    She doesn’t laugh. “Matt, I’m serious. I don’t know what you’re feeling. Ever. I don’t know when you’re scared. Or angry. Or sad. I can’t read you anymore. It’s like there’s this glass wall. I can see you, but I can’t reach you.”

    I chew slowly to give myself time. Classic tactic. Delay, defuse, divert.

    “I’m just tired,” I say. “Work’s a lot. Dad’s situation’s a lot. This is just… a season.”

    Her jaw tightens at the word “season.” She hates Christian clichés, and I use them like shields.

    “You said that last year,” she says. “And the year before. ‘It’s just a season.’ When does this season end, Matt? When you burn out? When we’re divorced? When Lily’s grown and doesn’t even bother to call you?”

    “Wow,” I say, forcing a laugh. “Okay, that escalated.”

    That’s another move: if I make her feel dramatic, I get to feel sane.

    She takes a breath, looks down at the table. “I’m asking you to let me in,” she says, softer. “Talk to me. Tell me when you’re drowning instead of pretending you’re fine. You don’t have to be the rock, Matt. Not with me.”

    There’s this moment where I actually feel it—the opening, the offer. Like a crack in the armor. I could tell her about the bathroom stall. About how sometimes at two in the morning my heart’s pounding like I’m on mile ten of a run and I can’t sleep, so I scroll my phone until my eyes burn. About the weird chest tightness that makes me think of my dad in the hospital, tubes and machines and beeping, and how I’m still that kid in the driveway trying not to cry.

    I even start to say it. “Sometimes at work I—”

    The words get stuck in my throat. There’s this primal shame that hits like a wave. If I say it out loud, it’s real. If she hears it, she’ll see I’m not a rock. I’m a scared dude in a grown man’s clothes with a half-charged iPhone and a Bible app he barely opens.

    I clear my throat. “Sometimes at work I just need to, like, zone out, you know? Nothing crazy. I just power through.”

    She watches me. She knows I pulled up right before the truth. I can see it in her eyes, that flash of disappointment before she buries it. She nods like she’s trying to accept the crumbs.

    “Maybe we should go to counseling,” she says.

    And there it is. The one word I refuse to let into my story.

    “We’re not that bad,” I say, way too fast. “Counseling’s for people who are… like… actually falling apart. We’re just in a stressful patch. Money’s tight, work’s nuts, your job is heavy, my dad almost died. We don’t need to pay someone a hundred and fifty bucks an hour to tell us what we already know.”

    “That’s not what counseling is,” she says.

    I shrug. “You’re a counselor, obviously you’re pro-counseling. But I—what would I even say? ‘Hi, I’m Matt, things are fine, my wife just wants me to cry more’?”

    She closes her eyes like my words physically hurt. “This isn’t about crying,” she says. “This is about you. Letting. Me. See. You.”

    “I married you, didn’t I?” I say. “You see me. This is me.”

    That’s the line I always throw out when I want to shut the conversation down—“This is just who I am.” It sounds like honesty, like self-awareness, but really it’s defense. A way of saying, “I’m not changing.”

    She stares at me for a long time. Then she gets up, takes her plate to the sink without another word.

    I tell myself she’s being emotional. That she’ll calm down. That it’s not that bad. That I’m not that bad.

    That night, after she goes to bed, I sit on the couch with my laptop. I tell myself I’m going to do a little work, get ahead of tomorrow. Ten minutes in, I’m already opening a second browser window.

    It’s funny how my brain knows the path without thinking. A couple keystrokes, a few clicks, and there it is: curated, pixel-perfect nakedness. I scroll, numb. That’s really what it is. Not lust so much as anesthesia. My own private pharmacy.

    I justify it. I’m not sleeping with anyone else. I’m not on Tinder. I’m not at a bar hitting on girls who call me “sir.” This is safe. It’s victimless. It’s just… stress relief. And if I ever tried to talk to Emily about how I actually feel, I’d probably scare her. This way, I take care of it myself.

    Self-sufficiency, right? That’s what being a man is. Handle your own crap.

    I close the laptop an hour later feeling gross, but the guilt is dull. Familiar. Easy to ignore. I tiptoe into the bedroom. She’s already turned away from my side, curled in a C-shape near the edge. I slide into bed, careful not to touch her too much, in case she wants space. Or in case she doesn’t, because if she turns toward me, I might have to be present.

    In the dark, my phone buzzes on the nightstand. I check it. It’s Marcus.

    You good, man?

    Marcus is my one semi-real friend from church. Taller than me, quieter. Used to be a cop, now does security at a hospital. He’s the kind of guy who actually listens when you talk. Like, fully. It’s unnerving.

    He’s the only one who’s ever looked me in the eye and asked, “How’s your heart?” without smirking. I laughed when he said it the first time. “Bro, what are we, in a Nicholas Sparks movie?” He smiled, but he didn’t take it back.

    I stare at his text for a second. My thumb hovers over the keyboard.

    I’m fine, just tired, I type.

    I delete “just tired.” It sounds weak. I send: I’m good. Busy with work. You?

    The truth would be: I’m not sleeping, my wife wants to send me to counseling like I’m broken, I spent an hour watching porn to avoid feeling anything, and my chest hurts more days than not. Also sometimes I want to just drive until I run out of gas and start over somewhere no one knows I’m supposed to be “the rock.”

    He replies: Same. Let’s grab lunch this week. Been thinking about you.

    Cool, I send. Let me know when.

    I set my phone down and roll onto my back, staring at the ceiling in the dark. Some random verse I half-remember from a sermon floats through my brain: “The Lord is close to the brokenhearted.”

    I snort quietly. I’m not brokenhearted. I’m just busy.

    Work does not care about your feelings. My manager, Jeff, cares about deliverables and client satisfaction scores and how many hours the team can bill without triggering HR. There’s a massive software deployment next month. If we nail it, it’s big for the company. If we blow it, we lose a multi-million-dollar client. No pressure.

    We shuffle into the conference room for yet another war room meeting. Screens everywhere, coffee cups, people with that glazed “I’ve been on Zoom for 12 hours” look in their eyes.

    Jeff slaps my back. “How’s my rock?” he says, grinning.

    “Ready to roll,” I say.

    “Good, because if this thing slips again, I’m gonna have to start sacrificing junior devs to the client gods.”

    Everyone laughs. I do too, even as that familiar tightness creeps into my chest. I tell myself it’s just caffeine. I’ve had three coffees and a Red Bull. Anyone’s heart would pound.

    Halfway through the meeting, someone mentions layoffs. Not directly, but hints. “If this doesn’t go well, upper management’s gonna be asking hard questions.” Translation: people will get cut. People like me. People like the guy who had a meltdown in the stairwell last year and mysteriously “transitioned to new opportunities” two months later.

    Rocks don’t get laid off. Weak links do. If I crack, I’m a liability.

    My phone buzzes. It’s a text from my mom: Dad had another episode. Doctors want to run more tests. Can you come by tonight?

    I swallow, staring at the message.

    You okay? Jeff says, noticing my face.

    “Yeah,” I say quickly. “Family stuff. I’m good.”

    I tuck it away. Mental note: hospital. Later. After being the rock at work, I get to be the rock for my mom. Then maybe, if I have any energy left, I’ll toss Emily a pebble and call it connection.

    During a break, I slip into the men’s room. I splash water on my face. As I look up, my reflection stares back at me. Thirty-six, a little more gray at the temples than I’d like, dark circles under my eyes. But my expression is neutral. Controlled. Rock-solid. You’d never know that inside, there’s this constant hum of static.

    My chest tightens again. The room tilts for a second. I grab the edge of the sink.

    Not now. Not here.

    I duck into a stall before anyone walks in, sit on the lid, elbows on my knees, hands over my face. Breathe. In. Out. In. Out. I count my breaths. I feel ridiculous, a grown man hiding in a toilet cubicle trying not to pass out.

    Somewhere behind the stall door I hear my dad’s voice: Stop crying, be a man.

    “I’m not crying,” I mutter. “I’m breathing.”

    Same thing, really. Trying to keep the dam from breaking.

    I think, briefly, of all the verses I’ve heard about not being afraid. “Do not be anxious about anything.” “Fear not.” “The Lord is my rock.” It’s funny how I’ve basically replaced God with my own chest. My own calm face. Like, I’m my own Lord and rock. That’s not how I’d say it out loud, but that’s how I live.

    After work, I swing by the hospital. Dad’s sitting up in bed, watching some game show with the sound off, wires stuck to his chest. Mom’s in the chair by the window, hands folded, Bible open but unread on her lap.

    “Hey,” I say, stepping in. “How’s the party?”

    Dad grunts. “Food sucks.”

    “That’s how you know it’s a real hospital,” I say. “If they start serving steak, you should worry.”

    He smirks. Mom gives me a tired smile. I do the thing I always do in hard rooms: crack jokes, keep it light, distract from the elephant.

    “How you feeling?” I ask, even though I can read the chart as well as he can.

    “Old,” he says. “Doctors say it’s not as bad as last time. Just gotta ‘take it easy.’ Whatever that means.”

    “You gonna listen?” I ask.

    He snorts. We both know he won’t. Men in my family don’t “take it easy.” We work until something breaks, then we duct tape it and keep going.

    Mom looks at me like she wants to say something spiritual. She’s the only one in our family who does feelings out loud, but years married to my dad trained her to make them small.

    “Been praying Psalm 34,” she says softly. “You know that one, honey? ‘The Lord is close to the brokenhearted and saves those who are crushed in spirit.’”

    She says it like it’s comfort, a warm blanket. I hear it like an accusation. Brokenhearted? Crushed? That’s not allowed. Not for men like us. We’re not brokenhearted, we’re just… busy. Tired. Overworked. Slightly malfunctioning machines.

    “I like the one about ‘those who don’t work don’t eat,’” Dad says. “Keeps you honest.”

    I laugh, grateful for the deflection.

    Mom sighs. “Your father,” she says, half-affection, half-frustration.

    On the drive home, the verse keeps replaying in my head. “The Lord is close to the brokenhearted.” If that’s true, then what does that mean for me? Because most days, God feels about as close as the moon. Beautiful, in theory. Useless, in practice.

    Maybe the problem is I’m not brokenhearted enough. Or maybe that’s just another way to blame myself for something I don’t understand.

    Thursday night is men’s group. I go mostly because it looks good. A married Christian dad who skips men’s group raises eyebrows. A married Christian dad who shows up, brings chips, cracks jokes, and nods thoughtfully during prayer requests gets approved.

    We meet in the church basement, twelve guys in folding chairs in a sad circle under fluorescent lights that make everyone look tired and slightly dead. There’s the usual spread: chips, store-brand cookies, a veggie tray no one touches, and a big pot of coffee because apparently we’re all eighty.

    Our leader, Dan, is a big guy with a beard that makes him look like a gentle lumberjack. He opens in prayer, then reads a short passage.

    “Tonight,” he says, “I thought we’d just… be honest. No study guide. No video. Just us, talking about what’s real.”

    That sentence alone makes my skin itch.

    He reads Psalm 34:18. Of course. The Lord is close to the brokenhearted and saves those who are crushed in spirit.

    I feel it in my chest, right where the anxiety sits. The words are like a hand hovering over a bruise.

    Dan looks around. “Who here would say they feel brokenhearted right now?” he asks. “Crushed in spirit? Not in theory. Right now.”

    One guy laughs nervously. A couple shift in their chairs. I take a sip of coffee to buy time. No way I’m raising my hand. Brokenhearted is for widowers and addicts and cancer patients. Not white-collar project managers with upgraded iPhones and a leased SUV.

    To my left, Jason clears his throat. He’s usually one of the louder guys, all stories about sports and his glory days playing college ball. Tonight, he looks smaller.

    “I, uh…” He stares at the floor. His voice cracks. “My wife left last month. Took the kids. I haven’t told anyone ’cause… I’m embarrassed, I guess. I feel like I failed. I’ve been using porn for years. Said I’d stop a hundred times. Didn’t. She found stuff on my phone and just… had enough.”

    The room goes quiet. My stomach twists. I keep my face still.

    He keeps talking, words spilling now. “I always thought I had it under control, you know? Like, it was my thing. My stress relief. Better than cheating. That’s what I told myself. But she said it was cheating. She said I was choosing pixels over her. I don’t even… I don’t know how to live in my own skin right now. I feel… crushed. I don’t know how else to say it.”

    Tears slide down his face. Full-grown man, shoulders shaking, crying in a church basement under bad lighting. Every alarm in my body goes off. Run. Joke. Change the subject.

    Instead, something weird happens. Dan gets up, walks over, puts a hand on his shoulder. Another guy kneels and starts praying softly, nothing fancy, just, “God, be close. Help him.” No one mocks. No one rolls their eyes. A couple other guys are wiping their faces too.

    I feel this pressure rising in my throat. It scares me more than any panic attack.

    This could be you, a voice in my head whispers. You could talk. You could tell them about the stall, the late nights, the way your wife looks at you like a stranger. You could say you’re not okay. You could stop playing the rock.

    I picture it for a second. Me, opening my mouth, saying, “Guys, I’m not fine. I’m addicted to being okay. And to porn. And to people thinking I have it together. My wife wants to leave and it’s mostly my fault.” I imagine their faces, their hands on my shoulder, the prayers. I imagine God feeling near instead of abstract.

    My heart starts hammering. My palms sweat. My knee bounces.

    Dan looks around. “Anybody else?” he says gently. “You don’t have to share. But if you want to, this is a safe place.”

    Everyone’s eyes are suddenly the most interesting thing in the room. Shoelaces. Coffee cups. The scuffed tile. No one wants to be next.

    I clear my throat.

    “I mean…” I say, forcing a smirk. “My biggest sin is I eat too many carbs. So, uh, pray for me, guys.”

    A few chuckle. The tension breaks a little. Dan gives me a half-smile that doesn’t quite reach his eyes.

    Inside, I want to punch myself. That was my out. My shot. I could have been honest. Instead, I threw a joke at the most honest moment I’ve seen in years like a grenade.

    The rest of the night passes in a blur of surface-level shares. Work stress. Kids. “I should read my Bible more.” I mumble something about being busy. When we close in prayer, I mumble a safe Christian phrase: “God, thank you that you’re strong when we’re weak.” It sounds holy. It’s a lie coming from my mouth.

    After group, as we’re heading to our cars, Marcus falls into step beside me.

    “You okay?” he asks.

    “I’m good,” I say automatically. “That was… heavy, huh?”

    He studies me. “Yeah. But good heavy.” He pauses. “You sure you’re okay? You were twitchy during prayer.”

    “Twitchy?” I scoff. “Bro, I had too much coffee. That’s all.”

    He doesn’t push. “If you ever want to talk,” he says, “for real… I’m here. No judgment. None of us are as put-together as we look. You know that, right?”

    I shrug, unlock my car. “I’m fine, man. Seriously. Just tired.”

    That night, Emily’s on the couch when I get home, laptop closed, TV off. That’s never a good sign.

    “How was group?” she asks.

    “Good,” I say, dropping my keys in the bowl. “You know. Guys. Bibles. Bad coffee.”

    “Did you share anything?” she asks.

    I bristle. “What is this, a report card?”

    She folds her hands. “I just… you’ve been off. For a while. I was hoping you’d talk to someone.”

    “Talked to God,” I say. “That counts, right?”

    She does that slow blink that means she’s trying not to explode. “You know what I mean.”

    I do. I ignore it. I sit in the chair across from her instead of next to her on the couch. It’s a distance of three feet that feels like thirty miles.

    She takes a breath. “I called a counselor,” she says.

    Something in me snaps. “You what?”

    “I called a counselor,” she repeats, voice shaking slightly but steady. “For us. For our marriage. Her name is—”

    “We don’t need—”

    “—Sarah Stevens,” she says, talking over me, which she almost never does. “She’s highly recommended. She has experience with couples where one partner is emotionally unavailable.”

    “Emotionally unavailable,” I repeat, like it’s a slur.

    “That’s what you are, Matt,” she says, and now the tears are in her eyes. “You’re unavailable. I’m married to a ghost. You show up physically, you pay bills, you fix things when they break, but you don’t let me see you. I feel like I’m begging you to be my husband.”

    My defenses go up so fast I’m dizzy. “That’s not fair,” I say. “I go to work every day. I come home. I spend time with Lily. I go to church. I go to your family stuff even when I don’t want to. I provide. I don’t cheat. I don’t hit you. I don’t drink myself stupid. I’m doing everything I’m supposed to do and somehow it’s not enough because I don’t sit around talking about my feelings?”

    “You don’t talk about anything real,” she says. “Do you know how alone I feel? I would almost rather you scream at me than stay like this. At least then I’d know there’s something in there.”

    “That’s insane,” I say, standing up. “You’d rather I scream at you?”

    “I’d rather you be honest,” she fires back.

    I pace. “Fine. Here’s honest: I don’t want to sit in a room with some stranger and have you list all the ways I suck while she nods and takes notes.”

    “That’s not—”

    “I’m not doing it,” I say. “I’m not broken. We’re not broken. We’re just stressed.”

    “And I’m telling you we are broken,” she says, standing now too, voice rising. “We are so broken, Matt. I’m drowning over here. I lie awake next to you at night and I feel like a widow before I’m even forty.”

    The widow line hits harder than I want to admit. My mom in that hospital chair, Bible open, eyes tired. Is that Emily’s future?

    I can’t go there. Too much. Shut it down.

    “This is drama,” I say, dismissive. “You’re making it worse than it is.”

    Her mouth falls open. “Drama,” she repeats. “Okay.”

    She walks past me, into the bedroom. I hear drawers opening, the squeak of the closet door. A minute later she comes out with a duffel bag. She starts throwing clothes in it. T-shirts, jeans, underwear, random stuff. No method, just motion.

    “What are you doing?” I ask, stomach dropping.

    “Going to my sister’s,” she says. “For a while.”

    “You’re leaving,” I say, like I can’t process the words.

    “I’m not filing for divorce,” she says. “Yet. I’m giving you space. And I’m giving myself a chance to remember what it’s like to breathe.”

    “Emily, come on,” I say, moving toward her. “You’re overreacting.”

    She stops packing, looks up at me, and laughs. It’s a bitter sound I’ve never heard from her before.

    “You keep saying that,” she says. “Anytime I tell you I’m hurting, I’m ‘overreacting.’ Anytime I say we need help, you say I’m ‘making it worse than it is.’ I’m done gaslighting myself into thinking I’m crazy. This is real, Matt. I’m leaving because you already have. You left a long time ago. You’re just… physically present.”

    “That’s not fair,” I repeat, because I don’t have any other words.

    She zips the bag. “I’m giving you one more chance,” she says, voice trembling. “You call that counselor. You set up an appointment. You show me with actions, not words, that you’re willing to be vulnerable. To let me in. To let anyone in. If you don’t… I don’t know if there’s anything left to save.”

    She walks past me, bag over her shoulder. She stops at Lily’s door, pushes it open. Our daughter’s asleep, sprawled sideways, stuffed unicorn under one arm. Emily kisses her forehead, whispers something I can’t hear.

    “I’ll bring her back Sunday night,” she says quietly when she returns. “You can have the weekend to… think.”

    “What am I supposed to do?” I ask, hating how small my voice sounds.

    She meets my eyes. “Stop pretending you’re okay,” she says. “That’d be a start.”

    The front door closes behind her. The house is dead quiet.

    I stand in the middle of the living room, staring at the door like it might swing back open and she’ll say, “Kidding!” But it doesn’t. She doesn’t.

    Instead of collapsing, I do what I always do: I make a list. Dishes. Laundry. Trash. Budget. I straighten the cushions on the couch, because God forbid a pillow be crooked while my marriage implodes.

    Later that night, I get a text from Marcus.

    Heard Emily and Lily are staying with her sister. You want company?

    My heart stutters. News travels fast in church circles.

    I stare at the screen. I picture Marcus on my couch, looking at me with those annoyingly kind eyes, asking questions I don’t want to answer. What are you afraid of? How are you really? When did you start disappearing?

    I type: Nah man, we’re fine. Just needed some space. Couples fight, you know.

    I delete “we’re fine” because even I can’t make my thumbs lie that hard. I send: Just needed some space. All good.

    He replies immediately. You sure? I can be there in 15.

    I put the phone face down on the coffee table. I pace. I pick it up again.

    Come, I type. I delete it.

    I’m not sure what I’m more afraid of: him seeing the stack of dirty dishes and empty wrappers that prove I’m not as together as I act, or him seeing through whatever story I spin and calling me on it.

    I finally send: I’m good bro. Exhausted. Rain check?

    Three dots appear, disappear. Finally: Okay. I’m here if you need me. For real.

    I toss the phone onto the couch like it burned me. I grab my laptop instead.

    By 1 a.m., the house is dark, the only light the blue glow of my screen. Pop-up after pop-up, tab after tab. My brain is buzzing, my body’s numb. I tell myself it’s better than thinking. Better than feeling. Better than sitting in the silence and hearing my own excuses bounce off the walls.

    When I finally crash into bed, the sheets on her side are still warm from when she packed.

    The next morning, Lily’s empty room hits me harder than I want to admit. Her bed is made (Emily’s doing), stuffed animals lined up, tiny socks in the hamper. I stand in the doorway, an intruder in my own house.

    I go to work like nothing happened. Because that’s what you do. You compartmentalize. You put on the rock mask. You get stuff done.

    My performance drops, though. It’s subtle at first. I miss a detail here, forget an email there. Nothing huge. But in this job, death comes by a thousand paper cuts.

    A junior dev, Sarah, points out a flaw in my plan in front of the team. Normally, I’d thank her, adjust. Today, raw and sleep-deprived, I snap.

    “Maybe if you’d read the full spec before chiming in, you’d understand why we did it this way,” I say, harsher than I mean to.

    The room goes quiet. She shrinks back, face flushing. Jeff raises an eyebrow at me.

    “Let’s take this offline,” he says.

    After the meeting, he pulls me into his office.

    “You good?” he asks.

    “I’m fine,” I say automatically.

    He leans back, folds his arms. “Look, I don’t need to know your personal business. But you bit Sarah’s head off in there. That’s not like you.”

    “Sorry,” I say. “Just… a lot going on at home.”

    “Take a day,” he says. “Or a few. Whatever you need. This project’s important, but not as important as you not burning out.”

    The irony of my boss telling me not to burn out while I’m actively burning out isn’t lost on me.

    “I’m good,” I repeat. “I just need to focus.”

    He studies me for a second. “You know,” he says slowly, “you don’t always have to be the rock.”

    I actually laugh. “You started that, remember?”

    He smiles. “Yeah. Turns out sometimes rocks crack. Just… don’t wait until you blow up to tell someone you’re drowning, okay?”

    Everyone keeps using the same metaphors. Drowning. Burning out. Breaking. I keep dodging them like bullets in a video game. If I just keep moving, they can’t hit me.

    Days blur. Emily and I text logistics about Lily. Pickup times, homework, dentist appointments. Nothing real. It’s like running a small business together instead of a marriage.

    One Friday, I’m supposed to pick up Lily at four for her school’s little talent show thing. She’s been practicing a silly dance for weeks, making me watch it every night I had the energy to pretend I was watching. “You’re coming, right, Daddy?” she asked. “You promise?” I promised.

    Friday afternoon, I’m sitting at my desk, headphones in, trying to yank my brain through a spreadsheet, when a familiar tightness clamps my chest. I take a breath. Another. It doesn’t let up. My vision goes a little fuzzy at the edges.

    I check the clock. 3:50. If I leave now, I can make it.

    I tell myself: Just one more email. Just fix this one thing. Then go.

    I look up again and it’s 4:27.

    “Crap,” I say aloud, ripping my headphones off. I grab my bag, half-run to the elevator, curse at the slow doors, sprint to my car.

    On the drive, my phone buzzes with texts. I don’t check them. I don’t want to see.

    I pull into the school lot at 4:58, heart pounding. I jog toward the auditorium. It’s emptying. Parents filing out, kids with glitter on their faces and handmade certificates.

    Emily stands near the doors with Lily. Lily’s in a sparkly shirt, hair in two lopsided pigtails, holding a crumpled ribbon. Her eyes are red. When she sees me, her face does this thing—lights up, then falters, like she’s trying to decide whether to be happy or mad.

    “Hey!” I say, forcing cheer. “I’m so sorry, traffic was—”

    “Traffic?” Emily says, voice flat. “Show started at four.”

    “I know, I just—work ran late and—”

    “You promised,” Lily says quietly. That hurts way worse than Emily’s tone.

    “I know, bug,” I say, kneeling. “I’m sorry. How’d it go?”

    “Fine,” she says, shrugging, looking at her shoes. The word is a knife. It’s my own word coming back to kill me. I’m fine. We’re fine. Everything’s fine.

    “Mom filmed it,” she adds. “You can watch it later.”

    It’s an offer. A consolation prize. I hate myself for being the kind of dad who has to watch his daughter’s life on a screen because he can’t show up when it counts.

    “Yeah,” I say. “I’d love to.”

    Emily just looks at me. No lecture. Somehow, that’s worse.

    On the drive back to my place, Lily hums a bit of her song in the backseat. I grip the steering wheel so hard my knuckles go white. I want to cry. The feeling is so foreign it scares me. I swallow it. It goes down like a rock.

    That night, after I drop Lily back at her aunt’s, I sit in my dark living room alone. The quiet isn’t peaceful. It’s accusatory.

    On the coffee table, my Bible sits under a pile of mail. I don’t remember the last time I opened it for me, not for a group or to find a verse to toss at someone else.

    I push the mail aside, flip it open randomly. It lands in Psalms. My eyes fall on familiar words like they’re highlighted just for me:

    “The Lord is close to the brokenhearted and saves those who are crushed in spirit.”

    No escape this time. No sermon. No small group. Just me and a sentence that won’t shut up.

    I stare at the page until the letters blur. Something in my chest finally gives. Not a big cinematic break, just a tiny hairline crack.

    “Okay,” I whisper. “Fine. I’m… not okay.”

    The words feel like ripping duct tape off my soul. My throat burns. My eyes sting. My body, not used to this, fights it. But my arms suddenly feel too heavy to hold up. I slide off the couch onto my knees without meaning to, Bible still open on the cushion.

    “I don’t know how to do this,” I mutter. “I don’t know how to be… brokenhearted. Or whatever. I don’t know how to…” I wave a hand vaguely, like God needs me to pantomime emotions.

    Tears spill over. Real ones. First time in… I honestly can’t remember. Maybe when Lily was born. Maybe before that.

    It feels… ridiculous. A grown man, kneeling by his IKEA couch, crying into old carpet. I half-expect lightning to strike or a worship band to appear in my hallway. Instead, it’s just me and my ragged breathing and an almost-tangible sense that something—Someone—is near.

    For a second, I actually feel it. Like a warm weight on my shoulders. An invisible Presence sitting in the mess with me. Not fixing it. Just… close. The verse slams into my chest again: The Lord is close to the brokenhearted.

    Maybe this is what they mean. Maybe all the sermons and testimonies and emotional people with their arms raised weren’t just making it up. Maybe God actually shows up in the raw places. Not the polished, rehearsed testimonies, but the ugly middle.

    “Okay,” I whisper again. “I’m scared. Is that what you want me to say? I’m scared my dad’s gonna die and I won’t know how to grieve. I’m scared my wife’s never coming back. I’m scared I’ve already ruined my daughter’s life. I’m scared if people see how weak I am they’ll lose respect for me. I’m scared you’re not actually here and I’m just talking to my furniture.”

    It all comes out in a rush. Confession, sort of. Not the respectable kind you share in group. The embarrassing kind.

    For about thirty seconds, it feels like the safest place in the world.

    Then, just as quickly, another voice kicks in. Not literal, not demonic, just… me. The old script.

    Stop crying, be a man.

    Crying won’t fix your marriage. Emotions won’t get you a raise. Vulnerability won’t put food on the table. You’re kneeling on a stained carpet, talking to someone you can’t see, while your actual life is on fire. Get up. Be practical. Make a plan. God helps those who help themselves. (Which, by the way, isn’t in the Bible, but I quote it like it is.)

    I scrub my face with my hands, annoyed at the dampness. The Presence I felt a moment ago suddenly feels distant again. Or maybe I just pushed it away.

    “Yeah, okay,” I say out loud, like I’m closing a meeting. “That was… something.”

    I stand up, legs stiff. The room looks the same. Couch. TV. Empty picture hooks where our family photo used to hang before Emily took it. No angels. No burning bush. Just my stupid, beating heart and the hum of the fridge.

    My phone buzzes on the table. It’s a notification from some Bible app I downloaded months ago and never use: “He heals the brokenhearted and binds up their wounds. – Psalm 147:3”

    The timing is creepy. Or perfect. Or both.

    I hover over the notification, feel the temptation to sink back down, to lean in, to actually let myself be wounded in front of God. To admit that I’m not just “off” or “tired” but actually… broken.

    Instead, I swipe the notification away.

    “I don’t have time to fall apart,” I mutter.

    I open a browser and type the same old sites into the search bar. The algorithm knows me well. It feeds me what I want: distraction. Control. A world where nakedness is scripted and no one expects anything from me.

    Later, in bed, I stare at the ceiling and tell myself I’ll call the counselor tomorrow. Or the day after. Or after this project. Or after Dad’s next appointment. Or after Emily gives me another ultimatum. There will always be a better time to be honest than now.

    Months pass.

    The project at work launches. It’s not a disaster, but it’s not the triumph it could’ve been. My performance review is “meets expectations” with a few pointed notes about “needing to delegate better” and “watching interpersonal tone under stress.” Translation: You’re slipping, man.

    I don’t get fired. I also don’t get the promotion I’d been quietly gunning for. Jeff gives the lead on the next big project to Sarah—the junior dev I snapped at.

    “She’s showed a lot of initiative,” he tells me in his office. “And you, honestly… you seem like you’ve got a lot on your plate. Thought this might be a good time for you to take a step back, catch your breath.”

    Step back. Catch my breath. It’s like there’s this conspiracy in the universe to get me to stop pretending I’m okay.

    I nod, say the right things. “Totally understand. Happy for her.” Inside, I feel humiliated. Replaced. Useless.

    I don’t tell Emily. We barely talk beyond logistics anyway. The counselor’s number is still on a sticky note on my fridge. I move it occasionally when I wipe the counters. I’ve memorized the digits without ever dialing.

    Lily spends every other weekend with me. We do what I think dads are supposed to do. We go to the park. We get ice cream. We watch movies. I make sure she’s buckled in right and that she brushes her teeth. I tell myself that’s enough. That love is mostly showing up and making sure they don’t die.

    But sometimes, when she’s coloring at the table or building something with Legos on the floor, she’ll look up and just… watch me. Like she’s trying to figure out something she doesn’t have the words for yet.

    One Sunday, as I’m dropping her back at her aunt’s place, she hugs me tighter than usual.

    “Daddy?” she says into my shirt.

    “Yeah, bug?”

    “Are you sad?”

    The question catches me off guard. I pull back, look at her small face. Her eyes are big, searching.

    “Why do you ask?” I say.

    “You look sad,” she says simply. “And Mommy looks sad. And Aunt Claire says it’s okay to be sad. But you always say you’re fine.”

    The word stings again. Fine. My mask.

    “I’m okay,” I say automatically.

    She tilts her head. “It’s okay if you’re sad,” she says. “I won’t be scared.”

    I should say it. Right there. To my seven-year-old. “Yeah, I’m sad. I miss you when you’re not here. I miss Mommy. I’m scared I messed up.” That would be vulnerability. Not oversharing, just honesty.

    Instead, I pat her shoulder. “Don’t worry about me, kiddo,” I say. “That’s my job. To worry about you. You just be a kid, okay?”

    She nods slowly, like she’s filing away data for later. “Okay,” she says. “I love you.”

    “I love you too,” I say, and it’s the one thing I’m absolutely sure of.

    After she runs inside, I sit in my car and grip the steering wheel. I feel like I’m standing on the edge of a cliff, staring down at a body of water that might save me or drown me. The jump is admitting weakness. The cliff is made of all the years I spent being told that men don’t cry, don’t talk, don’t crack.

    I don’t jump.

    Instead, I drive to church.

    It’s easier to go when I don’t have Emily giving me side-eye during worship because I’m scrolling my phone under the seat. I can just show up, say hi to people, drink bad coffee, sing words I barely think about, nod through another sermon about some aspect of the Christian life I’m supposedly living.

    Today, though, the pastor does something different. He doesn’t preach. He brings a guy up to share his story.

    The guy is in his forties, shaved head, tattoos, looks like he could bench-press me. He takes the mic, clears his throat.

    “I used to think being a man meant never showing weakness,” he says. My spine goes rigid. “My dad was old-school. ‘Quit crying, tough it out,’ that kind of thing. I brought that into my marriage, my friendships, even my faith. I believed in Jesus, but I didn’t actually trust Him with anything that made me look bad. Or weak.”

    People chuckle. I don’t.

    He talks about an affair. About losing his job. About almost losing his kids. Then he talks about the night he finally broke down on his kitchen floor, sobbing, telling God he was done pretending. How Psalm 34:18 popped into his head—“The Lord is close to the brokenhearted”—and how, for the first time, he actually felt it.

    “I thought vulnerability would make me lose respect,” he says. “But hiding was what was killing me. My secrets hardened my heart. I was a shell. It wasn’t until I got honest—with God, with my wife, with some guys from this church—that anything changed.”

    The sanctuary is dead quiet. People are leaning in. A couple of visibly tough dudes are wiping their eyes. I sit there, arms crossed, jaw clenched.

    He keeps going. “I still struggle with pride. I still want to put on the strong face. But I’ve tasted what it’s like to let people see the cracks. And I’ve tasted what it’s like to have God meet me there, not when I’ve got it together but when I’m a mess. And I’ll tell you this: there’s more life in that than in all the years I spent playing the rock.”

    Somewhere deep inside, something in me is nodding. Yes. That. Do that. Say something. Move.

    I don’t.

    After service, people swarm him. Thank you for sharing. That was powerful. I walk past, give a noncommittal nod. Inside, I’m seething. Not at him. At myself. At the distance between what I know is true and what I’m willing to live.

    In the parking lot, my phone buzzes. Marcus again.

    How are you really?

    There’s that word. Really.

    I stand in the cold air, thumb hovering.

    I’m falling apart but pretending I’m not, I type. I delete it.

    I’m tired, I type. Delete.

    I settle on: I’m good. God’s got me.

    Even my lies are wrapped in Christianese.

    I don’t hit send yet. I stare at the blinking cursor. Beside me, a guy straps his toddler into a car seat, kisses his wife, laughs at something she says. Normal. Messy. Human.

    The phrase from the testimony loops in my head: Hiding was what was killing me. My secrets hardened my heart.

    I feel my own heart. Not metaphorically. Literally. My chest. It feels… hard. Numb. Like it should hurt more than it does.

    Do I want God that close? Close to the brokenhearted sounds nice until you realize it means you have to admit you’re brokenhearted. Not over business, not over some abstract injustice. Over your own life. Your own choices. Your own refusal to be weak.

    I could tell Marcus. Right now. I could say, “I’m not okay. Can we talk?” He’d answer. He’d show up. I know he would.

    Instead, I backspace my half-typed message.

    I send him a thumbs-up emoji.

    That’s my spiritual state in one tiny yellow hand.

    I get in my car, close the door, and the world goes quiet again. Just me, the dashboard, the buzz of the engine.

    I think about Psalm 34:18. I think about my mom in that hospital chair, whispering it over my dad. I think about Emily at the kitchen table, begging me to let her in. I think about Lily asking if I’m sad and promising she wouldn’t be scared.

    I think about the night on my knees by the couch, the fleeting sense that God was actually, tangibly near when I finally let something crack.

    And I think about how fast I slammed that door shut.

    That’s the thing no one tells you about vulnerability. You can get a glimpse of it, taste it for thirty seconds, and still decide you’d rather be alone in a locked room than risk anyone seeing you naked in your soul.

    So that’s where I am.

    In the car. In the locked room. Playing the part I’ve played my whole life.

    The rock.

    From the outside, I still look solid. Steady job. Decent clothes. Church attendance. A few Bible verses I can quote if needed. A daughter who still hugs me. A wife who hasn’t technically divorced me… yet.

    Inside, I know the truth.

    I’m not a rock. I’m a man-shaped shell built around a frightened kid who learned early that tears equal weakness and weakness equals rejection. I never unlearned it. I baptized it, gave it Bible verses, dressed it up in productivity and moral respectability.

    Maybe one day I’ll break for real. Call the counselor. Call Marcus. Call out to God and not shut Him down when He shows up. Maybe I’ll finally let someone see how much I’m not okay and discover that maybe—just maybe—weakness isn’t the end of my story but the door to something like real strength.

    But today?

    Today I turn the key in the ignition, watch my reflection in the rearview mirror as I back out. My face is calm. Controlled. Unreadable.

    Ask anyone who sees me drive away how I’m doing, and they’ll say the same thing.

    He’s good. He’s strong. He’s the rock.

    They’d be half right.

    The other half?

    The rock is crumbling. And I’m the only one who can hear it.

    Author’s Note

    I wrote this story because “I’m fine” has become one of the most dangerous lies men tell.

    Not because everything has to turn into a group-therapy overshare, but because a lot of us have learned that being a man means one thing above all: don’t crack. Don’t cry. Don’t need. Don’t ask for help. Just keep performing—at work, at home, at church—and hope nobody notices how much of it is duct tape and denial.

    Matt is fictional, but the patterns are not. The late-night anxiety. The quiet porn habit as a pressure valve. The marriage that looks stable from the outside but is running on fumes. The way “being strong” becomes a way to avoid being known. I didn’t want to write a neat testimony with a bow at the end. I wanted to sit in that awful in-between space where a man knows he’s not okay and still chooses to keep hiding.

    If you picked up on the tension around Psalm 34:18—“The Lord is close to the brokenhearted and saves those who are crushed in spirit”—that was intentional. The verse is there like a constant background noise in Matt’s life. He hears it from his mom, at church, in group, on his Bible app. The problem isn’t that God is silent; it’s that Matt refuses to be the kind of man that verse is written for: brokenhearted, crushed, honest.

    Underneath all the details, this story is about fear of vulnerability:

    • Fear of losing respect if you admit weakness
    • Fear of not knowing what to do with your own emotions if you stop stuffing them
    • Fear that if you open up to God or other men, you’ll be met with judgment or awkward silence instead of real presence

    The tragedy for Matt isn’t a dramatic car crash or public scandal. It’s the slow erosion of his soul and relationships because he clings to the image of “the rock” more than he clings to God or the people who actually love him. He gets glimpses of another way—a raw confession at men’s group, a quiet moment on the carpet where he finally lets himself cry, a daughter asking if he’s sad—and he still pulls back. That’s the haunting part. Nothing changes… and yet everything is slowly falling apart.

    If this story resonated with you at all, even uncomfortably, that’s kind of the point. Not to shame you, not to diagnose you, and definitely not to tell you what you “have to” do. Just to hold up a mirror of what it actually looks like when hiding becomes a lifestyle.

    Some men crash hard and obvious. Others, like Matt, just slowly harden. Their job title still works. Their faith still has all the right words. Their family still posts decent photos. But the inside is hollow. And the thing about hollowness is that it echoes. It haunts.

    The core idea behind this whole series is simple and costly: Vulnerability is not an optional add-on to the Christian life or to healthy masculinity. It’s the doorway. To real brotherhood. To actual intimacy in marriage. To a faith that’s more than performance. To experiencing the God who is “close to the brokenhearted,” not to the perfectly put-together.

    What you do with that is up to you. This story doesn’t end with Matt calling the counselor or breaking down in front of Marcus or sprinting back to Emily with a grand apology. It stops where a lot of men actually are: still in the car, still saying “I’m good,” still sending a thumbs-up emoji instead of telling the truth.

    If anything in you recognized yourself in that final scene, don’t rush past it. Sit with the discomfort. Ask yourself, honestly, where you’re playing “the rock” and what it’s costing you. And if you decide to talk to God, or to a friend, or to a counselor about it—that’s your story. Not Matt’s. And it doesn’t have to end the way his does.

    Call to Action

    If this story struck a chord, don’t just scroll on. Join the brotherhood—men learning to build, not borrow, their strength. Subscribe for more stories like this, drop a comment about where you’re growing, or reach out and tell me what you’re working toward. Let’s grow together.

    D. Bryan King

    Sources

    Disclaimer:

    The views and opinions expressed in this post are solely those of the author. The information provided is based on personal research, experience, and understanding of the subject matter at the time of writing. Readers should consult relevant experts or authorities for specific guidance related to their unique situations.

    Related Posts

    Rate this:

    #anxietyInChristianMen #authenticChristianMan #avoidingCounselingInMarriage #brokenheartedChristianMen #ChristianAuthenticity #ChristianBlogForMen #christianBlogSeriesForMen #christianFictionForMen #christianHusbandIssues #ChristianManStruggles #christianMarriageProblems #ChristianMasculinity #christianMenAndAnxiety #christianMenAndBrotherhood #christianMenAndCounseling #christianMenAndDepression #christianMenAndEmotions #christianMenAndPride #christianMenMentalHealth #christianMenSmallGroup #christianPornAddictionStory #ChristianPornStruggle #ChristianStorytellingForMen #churchCultureAndMasculinity #crushedInSpirit #doubleLifeChristianMan #emotionalIntimacyInMarriage #emotionallyDistantHusband #emotionallyNumbChristian #emotionallyUnavailableHusband #faithAndEmotionalHonesty #faithAndMentalHealth #fearOfExposingWeakness #fearOfVulnerability #godAndMaleWeakness #godCloseToTheBrokenhearted #grittyChristianStory #hidingBehindStrength #howHidingWeaknessHarmsMarriage #internalizedBeAMan #lordIsCloseToTheBrokenhearted #maleEmotionalRepression #maleFearOfShame #menAndVulnerability #menHidingWeakness #menSGroupHonesty #menSMinistryResources #psalm3418Meaning #rawChristianTestimonyStyle #realChristianManhood #realStrugglesChristianMenFace #secretSinChristian #silentSufferingMen #stopCryingBeAMan #strongButLonelyMan #toxicMasculinityInChurch #vulnerabilityInMarriage
  18. "The king of cool" moriva 30 anni fa. E a me piace ricordarlo non con un film o una canzone ma in occasione della reunion che fece col suo compare #JerryLewis per #Telethon (creazione di quest'ultimo) sotto l'egida di un tizio che masticava lo show-business come loro. E se non sapete di chi sto parlando.. peccato per voi - Invidious iv.duti.dev/watch?v=K3KAMg9LIzw

    @spettacoli

    #music #cinema #DeanMartin

  19. "PARdon me for my awkward interview" here are 7 tips & tricks I learned from meeting with CTOs.

    dev.to/jennjunod/pardon-me-for

    Thanks to Rick Manelius, PhD, Ed Frank, Dayal Gaitonde, Dawa Sherpa, and Randall Noval for the conversations and advice!

    #career #community #todayilearned #management #jobhunt

    #careercoaching #openforwork #openfornewopportunities #laidoff #unemployment #unemployed #interview #interviewtips #interviewing

  20. Passionate Lovers in the Dance Studio

    Take a look at this passionate portrait of lovers capturing a moment of intimacy in a warm and inviting dance studio, full of rich lighting and textured elements

    See More Seeds: aidyslexic.raupulus.dev/collec

    #StableDiffusion #ai #ArtificialIntelligence #lovers #dance-studio #passionate #portrait #intimacy #warmth #lighting #textured #Sergey-Katsuk

  21. Oggi, 29 settembre, il titolo della canzone del 1967 di Mogol-Battisti, portata al successo dall'Equipe 84


    «Lucio [Battisti ...] era nell'ufficio di Mogol che [...] s'era impegnato in una discussione sulla necessità di trovare nuovi temi e nuove forme da proporre nei versi. "Bisognerebbe" disse, "raccontare una vera e propria storia, magari partendo da una data che servisse a ricordarla, a suggerire una precisa atmosfera: 29 settembre, per esempio". "Forse" rispose Battisti, "io ho la musica adatta". E accennò al pianoforte un motivo che aveva preparato. Ne venne fuori, appunto, 29 settembre» (cit. da it.wikipedia.org/wiki/29_sette… attribuita al musicologo Salvatore Galeazzo Biamonte).

    Inizialmente Battisti pensava di interpretare il brano di persona:[14] infatti in quel periodo il musicista (appena agli inizi della carriera come cantante) stava iniziando a pensare alla pubblicazione di un nuovo singolo da interprete, che desse seguito al fiasco di Per una lira/Dolce di giorno con cui aveva debuttato nell'anno precedente. Allo scopo, Battisti e Mogol fecero ascoltare il brano (ancora privo di titolo) a Mariano Detto, chiedendogli di realizzare un arrangiamento; quest'ultimo ne intuì immediatamente le potenzialità e si mise subito al lavoro.

    La canzone arrivò all'orecchio di Maurizio Vandelli, leader dell'Equipe 84 (nell'immagine sopra), che capì di trovarsi di fronte a un potenziale successo: iniziò a fare pressioni su Mogol e Battisti perché cedessero il brano all'Equipe. Vandelli ha più volte dichiarato di aver sempre sentito "sua" la canzone, come se fosse una propria creazione.

    L'Equipe 84 era all'epoca all'apice della popolarità,essere autore di una canzone cantata dall'Equipe avrebbe dato a chiunque grande rilievo. Così Battisti rinunciò ad interpretarla personalmente e acconsentì a cederla.
    (adattato da it.wikipedia.org/wiki/29_sette…)

    Il brano nella versione di Lucio Battisti, co-autore
    iv.duti.dev/watch?v=adL5UjwDTH…

    #29Settembre
    #storiadellamusica
    #battisti
    #mogol
    #equipe84
    #unomusica

    @storia

  22. Wikidata is a good service, Wikibase (on which Wikidata is built) is a better platform.

    I have spoken before about its potential to be added into the file-format registry ecosystem in a federated model.

    If we are to use it as a registry that can perhaps complement the pipelines going into PRONOM, e.g. in vendor’s digital preservation platforms such as the Rosetta Format Library, a Wikidata should be able to output different serializations of signature file for tools such as Siegfried, DROID or FIDO.

    And what about DROID?

    Conversion to DROID

    It’s not straightforward to say to a Wikibase/Wikidata Query Service, “output XML in the shape of a DROID signature file”, but it is straightforward to write a converter script.

    I had this very thought last week while presenting with colleagues at a File Format Workshop at iPRES in Ghent.

    It dawned on me that the conversion script would actually be simple thanks to a change in format to DROID whereby it can process all its own signatures, where previously it required DROID to pre-process them. It’s a long story, a more simple rendition is that DROID no longer requires DROID byte-code to record information about an identification pattern, and can instead store signatures in the attribute of a byte sequence element as-is, i.e. a PRONOM formatted regular expression from PRONOM itself, or Wikidata.

    This realization resulted in my writing a conversion script (it took just over a half-day) during some down-time on the train home this past weekend.

    The script is called wddroidy (after WD-40 🙄🥁) and can be found here.

    Results

    We can see using the skeleton suite from Richard Lehane’s Builder that we can positively identify files using the new signature file.

    Links can also be made to work with Wikidata identifiers by modifying the PUID URL pattern in the DROID configuration, e.g. to:

    http://wikidata.org/entity/%s

    The screenshot below shows where in the dialog that setting is:

    Reference signature file

    A reference signature file can be found in the wddroidy repository here. There are approximately 8119 file formats listed and 8195 file format signatures for those.

    NB. We know there are different issues with Wikidata including how to identify a “format” and the quality of the signatures. We capture some of these in a global repository: https://github.com/ffdev-info/wikidp-issues/issues

    DROID simplified format

    The real headline here might be how easy it was to create the output using the DROID simplified format.

    I have spoken about it briefly before but not in any detail.

    In-short DROID no longer uses its own byte-code encoding that included strange terms such as DefaultShift, Shift Byte, and SubSequence (instructions to DROID about how to perform Boyer Moore Horspool search). See below and note especially how the bytes are split in Shift Byte attributes and elements:

    <?xml version="1.0" encoding="UTF-8"?><FFSignatureFile xmlns="http://www.nationalarchives.gov.uk/pronom/SignatureFile" Version="1" DateCreated="2024-09-23T18:16:09+00:00">  <InternalSignatureCollection>    <InternalSignature ID="1" Specificity="Specific">      <ByteSequence Reference="BOFoffset">        <SubSequence MinFragLength="0" Position="1" SubSeqMaxOffset="0" SubSeqMinOffset="0">          <Sequence>255044462D312E34</Sequence>          <DefaultShift>9</DefaultShift>          <Shift Byte="25">8</Shift>          <Shift Byte="50">7</Shift>          <Shift Byte="44">6</Shift>          <Shift Byte="46">5</Shift>          <Shift Byte="2D">4</Shift>          <Shift Byte="31">3</Shift>          <Shift Byte="2E">2</Shift>          <Shift Byte="34">1</Shift>        </SubSequence>      </ByteSequence>    </InternalSignature>  </InternalSignatureCollection>  <FileFormatCollection>    <FileFormat ID="1" Name="Development Signature" PUID="dev/1" Version="1.0" MIMEType="application/octet-stream">      <InternalSignatureID>1</InternalSignatureID>      <Extension>ext</Extension>    </FileFormat>  </FileFormatCollection></FFSignatureFile>

    The updated format was made possible via Matt Palmer via his ByteSeek work, and can now except a regularly encoded PRONOM formatted regular expression (regex) in an attribute in the ByteSequence element. See here for a signature file equivalent to the above:

    <?xml version="1.0" encoding="UTF-8"?><FFSignatureFile      xmlns="http://www.nationalarchives.gov.uk/pronom/SignatureFile" Version="1" DateCreated="2024-09-23T18:16:09+00:00">  <InternalSignatureCollection>    <InternalSignature ID="1" Specificity="Specific">      <ByteSequence Reference="BOFoffset" Sequence="255044462D312E34" Offset="0" />    </InternalSignature>  </InternalSignatureCollection>  <FileFormatCollection>    <FileFormat ID="1" Name="Development Signature" PUID="dev/1" Version="1.0" MIMEType="application/octet-stream">      <InternalSignatureID>1</InternalSignatureID>      <Extension>ext</Extension>    </FileFormat>  </FileFormatCollection></FFSignatureFile>

    The format is much easier to read, and after a bit of time sitting with the DROID signature file format you realize it is fairly easy to output as well. I use some very rudimentary templates in wddroidy using  Python’s f-strings.

    It means other sources of PRONOM encoded signatures can output much simpler signature files and they can be used by DROID. I myself need to add it to the signature development utility – this would allow the utility to run standalone on anyone’s PC.

    One next step for this approach might be to confirm that it does work entirely as expected by extracting all of PRONOM’s signatures proper and performing a mapping to the simplified format – if we can match against all the skeleton files in the latest Builder release then we should be looking good!

    Priorities

    I am always reminded, but always forget about priorities! This is part of how DROID resolves a file format into a single identifier, e.g. where SVG can match XML, we often want the more specific format returned, and so a priority is used to prioritize that one over the other, resulting in a single unambiguous identification for the DROID user. It manifests in the signature file as:

    <FileFormat ID="634" MIMEType="image/svg+xml" Name="Scalable Vector Graphics"PUID="fmt/91"Version="1.0">   <InternalSignatureID>24</InternalSignatureID>   <Extension>svg</Extension>   <HasPriorityOverFileFormatID>638</HasPriorityOverFileFormatID> </FileFormat> More work needs to be done with Wikidata to understand if priorities can be properly applied to a DROID signature file. They are not written into the reference signature file above.

    Using the results

    Using the results can be done for two things:

    1. (Probably) There are a greater number of patterns in the Wikidata output than in PRONOM. If you have a file that remains unidentified, you can try the reference file for clues as to what it may be. I’d only use caution and investigate the exact byte sequence used for a match and understand its properties. I’d also check that the mapping also looks accurate, I’ve tried one or two runs using the identifier and it looks good, but there may still be mistakes.
    2. For improving the quality of the sources in Wikidata. As you can see from the Skeleton suite there are a lot of gaps. We a) have a rough idea what these are, and b) know the identification doesn’t work via Wikidata. Why is that? Is the signature in Wikidata simply not good enough? Are patterns missing? Is there another error or issue we can help with given our expertise in file format identification?

    Hacking wddroidy

    You can hack wddroidy. Currently it allows you to limit the number of results returned, and also modify the ISO language code used by the tool. You can see this in the command line arguments:

    python wddroidy.py --helpusage: wddroidy [-h] [--definitions DEFINITIONS] [--wdqs] [--lang LANG] [--limit LIMIT] [--output OUTPUT] [--output-date] [--endpoint ENDPOINT]create a DROID compatible signature file from Wikidataoptions: -h, --help show this help message and exit --definitions DEFINITIONS   use a local definitions file, e.g. from Siegfried --wdqs, -w live results from Wikidata --lang LANG, -l LANG change Wikidata language results --limit LIMIT, -n LIMIT   limit the number of resukts --output OUTPUT, -o OUTPUT   filename to output to --output-date, -t output a default file with the current timestamp --endpoint ENDPOINT, -url ENDPOINT   url of the WDQSfor more information visit https://github.com/ross-spencer/wddroidy

    The actual SPARQL query used can be manually edited in the src folder. E.g. you can limit the query by format or family or classification. I provide some more inspiration in the Siegfried Wiki.

    Let me know if it’s useful!

    This is really just a quick hack and it needs a lot more testing to improve the quality of the output. Most can be dealt with on the Wikidata side I am sure, but some might need to be done in the tool. If it’s useful, reach out, and let’s discuss what can be changed or how it can be used in your work.

    Data quality

    It will quickly become apparent the data quality isn’t what it is with PRONOM and that is why a curated and authoritative service such as PRONOM is always going to be needed. As mentioned in previous talks, this can in theory be complemented with downstream data in federated databases. This might mean curating Wikidata better using some of the tools available, or curating data into a Wikibase (the platfom Wikidata is built upon). Both options bring different benefits and advantages such as creating a bigger tent of signature developers on Wikidata, or, another example, more expressive signatures being made available via federated Wikibases.

    And a word on Wikiba.se

    A reminder too, that setting up a Wikibase can take some effort (I was once running three at the same time 😬) but a service called https://wikiba.se/ exists. wikiba.se could form an excellent scratch pad to begin thinking about mapping PRONOM like data to a Wikibase and also begin solving some of the other issues around mapping container signatures and outputting those in a way that is compatible for DROID. Let me know if you give it a whirl, or want to collab on any of that.

    Otherwise, thanks in advance! And enjoy wddroidy!

    https://exponentialdecay.co.uk/blog/making-droid-work-with-wikidata/

    #Code #Coding #digipres #DigitalPreservation #DROID #FileFormat #FileFormats #OpenData #PRONOM #siegfried #SoftwareDevelopment #wikidata

  23. #dischibelli 1 - È uscito finalmente "In fatti ostili" dei #DeltaV, a 6 anni di distanza dall'ultimo LP. "Regole a Milano" è il singolo di lancio e a chi c'era qualche anno fa scenderà una lacrimuccia guardando il video, riconoscendo spazi che non ci sono più. Loro non mi deludono mai. iv.duti.dev/watch?v=FAIcsEZzwHc

    @spettacoli

    #UnoRadio #music #electronic #Milano

  24. Lucee in a Box: The Ultimate Guide to Containerized Dev Servers

    2,726 words, 14 minutes read time.

    The Modern ColdFusion Workspace: Transitioning to Lucee in a Box

    The shift from traditional, monolithic server installations to containerized environments has fundamentally altered how we perceive modern development within the Lucee ecosystem. For years, the standard approach involved installing a heavy application server directly onto a local machine, often leading to a “polluted” operating system where various versions of Java and Lucee competed for resources and environment variables. By adopting a “Lucee in a Box” methodology, we decouple the application logic from the underlying hardware, allowing for a portable, reproducible, and lightweight development stack. This transition is not merely about convenience; it is a strategic move toward parity with production environments where high availability and rapid scaling are the norms. In this architecture, we utilize Docker to encapsulate the Lucee engine, the web server, and the necessary configuration files into a single unit that can be spun up or destroyed in seconds, ensuring that every member of a development team is working within an identical, script-driven environment.

    However, the true complexity of this setup emerges when we move beyond simple “Hello World” examples and begin integrating with the existing corporate infrastructure. In my own workflow, I rely heavily on a network of internal web services that act as the primary conduit for data residing in our production databases. These services are vital because they provide a sanitized, governed layer of abstraction over raw SQL queries, ensuring that sensitive data is handled according to internal compliance standards. When we containerize Lucee, we aren’t just running a script; we are placing a small, isolated node into a complex network. The challenge then becomes ensuring this isolated container can “see” and communicate with those internal services as if it were a native part of the network, all while maintaining the security boundaries that containerization is designed to provide.

    The Data Silo Crisis: Overcoming Networked Service Isolation

    One of the most significant hurdles in modernizing a CFML stack is the inherent isolation of the Docker bridge network, which often creates what I call a “Data Silo” during local development. When a developer attempts to call an internal web service—perhaps a REST API that fetches real-time production metrics or user permissions—from within a container, the request often hits a wall because the container’s internal DNS does not naturally resolve local intranet addresses. This creates a frustrating disconnect where the application works perfectly in the legacy local install but fails within the containerized environment. This disconnect is more than a minor annoyance; it leads to significant delays in the development lifecycle as engineers struggle to pipe in the data necessary for testing complex business logic. Without a seamless connection to these internal services, the “Lucee in a Box” becomes an empty vessel, incapable of performing the data-intensive tasks required in a modern enterprise setting.

    To resolve this, we must look at how the container perceives the outside world and how the host machine facilitates that visibility. In many corporate environments, production data is guarded behind strict firewall rules and SSL requirements that expect requests to originate from known entities. When I utilize internal web services to provide data from a production database, the Lucee container must be configured to pass through the host’s network or be explicitly granted access to the internal DNS suffixes. Failure to address this at the architectural level results in “unreachable host” errors or SSL handshake failures that can derail a project for days. By understanding that the container is a guest on your network, we can begin to implement the routing and trust certificates necessary to turn that siloed container into a fully integrated node capable of consuming live data streams securely and efficiently through modern CFScript syntax.

    The Blueprint: Implementing Lucee and MariaDB via Docker Compose

    To move from theory to implementation, we must define the orchestration layer that brings our environment to life. The docker-compose.yml file is the definitive source of truth for the development stack, eliminating the “it works on my machine” excuse by codifying the server version, database configuration, and network paths. In the professional workflow I advocate, this file sits at the root of your project. It defines a lucee service using the official Lucee image—optimized for performance—and a mariadb service to handle local data persistence. Crucially, we use volumes to map your local www folder directly into the container’s web root. This means that as you write your CFScript in your preferred IDE on your host machine, the changes are reflected instantly inside the container without requiring a rebuild or a manual file transfer.

    The following configuration provides a professional-grade starting point. It establishes a dedicated network for our services and ensures that Lucee has the environment variables necessary to eventually automate its datasource connections. By mounting the ./www directory, we ensure our code remains on our host machine where it can be version-controlled, while the ./db_data volume ensures our MariaDB data persists even if the container is destroyed and recreated.

    version: '3.8'
    
    services:
      # The Database Engine
      mariadb:
        image: mariadb:10.6
        container_name: lucee_db
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: root_password
          MYSQL_DATABASE: dev_db
          MYSQL_USER: dev_user
          MYSQL_PASSWORD: dev_password
        volumes:
          - ./db_data:/var/lib/mysql
        networks:
          - dev_network
    
      # The Lucee Application Server
      lucee:
        image: lucee/lucee:5.3
        container_name: lucee_app
        restart: always
        ports:
          - "8080:8888"
        environment:
          # Injecting DB credentials for CFConfig or Application.cfc
          - DB_HOST=mariadb
          - DB_NAME=dev_db
          - DB_USER=dev_user
          - DB_PASSWORD=dev_password
          - LUCEE_ADMIN_PASSWORD=server_admin_pass
        volumes:
          - ./www:/var/www
          - ./config:/opt/lucee/web
        depends_on:
          - mariadb
        networks:
          - dev_network
    
    networks:
      dev_network:
        driver: bridge
    

    Deployment Strategy: Running Your New Containerized Stack

    Once the docker-compose.yml file is in place, initializing the environment is a matter of a single terminal command. By executing docker-compose up -d from the root of your project directory, the Docker engine pulls the specified images, creates the isolated virtual network, and establishes the volume mounts. This process ensures that your MariaDB instance is ready to receive connections before the Lucee server fully initializes. For developers who rely on internal web services, this is where the containerized approach proves its worth. Because Lucee is running in an isolated network but can be configured to have access to the host’s bridge or external DNS, it can safely consume external APIs while maintaining a clean, local database for session state or cached production data. This setup provides the exact same architectural “feel” as a high-traffic production cluster, but contained entirely within your local hardware.

    The beauty of this system lies in its maintenance-free nature and the elimination of the “dependency hell” that often plagues legacy ColdFusion developers. If you need to test your CFScript against a different version of Lucee or a newer patch of MariaDB, you simply update the version tag in the YAML file and run the command again. There is no need to uninstall software, clear registry keys, or worry about Java version conflicts on your host machine. This modularity is why I utilize internal web services to provide data from production into this local box; the container acts as a secure, high-speed proxy. You can pull the data you need via an internal API call, store it in the MariaDB container, and work in an isolated state without ever risking the integrity of the actual production database.

    Root Cause: Why Standard Containers Fail at Internal Service Integration

    The primary reason most off-the-shelf Lucee container configurations fail when attempting to consume internal web services is a fundamental lack of trust—specifically, the absence of internal SSL certificates within the Java KeyStore. When I use web services hosted within my network to provide data from a production database, those services are almost always secured via an internal Certificate Authority (CA) that is not recognized by the default OpenJDK installation inside the Lucee container. This results in the dreaded “PKIX path building failed” error the moment a cfhttp call is initiated via CFScript to an internal endpoint. To solve this, the Dockerfile must be modified to perform a “copy and import” operation during the image build phase, where the internal CA certificate is added to the Java security folder and registered using the keytool utility. This ensures that the underlying Java Virtual Machine (JVM) trusts the internal network’s identity, allowing for encrypted, secure data transmission from the production-proxy services to the local development environment.

    Beyond the cryptographic hurdles, there is the issue of routing and “Host-to-Container” communication that often stymies developers new to the Docker ecosystem. In a standard Docker setup, the container is wrapped in a layer of Network Address Translation (NAT) that makes it difficult to reach services sitting on the developer’s physical host or the wider corporate VPN. To bridge this gap, we often utilize the extra_hosts parameter within our docker-compose configuration, which effectively injects entries into the container’s /etc/hosts file. This allows us to map a friendly internal domain name, like services.internal.corp, directly to the IP address of the host machine or the VPN gateway. By explicitly defining these routes, we bypass the limitations of Docker’s isolated bridge and enable the Lucee engine to reach out to the web services that house our production data. This architectural “handshake” between the containerized Lucee instance and the physical network is the secret sauce that transforms a basic dev box into a high-fidelity replica of the production ecosystem.

    Deep Dive: Consuming Internal Web Services via CFScript

    With the network and security infrastructure in place, we can finally focus on the implementation layer: the CFScript that handles the data exchange. In a modern Lucee in a Box setup, I favor a service-oriented architecture where a dedicated DataService.cfc handles all interactions with the internal network. Using the http service in CFScript, we can construct requests that include the necessary authentication headers, such as JWT tokens or API keys, required by the internal production data services. The beauty of this approach is that the CFScript remains agnostic of the container’s physical location; as long as the Docker networking layer is correctly mapping the service URL to the internal network, the cfhttp call proceeds as if it were running on a native server. This allows us to maintain a clean, readable codebase that utilizes the latest CFScript features, such as cfhttp(url=targetURL, method="GET", result="local.apiResponse"), while the heavy lifting of network routing is handled by the Docker daemon.

    The real power of this integration is realized when we use these internal web services to populate our local MariaDB instance with a “snapshot” of production-like data. Rather than dealing with massive, cumbersome database dumps that can compromise data privacy, we can write an initialization script in CFScript that queries the internal web services for the specific datasets required for a given task. This script can then parse the returned JSON and perform a series of queryExecute() commands to populate the local MariaDB container. This “just-in-time” data strategy ensures that the developer is always working with relevant, fresh data without the security risks associated with a direct connection to the production database. By leveraging the containerized Lucee instance as a smart bridge between internal network services and local storage, we create a development environment that is not only isolated and secure but also incredibly data-rich and performant.

    Environment Variable Injection: The CFConfig and CommandBox Synergy

    To achieve a truly “hands-off” configuration within a Lucee in a Box environment, we must move away from the manual web-based administrator and toward a purely scripted setup. This is where the combination of CommandBox and the CFConfig module becomes indispensable. By using a .cfconfig.json file or environment variables prefixed with LUCEE_, we can define our MariaDB datasource connections, internal web service endpoints, and mail server settings without ever clicking a button in the Lucee UI. In a professional workflow, this means the docker-compose.yml file serves as the master controller, injecting credentials and network paths directly into the Lucee engine at runtime. For instance, by setting LUCEE_DATASOURCE_MYDB as an environment variable, the containerized engine automatically constructs the connection to the MariaDB container, ensuring that our CFScript-based queryExecute() calls have a reliable target the moment the server is healthy.

    This approach is particularly powerful when dealing with the internal web services that provide our production data. Since these services often require specific API keys or internal proxy settings, we can store these sensitive values in an .env file that is excluded from our Git repository. When the container starts, these values are mapped into the Lucee process, allowing our CFScript logic to access them via system.getEnv(). This ensures that our local development environment remains a mirror of our production logic while maintaining a strict separation of concerns between the application code and the infrastructure-specific secrets. By automating the configuration layer, we eliminate the risk of manual setup errors and ensure that every developer on the team can spin up a fully functional, networked-aware Lucee instance in a single command.

    Advanced Networking: Bridged Access to Production-Proxy Services

    The final piece of the Lucee in a Box puzzle involves fine-tuning the Docker network to handle the high-latency or high-security requirements of internal web services. When our CFScript makes a request to a service that pulls from a production database, we are often traversing multiple layers of internal routing, including VPNs and load balancers. To optimize this, we can configure our Docker bridge network to use specific MTU (Maximum Transmission Unit) settings that match our corporate network’s infrastructure, preventing packet fragmentation that can lead to mysterious request timeouts. Furthermore, by utilizing Docker’s aliases within the network configuration, we can simulate the production URL structure locally. This means our CFScript can call https://api.internal.production/ both in the dev container and the live environment, with Docker handling the redirection to the appropriate internal service endpoint based on the environment context.

    Beyond simple connectivity, we must also consider the performance of these data-heavy web service calls. In a containerized environment, I often implement a caching layer within Lucee that stores the JSON payloads returned from our internal services into the local MariaDB instance or a RAM-based cache. By using CFScript’s cachePut() and cacheGet() functions, we can significantly reduce the load on our internal network and the production database proxy. This “lazy-loading” strategy allows us to develop complex features with the speed of local data access while still maintaining the accuracy of production-sourced information. This architectural decision—balancing live service integration with local persistence—represents the pinnacle of the Lucee in a Box philosophy, providing a development experience that is as fast as it is faithful to the real-world environment.

    Conclusion: The Future of Scalable CFML Development

    Adopting a “Lucee in a Box” strategy is more than just a trend in containerization; it is a fundamental shift toward professional-grade, reproducible engineering. By strictly defining our environment through docker-compose.yml, automating our security through SSL injection in the Dockerfile, and utilizing CFScript to bridge the gap between internal web services and local MariaDB storage, we create a stack that is resilient to “configuration drift.” This setup allows us to treat our development servers as ephemeral, disposable assets that can be rebuilt at a moment’s notice to match evolving production requirements. As the Lucee ecosystem continues to mature, the ability to orchestrate these complex data flows within a containerized boundary will remain the hallmark of a high-performing development team, ensuring that we spend less time debugging infrastructure and more time writing the logic that drives our applications forward.

    Call to Action


    If this post sparked your creativity, don’t just scroll past. Join the community of makers and tinkerers—people turning ideas into reality with 3D printing. Subscribe for more 3D printing guides and projects, drop a comment sharing what you’re printing, or reach out and tell me about your latest project. Let’s build together.

    D. Bryan King

    Sources

    Disclaimer:

    The views and opinions expressed in this post are solely those of the author. The information provided is based on personal research, experience, and understanding of the subject matter at the time of writing. Readers should consult relevant experts or authorities for specific guidance related to their unique situations.

    Related Posts

    Rate this:

    #APIAuthentication #Automation #backendDevelopment #BridgeNetwork #cacerts #CFConfig #CFML #cfScript #CICD #CloudNative #Coldfusion #CommandBox #ConfigurationDrift #containerization #DataIntegration #DatabaseMigration #DatabaseProxy #DeepDive #deployment #devops #Docker #DockerCompose #EnterpriseDevelopment #environmentVariables #InfrastructureAsCode #InternalAPIs #ITInfrastructure #JavaKeyStore #JSON #JVM #JWT #localDevelopment #Lucee #LuceeInABox #MariaDB #microservices #Networking #OpenJDK #OrtusSolutions #Persistence #PortForwarding #Portability #ProductionData #ReproducibleEnvironments #RESTAPI #scalability #Scripting #SDLC #SecureDevelopment #softwareArchitecture #SQL #SSLCertificates #TechnicalGuide #Volumes #WebApplication #WebServer #WebServices #WorkflowOptimization
  25. In today's #ConnectionList #Introduction #Introduction #FollowFriday, where I use my large following to more richly connect the #Fediverse :fediverse: please meet:

    @nedcpr is Ned Cooper, and he is my #PhD colleague at the #ANU School of #Cybernetics - he's running a #survey at the moment - see hci.social/@nedcpr/11014657837 for more - especially if you use #ChatGPT

    @davidschlangen is a #Professor of #ComputationalLinguistics at #UniPotsdam in #Germany 🇩🇪 His paper "Targeting the benchmark" is really important for me - arxiv.org/abs/2007.04792

    @letsencrypt is the official #Mastodon account for Let's Encrypt, which provides https certificates - that provides SSL for web servers (also vale Peter Eckersley / pde)

    @horms is a #Linux #kernel dev, who focuses on networks and #NICS. 🔌

    @osuosl is the #OpenSource #Lab at #OregonStateUniversity - they providing #hosting for a bunch of #FOSS and #FLOSS projects