<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Dataneard on Medium]]></title>
        <description><![CDATA[Stories by Dataneard on Medium]]></description>
        <link>https://medium.com/@calebjephuneh?source=rss-ef02b8e69895------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*XCn8yx_cyNVSRN5oJ8Z7nw.jpeg</url>
            <title>Stories by Dataneard on Medium</title>
            <link>https://medium.com/@calebjephuneh?source=rss-ef02b8e69895------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 08 Apr 2026 04:38:38 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@calebjephuneh/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Verse of the Week]]></title>
            <link>https://medium.com/@calebjephuneh/verse-of-the-week-bfc7dc624e4c?source=rss-ef02b8e69895------2</link>
            <guid isPermaLink="false">https://medium.com/p/bfc7dc624e4c</guid>
            <dc:creator><![CDATA[Dataneard]]></dc:creator>
            <pubDate>Sun, 22 Feb 2026 21:37:04 GMT</pubDate>
            <atom:updated>2026-02-22T21:37:04.655Z</atom:updated>
            <content:encoded><![CDATA[<p>My mum gave me a verse at the start of the year that I want to share with you:</p><p>Isaiah 60:10–11</p><p>“Foreigners will rebuild your walls, and their kings will serve you. Although I struck you in anger, yet in favour I will show you mercy. <strong>11 Your gates will always stand open; they will never be shut, day or night, so that the wealth of the nations may be brought to you, with their kings being led in procession.</strong>”</p><p>Happy New week!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bfc7dc624e4c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Go to Market NOW!!!]]></title>
            <link>https://medium.com/@calebjephuneh/go-to-market-now-ba0c30be5f06?source=rss-ef02b8e69895------2</link>
            <guid isPermaLink="false">https://medium.com/p/ba0c30be5f06</guid>
            <category><![CDATA[enterprise-technology]]></category>
            <category><![CDATA[launch]]></category>
            <category><![CDATA[entrepreneurship]]></category>
            <dc:creator><![CDATA[Dataneard]]></dc:creator>
            <pubDate>Fri, 30 Jan 2026 08:44:02 GMT</pubDate>
            <atom:updated>2026-01-30T08:44:02.841Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*L4MS8SjQFre8Qylz" /></figure><p>Founders should get their product in front of customers as fast as possible, even if it’s imperfect. The purpose of raising investment is not to start building the product, but to accelerate something that is already showing real momentum.</p><p>When customers are actively trying, using, or even struggling with a rough version of your product, it signals urgency. It shows that the problem is real, the solution is needed now, and people are willing to engage despite the product being “shabby.”</p><p>That urgency is what makes investors pay attention. They’re not betting on a polished interface; they’re betting on demand and velocity.</p><p><strong>Shipping early does three critical things: <br></strong>— It validates whether your idea is solving a real problem or just a compelling story in your head. <br>— It creates momentum through early usage, feedback, and iteration. <br>— It makes your startup investable by proving there is a path to a real go-to-market motion.</p><p>If you wait to make the product “perfect,” you delay learning and you delay proof of demand. A rough product in the hands of real users is far more valuable than a beautiful product with no customers.</p><p>Investors don’t invest in ideas alone. <br>They invest in evidence: <br>— Evidence that a problem exists <br>— Evidence that people care <br>— Evidence that there is traction, urgency, and a clear path to market</p><p>Getting your product out early is how you turn a belief into a business and an idea into something investable.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ba0c30be5f06" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[True]]></title>
            <link>https://medium.com/@calebjephuneh/true-40537a1ddac0?source=rss-ef02b8e69895------2</link>
            <guid isPermaLink="false">https://medium.com/p/40537a1ddac0</guid>
            <dc:creator><![CDATA[Dataneard]]></dc:creator>
            <pubDate>Wed, 28 Jan 2026 08:30:16 GMT</pubDate>
            <atom:updated>2026-01-28T08:30:16.794Z</atom:updated>
            <content:encoded><![CDATA[<h3>True Story</h3><p>Someone once told me my life seemed boring because of all my routines and discipline. But to me, these very habits are the reason I thrive. They are acts of self-respect, the backbone of my ethics, and the reason I am selective. Discipline doesn’t restrict me; it empowers me.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=40537a1ddac0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sales Sales Sales]]></title>
            <link>https://medium.com/@calebjephuneh/sales-sales-sales-e218194d125d?source=rss-ef02b8e69895------2</link>
            <guid isPermaLink="false">https://medium.com/p/e218194d125d</guid>
            <category><![CDATA[enterpreneurship]]></category>
            <category><![CDATA[sales]]></category>
            <dc:creator><![CDATA[Dataneard]]></dc:creator>
            <pubDate>Wed, 28 Jan 2026 08:25:11 GMT</pubDate>
            <atom:updated>2026-01-28T08:25:11.524Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/420/0*0pf_NUg-PnmWKuK7.png" /></figure><p>Some founders will do literally anything… except sales.</p><p>They’ll:</p><p>- Build the product for the 1000th time</p><p>- Redesign the landing page (again)</p><p>- Do more market research</p><p>- Ask ChatGPT for positioning, ICPs, taglines, objections, counter-objections</p><p>- Raise money</p><p>- Pitch VCs</p><p>- Pitch again</p><p>But actually go sell?</p><p>Absolutely not.</p><p>Sales is awkward.</p><p>Sales involves hearing “no.”</p><p>Sales risks discovering the product isn’t as brilliant as we hoped.</p><p>So we stay busy instead.</p><p>Product work feels noble.</p><p>Research feels responsible.</p><p>Fundraising feels prestigious.</p><p>Sales feels… personal.</p><p>And yes…fear of rejection is definitely part of it.</p><p>Not rejection of the product.</p><p>Rejection of you.</p><p>The irony?</p><p>You’ll happily get rejected by 97 VCs…</p><p>…but avoid 10 customer conversations like it’s emotional lava.</p><p>If you’re avoiding sales, it’s not a strategy problem.</p><p>It’s an identity problem.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e218194d125d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Psychology Behind Phone Addiction]]></title>
            <link>https://medium.com/@calebjephuneh/the-psychology-behind-phone-addiction-e294b15fb499?source=rss-ef02b8e69895------2</link>
            <guid isPermaLink="false">https://medium.com/p/e294b15fb499</guid>
            <dc:creator><![CDATA[Dataneard]]></dc:creator>
            <pubDate>Fri, 09 Jan 2026 07:57:45 GMT</pubDate>
            <atom:updated>2026-01-09T07:57:45.538Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*4zQju3oDNfk2fDoF.jpeg" /></figure><p>let me tell you about a little story from about 8 months ago.</p><p>i’m sitting across from my friend at a coffee shop after she came back from her vacation.</p><p>she’s telling me about this trip she took to iceland. waterfalls, northern lights, the whole thing.</p><p>i’m nodding along, showed interest, asking questions. you know what people normally do during a conversation right.</p><p>but halfway through her story, i realize i haven’t actually heard a single word she’s said for the last two minutes.</p><p>because i’ve been thinking about my phone. it’s in my pocket. i can’t see it. but i can feel it.</p><p>before she really started breaking down her trip, i heard a ping and felt that pull. that magnetic draw. that quiet voice saying “check me, something might be there.”</p><p>i catch myself reaching for it mid-conversation. stop myself. put my hand back down.</p><p>five minutes later, i’m doing it again.</p><p>my friend doesn’t notice. or maybe she does and she’s used to it. we all do this now.</p><p>we’re present but not really. here but somewhere else. listening but not hearing.</p><p>and i’m thinking, when the fuck did this happen? when did a device become more interesting than a real person sitting in front of me?</p><p>when did my brain start preferring the possibility of a notification over an actual human connection?</p><p>when did i lose the ability to just… be present?</p><p>8 months ago that’s all i could think</p><p>i remember being a kid and getting completely absorbed in things. building lego for hours, lost in it. reading books and forgetting time existed. having conversations that felt infinite.</p><p>i remember when the world felt vivid. when colors seemed brighter, when experiences felt fuller, when moments stretched out instead of blurring together.</p><p>somewhere between then and now, something changed.</p><p>and i blamed it on growing up. on responsibilities. on “that’s just life.”</p><p>but sitting there, fighting the urge to check my phone while my friend talks about fucking waterfalls, i realize: it’s not life. it’s the device.</p><p>my brain had been hijacked. rewired. reprogrammed to prefer digital stimulation over reality.</p><p>and i knew i wasn’t alone with that feeling. i knew people felt it. i know you feel it too.</p><p>that constant low-level anxiety when your phone isn’t within reach. that compulsion to check it even when you know there’s nothing there. that sense that real life has become somehow… less.</p><p>less interesting. less colorful. less engaging than the little glowing rectangle.</p><p>fast forward 8 months later, and the spark in me has been reignited. after countless hours of research and endless motivation to get to the bottom of this, i found it.</p><p>so let me break down exactly what’s happened to your brain, why you can’t stop, and what it’s costing you.</p><p>a cup of black coffee sitting next to me. in this 10 minute read i will fundamentally change how you see your phone forever, and maybe, just maybe i can help you beat your addiction. i’m not promising but reading this will definitely be a nudge in the right direction.</p><p>let’s get into this.</p><h3>THE SLOT MACHINE IN YOUR POCKET</h3><p>“Technology is a useful servant but a dangerous master.” — Christian Lous Lange</p><p>your phone is a casino.</p><p>and you’re the gambler who can’t leave the table.</p><p>every time you pick it up, you’re pulling a lever on a slot machine. will there be a notification? a like? a message? something interesting?</p><p>what’s going to spike my dopamine now?</p><p>you don’t know. and that uncertainty is what makes it addictive.</p><p>this is called a variable ratio reward schedule, and it’s the most addictive reinforcement pattern known to psychology.</p><p>slot machines use it. so do phones.</p><p>you pull the lever (unlock your phone) and sometimes you get a reward (notification, interesting content) and sometimes you don’t (nothing new).</p><p>but because you can’t predict when the reward will come, you keep checking.</p><p>because the next check might be the one. the next refresh might have something.</p><p>your brain releases dopamine not just when you get the reward, but in anticipation of potentially getting it.</p><p>and that anticipation keeps you hooked.</p><p>here’s the neurology: your ventral tegmental area (VTA) releases dopamine when you anticipate reward.</p><p>this dopamine travels to your nucleus accumbens, which processes reward and motivation.</p><p>when the reward is uncertain, dopamine release is actually higher than when it’s guaranteed.</p><p>uncertainty creates more craving than certainty.</p><p>this is why you can’t stop checking your phone even when you consciously know there’s probably nothing there.</p><p>your brain is chasing the dopamine hit from the possibility of a reward.</p><p>and tech companies know this. they engineer it deliberately.</p><p>infinite scroll means there’s always potentially something interesting just one more swipe away.</p><p>variable notification timing means you never know when something will come in, so you have to keep checking.</p><p>the red notification badge creates urgency and triggers checking behavior.</p><p>pull-to-refresh mimics the physical action of a slot machine lever.</p><p>every element is designed to exploit your dopamine system and keep you engaged.</p><p>you’re not weak for being addicted. you’re up against billions of dollars of neuroscience research optimized to hijack your brain.</p><p>social media has perfected this with it’s short form content algorithm. just know if something is free, you are usually the product.</p><h3>THE HYPERSTIMULATION TRAP</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Lm3ZvuaGfRWpxrrU.jpeg" /></figure><p>your phone produces more sensory intensity than anything in the natural world.</p><p>colors more saturated than flowers. sounds more varied than birdsong. movement faster than anything you’d see outside.</p><p>your screen can display millions of colors. shift between them instantly. flash them at frequencies designed to grab attention.</p><p>this is hyperstimulation. and your brain adapts to it by raising the threshold for what counts as interesting.</p><p>it’s like living in a house with a constant loud noise. eventually you stop hearing it. your auditory system adapts by becoming less sensitive.</p><p>same thing happens with your visual and reward systems.</p><p>after hours of bright, colorful, fast-moving content on your phone, real life looks gray by comparison.</p><p>literally. your color perception dulls because your brain has recalibrated to expect digital intensity.</p><p>you always hear people say “life used to be brighter when we were kids” or “the world has gone dull”. yes our bodies do naturally see the world as ‘less colorful’ as we age but your phone amplifies it to a degree you couldn’t even imagine.</p><p>your phone is the reason why sunsets that used to take your breath away now barely register.</p><p>your phone is the reason why conversations feel slow and boring.</p><p>your phone is the reason why books feel like too much effort.</p><p>your phone is the reason why you can’t just sit and exist without feeling understimulated.</p><p>your baseline for “interesting” has been artificially inflated to a level that reality can’t compete with.</p><p>and the more you use your phone, the worse this gets.</p><p>you need more and more stimulation to feel the same level of engagement. this is tolerance. the same mechanism as drug addiction.</p><p>you’re building tolerance to normal life.</p><h3>THE FEAR OF MISSING OUT IS PRIMAL</h3><p>“In a world of algorithms, hashtags and followers, know the true importance of human connection.” — Simi Fromen</p><p>FOMO isn’t just a millennial buzzword. it’s an evolutionary mechanism being weaponized against you. humans evolved in small tribes where social exclusion meant death.</p><p>if you weren’t aware of what the group was doing, you could miss critical information, lose status, or get left behind.</p><p>so your brain developed hypervigilance for social information.</p><p>what are others doing? what are they talking about? am i included? am i valued?</p><p>these questions determined survival for thousands of years.</p><p>your phone hijacks this ancient system.</p><p>every notification is a potential social update. every scroll might reveal what you’re missing.</p><p>and because social media shows you everyone’s highlights simultaneously, you’re constantly seeing things you’re not part of.</p><p>your friends having fun without you. events you weren’t invited to. experiences you’re not having.</p><p>your amygdala, which processes social threat, lights up.</p><p>your brain interprets this as social exclusion, which triggers the same pain circuits as physical pain.</p><p>this hurts. literally. brain scans show social rejection activating pain centers.</p><p>so you keep checking to make sure you’re not missing anything, which exposes you to more evidence of things you’re missing, which makes you check more.</p><p>it’s a feedback loop designed to keep you engaged.</p><p>but here’s what’s fucked up: FOMO is based on a lie.</p><p>you’re not actually missing out. you’re experiencing missing out.</p><p>there’s a difference.</p><p>missing out means you’re present in your own life but not in someone else’s highlight reel.</p><p>experiencing missing out means you’re not present in your own life because you’re too busy watching other people’s.</p><p>the irony is that the more you try to avoid FOMO by staying connected, the more you actually miss out on your own life.</p><p>you miss the sunset because you’re watching someone else’s sunset on instagram.</p><p>you miss the conversation because you’re checking what other conversations are happening.</p><p>you miss your life scrolling through other people’s lives.</p><h3>TIME DISTORTION &amp; DISSOCIATION</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*cjHchS8sKhGpcBeg.jpeg" /></figure><p>you pick up your phone to check one thing.</p><p>next thing you know, an hour is gone. where did it go? you barely remember what you looked at. this is time distortion, and it’s a feature.</p><p>your phone is designed to put you in a flow state, but not the productive kind.</p><p>it’s a dissociative state where your prefrontal cortex, which tracks time and maintains self-awareness, goes offline.</p><p>you become absorbed in the feed. scrolling, swiping, consuming content without conscious deliberation.</p><p>your brain shifts from executive control to autopilot. and in autopilot mode, time stops being tracked.</p><p>studies show people consistently underestimate how much time they spend on their phones by 50% or more.</p><p>you think you scrolled for 10 minutes. it was 30.</p><p>this happens because your hippocampus, which creates episodic memories, isn’t fully engaged during mindless scrolling.</p><p>you’re not encoding distinct memories. you’re in a state of continuous partial attention. you’re paying just enough attention to process each piece of content but not enough to encode it into long-term memory.</p><p>real quick tell me the last 5 tiktok videos you watched, or instagram reels you watched? you probably can’t right.</p><p>when you try to remember what you just spent an hour doing, there’s nothing there. your brain compressed it all into a vague blur because nothing was significant enough to remember.</p><p>this is time theft. hours of your life disappearing into a void with nothing to show for it. if this doesn’t scare you, i don’t know what will. ask any old person what they regret doing and they will probably say ‘wasting time’</p><p>mind you they didn’t even have phones.</p><p>it’s not just wasted time. it’s also fragmenting your attention in ways that persist even when you’re not on your phone.</p><h3>ATTENTION FRAGMENTATION</h3><p>“The smartphone has become a symbol of our increasingly fragmented attention.” — Nicholas Carr</p><p>every time you check your phone, you’re interrupting whatever you were doing.</p><p>your brain has to switch contexts. disengage from the current task, process the phone content, then try to re-engage with the original task.</p><p>this is called context switching, and it’s cognitively expensive.</p><p>research shows it takes an average of 23 minutes to fully refocus after an interruption.</p><p>but most people check their phones every 12 minutes.</p><p>which means you never actually achieve deep focus. you’re constantly in a state of partial attention.</p><p>this destroys your ability to do complex cognitive work. writing, deep thinking, problem-solving, creative work, all of this requires sustained focus.</p><p>but your brain has been trained to expect interruption every few minutes. so even when your phone isn’t actively in your hand, your attention is fragmented.</p><p>you’re anticipating the next check. the next notification. the next hit of stimulation.</p><p>this is called “continuous partial attention” and it’s become the default state for most people. you’re never fully present anywhere. always half-engaged, half-waiting for the next digital input.</p><p>and over time, this rewires your brain.</p><p>your anterior cingulate cortex, which controls attention and impulse control, physically shrinks. your ability to sustain focus degrades.</p><p>you become neurologically incapable of the kind of deep work that creates value and meaning.</p><p>and you wonder why you can’t focus on books anymore. why conversations feel exhausting. why you can’t finish projects.</p><p>it’s not you. it’s your fragmented attention system that’s been systematically destroyed by constant phone use.</p><h3>PHONES REPLACE MEANING WITH STIMULATION</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/736/0*I7gIjXnQO-afQlet.jpeg" /></figure><p>something shifted in the last decade and most people haven’t noticed it yet.</p><p>we used to create things. write, build, make, do. now we mostly consume. and consumption feels productive. scrolling feels like learning. watching content feels like connecting.</p><p>but there’s a difference between stimulation and meaning that your brain doesn’t naturally distinguish.</p><p>stimulation is short-term dopamine hits. eating candy, scrolling feeds, watching entertainment, getting likes.</p><p>meaning is long-term fulfillment from actually building something. creating work you’re proud of, developing real relationships, making progress on goals that matter.</p><p>psychologists call these hedonic pleasure versus eudaimonic well-being.</p><p>your brain needs both. but it evolved to prioritize hedonic pleasure in the moment because it’s immediate and certain.</p><p>your phone exploits this by offering infinite hedonic hits with zero eudaimonic payoff.</p><p>you get the dopamine. you don’t get the fulfillment.</p><p>seriously think about it. you can scroll for three hours and feel nothing afterwards except vaguely guilty and tired.</p><p>but you can work on something meaningful for 30 minutes and feel energized for hours.</p><p>yet your brain keeps choosing the scroll. why?</p><p>because the phone offers guaranteed dopamine right now. the meaningful work offers possible fulfillment later, after effort and uncertainty.</p><p>and over time, you stop pursuing meaningful activities entirely because they can’t compete with immediate gratification.</p><p>writing a book takes months of effort with no dopamine hits along the way.</p><p>scrolling twitter gives you dopamine every 10 seconds. your brain learns to prefer the latter even though it leaves you empty.</p><p>building a real relationship requires vulnerability, effort, showing up consistently through uncertainty.</p><p>watching relationship content on your phone requires nothing and gives you the illusion of connection without the risk.</p><p>your brain learns to prefer the simulation over the real thing.</p><p>this is how people end up feeling empty despite being constantly stimulated.</p><p>they’ve replaced meaning with stimulation. depth with breadth. quality with quantity and stimulation without meaning is just noise. it’s junk food for your brain. fills you up temporarily but leaves you malnourished.</p><h3>THE DREAM YOU’RE LOSING</h3><p>“The things you own end up owning you.” — Chuck Palahniuk</p><p>you have goals. dreams. things you want to create or become.</p><p>but you’re not making progress and you blame discipline. motivation. circumstances.</p><p>but the real reason is simpler your phone is stealing the time and attention you need to pursue those dreams.</p><p>every hour scrolling is an hour not spent on your craft.</p><p>every fragmented attention span is cognitive capacity you can’t bring to complex work. every dopamine hit from likes is reducing your motivation to do hard things that actually matter.</p><p>you’re trading your potential for digital stimulation.</p><p>and the worst part is it doesn’t feel like a trade. it feels like nothing.</p><p>because the cost is invisible. it’s gradual and cumlative.</p><p>you don’t notice that you’re not writing the book. you just notice you never have time.</p><p>you don’t notice that you’re not building the business. you just notice you’re too tired.</p><p>you don’t notice that you’re not deepening your relationships. you just notice you feel alone.</p><p>the phone isn’t obviously preventing you from doing these things. it’s just quietly stealing the resources you need to do them.</p><p>and years pass. and the dreams stay dreams. and you wonder what happened.</p><p>what happened is you chose stimulation over meaning. repeatedly. daily. hourly.</p><p>and now you’re 5 years older with nothing to show for it except a higher screen time average.</p><h3>THE FRAMEWORK: HOW TO TAKE YOUR BRAIN BACK</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/718/0*dH3UD4uy1rnzROce.jpeg" /></figure><p>alright, you understand the mechanism, you see how you’ve been hijacked. now what?</p><p>like i mentioned before, i can’t promise you that you will break your phone addiction but i can give you pieces of actionable advice that helped me.</p><p>this is not a step-by-step tutorial, it doesn’t work like that.</p><p>you need to recalibrate your dopamine system and rebuild your attention capacity.</p><p>this isn’t about deleting all apps and going full minimalist. that’s unrealistic for most people.</p><p>this is about strategic intervention to break the addiction patterns while maintaining functionality.</p><h3><strong>create physical barriers</strong></h3><p>your phone should not be the first thing you see when you wake up or the last thing you see before sleep.</p><p>charge it in a different room. buy an alarm clock if you need to.</p><p>those first and last hours of the day should belong to your brain, not your device.</p><p>remove social media apps from your phone. you can still access them on desktop, but adding friction reduces compulsive checking.</p><p>turn off all non-essential notifications. most of what pings you can wait.</p><p>the most important one though is to use <strong>grayscale mode</strong>. this removes the color intensity that hijacks your visual system. your phone becomes less stimulating immediately.</p><h3><strong>time-box your usage</strong></h3><p>you don’t have to quit your phone. you have to contain it.</p><p>designate specific times for checking social media. 30 minutes at lunch, 30 minutes in the evening, whatever works.</p><p>outside those windows, it doesn’t exist.</p><p>use app timers to enforce this. most phones have built-in tools to limit daily usage per app.</p><p>when you hit the limit, that app locks for the day. no negotiation.</p><h3><strong>replace phone time with presence time</strong></h3><p>this is critical. you can’t just remove the phone without replacing it with something else.</p><p>your brain needs stimulation. give it natural stimulation.</p><p>go outside without your phone. walk. sit. observe.</p><p>at first it will feel boring. that’s withdrawal. push through. check out my post on how to rewire your brain for more information on what ‘pushing through’ will do.</p><p>gradually, your brain will recalibrate to find natural stimuli interesting again.</p><p>colors will start to return. sounds will become noticeable. the world will regain texture.</p><h3><strong>rebuild your attention span</strong></h3><p>start with 10 minutes of focused work without checking your phone.</p><p>just 10 minutes. no multitasking. no switching. pure focus on one task.</p><p>do this daily and gradually increase the duration. it’s as simple as that</p><p>your anterior cingulate cortex will physically rebuild its capacity for sustained attention.</p><p>but it takes time. weeks, maybe months. be patient with the process.</p><h3><strong>rediscover boredom</strong></h3><p>boredom is not the enemy. understimulation is not a problem to solve.</p><p>boredom is when your brain does its best thinking. when creativity emerges. when you process emotions and experiences.</p><p>when you fill every moment with phone content, you never give your brain space to think.</p><p>deliberately create boredom. sit in waiting rooms without your phone. stand in lines without distraction.</p><p>let your mind wander. it knows what to do.</p><h3><strong>pursue meaning over stimulation</strong></h3><p>every day, do one thing that contributes to a meaningful goal.</p><p>write 500 words. code for 30 minutes. practice an instrument. have a real conversation.</p><p>something that builds toward who you want to become.</p><p>this creates eudaimonic reward. and over time, your brain learns to value this deeper satisfaction over shallow stimulation.</p><p>but you have to consistently choose it. daily. until it becomes the pattern your brain expects.</p><h3><strong>track your progress</strong></h3><p>your brain needs evidence that things are changing.</p><p>use screen time tracking. watch the numbers go down over weeks.</p><p>journal about what you notice. colors becoming brighter. focus improving. time feeling less distorted.</p><p>this creates a positive feedback loop. you see progress, which motivates continued effort, which creates more progress.</p><h3>THE CHOICE</h3><p>“Almost everything will work again if you unplug it for a few minutes, including you.” — Anne Lamott</p><p>look, i’m not going to sugarcoat this. breaking phone addiction is hard. probably the hardest fucking thing you will do in your life.</p><p>your brain will resist. you’ll feel anxiety when you can’t check. you’ll feel FOMO. you’ll feel bored.</p><p>that discomfort is your dopamine system recalibrating. it’s supposed to hurt.</p><p>most people won’t do it. they’ll read this, feel inspired for an hour, then go right back to their patterns. i don’t blame them either but i know this post will change at least 1 persons life and that’s all that matters. whether that person is you or not, is up to you.</p><p>addiction is easier than discipline. stimulation is easier than meaning. distraction is easier than presence.</p><p>but you’re not most people.</p><p>you can feel something is missing. you remember what it was like to see the world in full color.</p><p>you want that wonder back. you want your attention back. you want your life back.</p><p>and now you know how to get it.</p><p>but it requires a choice. screens or sunsets. notifications or nature. artificial stimulation or authentic presence.</p><p>you can’t have both. not at the intensity your brain has been trained to expect.</p><p>you have to choose. and you have to choose now.</p><p>because every day you delay is another day the world loses more color. another day wonder dies a little more. another day you become more numb to the beauty surrounding you.</p><p>the children you see playing outside? they can still see the magic. the colors are still vivid to them. the world is still full of wonder.</p><p>but they’re getting phones younger and younger. and their wonder is being systematically destroyed. just like yours was.</p><p>unless you break the cycle. unless you remember what it means to be present. unless you choose to see the world with your own eyes instead of through a screen.</p><p>the colors are still there. the wonder is still there. the magic is still there.</p><p>your dreams are still there.</p><p>you just forgot how to see them.</p><p>but you can remember.</p><p>if you’re willing to put down your phone and look up.</p><p>thank you for reading until this point, i appreciate you taking the time out of your day for reading this stuff it truly means a lot and i hope my posts provide you some value.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e294b15fb499" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Azure OpenAI /realtime: an interactive chat using node-js]]></title>
            <link>https://medium.com/@calebjephuneh/azure-openai-realtime-an-interactive-chat-using-node-js-2f05c1067a6f?source=rss-ef02b8e69895------2</link>
            <guid isPermaLink="false">https://medium.com/p/2f05c1067a6f</guid>
            <category><![CDATA[openai]]></category>
            <category><![CDATA[realtime]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Dataneard]]></dc:creator>
            <pubDate>Tue, 25 Mar 2025 18:59:27 GMT</pubDate>
            <atom:updated>2025-03-25T18:59:27.981Z</atom:updated>
            <content:encoded><![CDATA[<h3>Prereqs</h3><ol><li>Node.js installation (<a href="https://nodejs.org/">https://nodejs.org</a>)</li><li>Environment that can run a localhost web server</li></ol><h3>Using the sample</h3><ol><li>Navigate to this folder</li><li>Run npm install to download a small number of dependency packages (see package.json)</li><li>Run npm run dev to start the web server, navigating any firewall permissions prompts</li><li>Use any of the provided URIs from the console output, e.g. http://localhost:5173/, in a browser</li><li>In the “Endpoint” field, provide the resource endpoint of an Azure OpenAI resource; this does not need to append /realtime and an example structure might be <a href="https://my-azure-openai-resource-from-portal.openai.azure.com">https://my-azure-openai-resource-from-portal.openai.azure.com</a></li><li>In the “API Key” field, provide a corresponding API key</li><li>Click the “Record” button to start the session; accept any microphone permissions dialog</li><li>You should see a &lt;&lt; Session Started &gt;&gt; message in the left-side output, after which you can speak to the app</li><li>You can interrupt the chat at any time by speaking and completely stop the chat by using the “Stop” button</li><li>Optionally, you can provide a System Message (e.g. try “You always talk like a friendly pirate”) or a custom temperature; these will reflect upon the next session start</li></ol><p><strong>in your src</strong></p><p>add the following code</p><pre>main.ts<br><br><br>// Copyright (c) Microsoft Corporation.<br>// Licensed under the MIT license.<br><br>import { Player } from &quot;./player.ts&quot;;<br>import { Recorder } from &quot;./recorder.ts&quot;;<br>import &quot;./style.css&quot;;<br>import { LowLevelRTClient, SessionUpdateMessage, Voice } from &quot;rt-client&quot;;<br><br>let realtimeStreaming: LowLevelRTClient;<br>let audioRecorder: Recorder;<br>let audioPlayer: Player;<br><br>async function start_realtime(endpoint: string, apiKey: string, deploymentOrModel: string) {<br>  if (isAzureOpenAI()) {<br>    realtimeStreaming = new LowLevelRTClient(new URL(endpoint), { key: apiKey }, { deployment: deploymentOrModel });<br>  } else {<br>    realtimeStreaming = new LowLevelRTClient({ key: apiKey }, { model: deploymentOrModel });<br>  }<br><br>  try {<br>    console.log(&quot;sending session config&quot;);<br>    await realtimeStreaming.send(createConfigMessage());<br>  } catch (error) {<br>    console.log(error);<br>    makeNewTextBlock(&quot;[Connection error]: Unable to send initial config message. Please check your endpoint and authentication details.&quot;);<br>    setFormInputState(InputState.ReadyToStart);<br>    return;<br>  }<br>  console.log(&quot;sent&quot;);<br>  await Promise.all([resetAudio(true), handleRealtimeMessages()]);<br>}<br><br>function createConfigMessage() : SessionUpdateMessage {<br><br>  let configMessage : SessionUpdateMessage = {<br>    type: &quot;session.update&quot;,<br>    session: {<br>      turn_detection: {<br>        type: &quot;server_vad&quot;,<br>      },<br>      input_audio_transcription: {<br>        model: &quot;whisper-1&quot;<br>      }<br>    }<br>  };<br><br>  const systemMessage = getSystemMessage();<br>  const temperature = getTemperature();<br>  const voice = getVoice();<br><br>  if (systemMessage) {<br>    configMessage.session.instructions = systemMessage;<br>  }<br>  if (!isNaN(temperature)) {<br>    configMessage.session.temperature = temperature;<br>  }<br>  if (voice) {<br>    configMessage.session.voice = voice;<br>  }<br><br>  return configMessage;<br>}<br><br>async function handleRealtimeMessages() {<br>  for await (const message of realtimeStreaming.messages()) {<br>    let consoleLog = &quot;&quot; + message.type;<br><br>    switch (message.type) {<br>      case &quot;session.created&quot;:<br>        setFormInputState(InputState.ReadyToStop);<br>        makeNewTextBlock(&quot;&lt;&lt; Session Started &gt;&gt;&quot;);<br>        makeNewTextBlock();<br>        break;<br>      case &quot;response.audio_transcript.delta&quot;:<br>        appendToTextBlock(message.delta);<br>        break;<br>      case &quot;response.audio.delta&quot;:<br>        const binary = atob(message.delta);<br>        const bytes = Uint8Array.from(binary, (c) =&gt; c.charCodeAt(0));<br>        const pcmData = new Int16Array(bytes.buffer);<br>        audioPlayer.play(pcmData);<br>        break;<br><br>      case &quot;input_audio_buffer.speech_started&quot;:<br>        makeNewTextBlock(&quot;&lt;&lt; Speech Started &gt;&gt;&quot;);<br>        let textElements = formReceivedTextContainer.children;<br>        latestInputSpeechBlock = textElements[textElements.length - 1];<br>        makeNewTextBlock();<br>        audioPlayer.clear();<br>        break;<br>      case &quot;conversation.item.input_audio_transcription.completed&quot;:<br>        latestInputSpeechBlock.textContent += &quot; User: &quot; + message.transcript;<br>        break;<br>      case &quot;response.done&quot;:<br>        formReceivedTextContainer.appendChild(document.createElement(&quot;hr&quot;));<br>        break;<br>      default:<br>        consoleLog = JSON.stringify(message, null, 2);<br>        break<br>    }<br>    if (consoleLog) {<br>      console.log(consoleLog);<br>    }<br>  }<br>  resetAudio(false);<br>}<br><br>/**<br> * Basic audio handling<br> */<br><br>let recordingActive: boolean = false;<br>let buffer: Uint8Array = new Uint8Array();<br><br>function combineArray(newData: Uint8Array) {<br>  const newBuffer = new Uint8Array(buffer.length + newData.length);<br>  newBuffer.set(buffer);<br>  newBuffer.set(newData, buffer.length);<br>  buffer = newBuffer;<br>}<br><br>function processAudioRecordingBuffer(data: Buffer) {<br>  const uint8Array = new Uint8Array(data);<br>  combineArray(uint8Array);<br>  if (buffer.length &gt;= 4800) {<br>    const toSend = new Uint8Array(buffer.slice(0, 4800));<br>    buffer = new Uint8Array(buffer.slice(4800));<br>    const regularArray = String.fromCharCode(...toSend);<br>    const base64 = btoa(regularArray);<br>    if (recordingActive) {<br>      realtimeStreaming.send({<br>        type: &quot;input_audio_buffer.append&quot;,<br>        audio: base64,<br>      });<br>    }<br>  }<br><br>}<br><br>async function resetAudio(startRecording: boolean) {<br>  recordingActive = false;<br>  if (audioRecorder) {<br>    audioRecorder.stop();<br>  }<br>  if (audioPlayer) {<br>    audioPlayer.clear();<br>  }<br>  audioRecorder = new Recorder(processAudioRecordingBuffer);<br>  audioPlayer = new Player();<br>  audioPlayer.init(24000);<br>  if (startRecording) {<br>    const stream = await navigator.mediaDevices.getUserMedia({ audio: true });<br>    audioRecorder.start(stream);<br>    recordingActive = true;<br>  }<br>}<br><br>/**<br> * UI and controls<br> */<br><br>const formReceivedTextContainer = document.querySelector&lt;HTMLDivElement&gt;(<br>  &quot;#received-text-container&quot;,<br>)!;<br>const formStartButton =<br>  document.querySelector&lt;HTMLButtonElement&gt;(&quot;#start-recording&quot;)!;<br>const formStopButton =<br>  document.querySelector&lt;HTMLButtonElement&gt;(&quot;#stop-recording&quot;)!;<br>const formClearAllButton =<br>  document.querySelector&lt;HTMLButtonElement&gt;(&quot;#clear-all&quot;)!;<br>const formEndpointField =<br>  document.querySelector&lt;HTMLInputElement&gt;(&quot;#endpoint&quot;)!;<br>const formAzureToggle =<br>  document.querySelector&lt;HTMLInputElement&gt;(&quot;#azure-toggle&quot;)!;<br>const formApiKeyField = document.querySelector&lt;HTMLInputElement&gt;(&quot;#api-key&quot;)!;<br>const formDeploymentOrModelField = document.querySelector&lt;HTMLInputElement&gt;(&quot;#deployment-or-model&quot;)!;<br>const formSessionInstructionsField =<br>  document.querySelector&lt;HTMLTextAreaElement&gt;(&quot;#session-instructions&quot;)!;<br>const formTemperatureField = document.querySelector&lt;HTMLInputElement&gt;(&quot;#temperature&quot;)!;<br>const formVoiceSelection = document.querySelector&lt;HTMLInputElement&gt;(&quot;#voice&quot;)!;<br><br>let latestInputSpeechBlock: Element;<br><br>enum InputState {<br>  Working,<br>  ReadyToStart,<br>  ReadyToStop,<br>}<br><br>function isAzureOpenAI(): boolean {<br>  return formAzureToggle.checked;<br>}<br><br>function guessIfIsAzureOpenAI() {<br>  const endpoint = (formEndpointField.value || &quot;&quot;).trim();<br>  formAzureToggle.checked = endpoint.indexOf(&#39;azure&#39;) &gt; -1;<br>}<br><br>function setFormInputState(state: InputState) {<br>  formEndpointField.disabled = state != InputState.ReadyToStart;<br>  formApiKeyField.disabled = state != InputState.ReadyToStart;<br>  formDeploymentOrModelField.disabled = state != InputState.ReadyToStart;<br>  formStartButton.disabled = state != InputState.ReadyToStart;<br>  formStopButton.disabled = state != InputState.ReadyToStop;<br>  formSessionInstructionsField.disabled = state != InputState.ReadyToStart;<br>  formAzureToggle.disabled = state != InputState.ReadyToStart;<br>}<br><br>function getSystemMessage(): string {<br>  return formSessionInstructionsField.value || &quot;&quot;;<br>}<br><br>function getTemperature(): number {<br>  return parseFloat(formTemperatureField.value);<br>}<br><br>function getVoice(): Voice {<br>  return formVoiceSelection.value as Voice;<br>}<br><br>function makeNewTextBlock(text: string = &quot;&quot;) {<br>  let newElement = document.createElement(&quot;p&quot;);<br>  newElement.textContent = text;<br>  formReceivedTextContainer.appendChild(newElement);<br>}<br><br>function appendToTextBlock(text: string) {<br>  let textElements = formReceivedTextContainer.children;<br>  if (textElements.length == 0) {<br>    makeNewTextBlock();<br>  }<br>  textElements[textElements.length - 1].textContent += text;<br>}<br><br>formStartButton.addEventListener(&quot;click&quot;, async () =&gt; {<br>  setFormInputState(InputState.Working);<br><br>  const endpoint = formEndpointField.value.trim();<br>  const key = formApiKeyField.value.trim();<br>  const deploymentOrModel = formDeploymentOrModelField.value.trim();<br><br>  if (isAzureOpenAI() &amp;&amp; !endpoint &amp;&amp; !deploymentOrModel) {<br>    alert(&quot;Endpoint and Deployment are required for Azure OpenAI&quot;);<br>    return;<br>  }<br><br>  if (!isAzureOpenAI() &amp;&amp; !deploymentOrModel) {<br>    alert(&quot;Model is required for OpenAI&quot;);<br>    return;<br>  }<br><br>  if (!key) {<br>    alert(&quot;API Key is required&quot;);<br>    return;<br>  }<br><br>  try {<br>    start_realtime(endpoint, key, deploymentOrModel);<br>  } catch (error) {<br>    console.log(error);<br>    setFormInputState(InputState.ReadyToStart);<br>  }<br>});<br><br>formStopButton.addEventListener(&quot;click&quot;, async () =&gt; {<br>  setFormInputState(InputState.Working);<br>  resetAudio(false);<br>  realtimeStreaming.close();<br>  setFormInputState(InputState.ReadyToStart);<br>});<br><br>formClearAllButton.addEventListener(&quot;click&quot;, async () =&gt; {<br>  formReceivedTextContainer.innerHTML = &quot;&quot;;<br>});<br><br>formEndpointField.addEventListener(&#39;change&#39;, async () =&gt; {<br>  guessIfIsAzureOpenAI();<br>});<br>guessIfIsAzureOpenAI();<br><br></pre><pre>Player.ts<br><br>// Copyright (c) Microsoft Corporation.<br>// Licensed under the MIT license.<br><br>export class Player {<br>  private playbackNode: AudioWorkletNode | null = null;<br><br>  async init(sampleRate: number) {<br>    const audioContext = new AudioContext({ sampleRate });<br>    await audioContext.audioWorklet.addModule(&quot;playback-worklet.js&quot;);<br><br>    this.playbackNode = new AudioWorkletNode(audioContext, &quot;playback-worklet&quot;);<br>    this.playbackNode.connect(audioContext.destination);<br>  }<br><br>  play(buffer: Int16Array) {<br>    if (this.playbackNode) {<br>      this.playbackNode.port.postMessage(buffer);<br>    }<br>  }<br><br>  clear() {<br>    if (this.playbackNode) {<br>      this.playbackNode.port.postMessage(null);<br>    }<br>  }<br>}</pre><pre>recorder.ts<br><br><br>// Copyright (c) Microsoft Corporation.<br>// Licensed under the MIT license.<br><br>export class Recorder {<br>  onDataAvailable: (buffer: Buffer) =&gt; void;<br>  private audioContext: AudioContext | null = null;<br>  private mediaStream: MediaStream | null = null;<br>  private mediaStreamSource: MediaStreamAudioSourceNode | null = null;<br>  private workletNode: AudioWorkletNode | null = null;<br><br>  public constructor(onDataAvailable: (buffer: Buffer) =&gt; void) {<br>    this.onDataAvailable = onDataAvailable;<br>  }<br><br>  async start(stream: MediaStream) {<br>    try {<br>      this.audioContext = new AudioContext({ sampleRate: 24000 });<br>      await this.audioContext.audioWorklet.addModule(<br>        &quot;./audio-worklet-processor.js&quot;,<br>      );<br>      this.mediaStream = stream;<br>      this.mediaStreamSource = this.audioContext.createMediaStreamSource(<br>        this.mediaStream,<br>      );<br>      this.workletNode = new AudioWorkletNode(<br>        this.audioContext,<br>        &quot;audio-worklet-processor&quot;,<br>      );<br>      this.workletNode.port.onmessage = (event) =&gt; {<br>        this.onDataAvailable(event.data.buffer);<br>      };<br>      this.mediaStreamSource.connect(this.workletNode);<br>      this.workletNode.connect(this.audioContext.destination);<br>    } catch (error) {<br>      this.stop();<br>    }<br>  }<br><br>  stop() {<br>    if (this.mediaStream) {<br>      this.mediaStream.getTracks().forEach((track) =&gt; track.stop());<br>    }<br>    if (this.audioContext) {<br>      this.audioContext.close();<br>    }<br>  }<br>}</pre><pre>index.html<br><br>&lt;!--<br>// Copyright (c) Microsoft Corporation.<br>// Licensed under the MIT license.<br>--&gt;<br><br>&lt;!doctype html&gt;<br>&lt;html lang=&quot;en&quot;&gt;<br><br>&lt;head&gt;<br>  &lt;meta charset=&quot;UTF-8&quot; /&gt;<br>  &lt;link rel=&quot;icon&quot; type=&quot;image/svg+xml&quot; href=&quot;/vite.svg&quot; /&gt;<br>  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;<br>  &lt;title&gt;Realtime API with openai-node SDK&lt;/title&gt;<br>&lt;/head&gt;<br><br>&lt;body&gt;<br>  &lt;div id=&quot;app&quot;&gt;<br>    &lt;form&gt;<br>      &lt;div class=&quot;container&quot;&gt;<br>        &lt;div id=&quot;received-text-container&quot;&gt;&lt;/div&gt;<br>        &lt;div class=&quot;controls&quot;&gt;<br>          &lt;div class=&quot;input-group&quot;&gt;<br>            &lt;label for=&quot;endpoint&quot;&gt;Endpoint&lt;/label&gt;<br>            &lt;input id=&quot;endpoint&quot; type=&quot;text&quot; placeholder=&quot;Enter resource/endpoint URL&quot; /&gt;<br>            &lt;div class=&quot;toggle-group&quot;&gt;<br>              &lt;label for=&quot;azure-toggle&quot;&gt;Azure OpenAI&lt;/label&gt;<br>              &lt;input id=&quot;azure-toggle&quot; type=&quot;checkbox&quot; checked /&gt;<br>            &lt;/div&gt;<br>              &lt;label for=&quot;api-key&quot;&gt;API Key&lt;/label&gt;<br>            &lt;input id=&quot;api-key&quot; type=&quot;password&quot; placeholder=&quot;Enter API key&quot; /&gt;<br>            &lt;label for=&quot;deployment-or-model&quot;&gt;Deployment&lt;/label&gt;<br>            &lt;input id=&quot;deployment-or-model&quot; type=&quot;text&quot; placeholder=&quot;Enter deployment/model, e.g. gpt-4o-realtime-preview-2024-10-01&quot; /&gt;<br>          &lt;/div&gt;<br>          &lt;div class=&quot;input-group&quot;&gt;<br>          &lt;div class=&quot;button-group&quot;&gt;<br>            &lt;button id=&quot;start-recording&quot; type=&quot;button&quot;&gt;Record&lt;/button&gt;<br>            &lt;button id=&quot;stop-recording&quot; type=&quot;button&quot; disabled=&quot;true&quot;&gt;Stop&lt;/button&gt;<br>          &lt;/div&gt;<br>          &lt;div class=&quot;input-group&quot;&gt;<br>            &lt;label for=&quot;session-instructions&quot;&gt;System Message&lt;/label&gt;<br>            &lt;textarea id=&quot;session-instructions&quot; placeholder=&quot;Optional instructions for the session, e.g. &#39;You talk like a pirate.&#39;&quot; rows=&quot;4&quot;&gt;&lt;/textarea&gt;<br>          &lt;/div&gt;<br>          &lt;div class=&quot;input-group&quot;&gt;<br>            &lt;label for=&quot;temperature&quot;&gt;Temperature&lt;/label&gt;<br>            &lt;input id=&quot;temperature&quot; type=&quot;number&quot; min=&quot;0.6&quot; max=&quot;1.2&quot; step=&quot;0.05&quot; placeholder=&quot;0.6-1.2 (default 0.8)&quot;/&gt;<br>          &lt;/div&gt;<br>          &lt;div class=&quot;input-group&quot;&gt;<br>            &lt;label for=&quot;voice&quot;&gt;Voice&lt;/label&gt;<br>              &lt;select id=&quot;voice&quot;&gt;<br>                &lt;option&gt;&lt;/option&gt;<br>                &lt;option&gt;alloy&lt;/option&gt;<br>                &lt;option&gt;ash&lt;/option&gt;<br>                &lt;option&gt;ballad&lt;/option&gt;<br>                &lt;option&gt;coral&lt;/option&gt;<br>                &lt;option&gt;echo&lt;/option&gt;<br>                &lt;option&gt;sage&lt;/option&gt;<br>                &lt;option&gt;shimmer&lt;/option&gt;<br>                &lt;option&gt;verse&lt;/option&gt;<br>              &lt;/select&gt;<br>          &lt;/div&gt;<br>          &lt;div class=&quot;button-group&quot;&gt;<br>            &lt;button id=&quot;clear-all&quot; type=&quot;button&quot;&gt;Clear all&lt;/button&gt;<br>          &lt;/div&gt;<br>        &lt;/div&gt;<br>      &lt;/div&gt;<br>    &lt;/form&gt;<br>  &lt;/div&gt;<br>  &lt;script type=&quot;module&quot; src=&quot;/src/main.ts&quot;&gt;&lt;/script&gt;<br>&lt;/body&gt;<br><br>&lt;/html&gt;</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2f05c1067a6f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[From Mobile to Web: Unleashing the Power of Expo to Elevate Your React Native App]]></title>
            <link>https://medium.com/@calebjephuneh/from-mobile-to-web-unleashing-the-power-of-expo-to-elevate-your-react-native-app-e21d10a9154c?source=rss-ef02b8e69895------2</link>
            <guid isPermaLink="false">https://medium.com/p/e21d10a9154c</guid>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[cross-platform]]></category>
            <category><![CDATA[app-development]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[react-native]]></category>
            <dc:creator><![CDATA[Dataneard]]></dc:creator>
            <pubDate>Tue, 04 Feb 2025 07:34:12 GMT</pubDate>
            <atom:updated>2025-02-04T07:34:12.232Z</atom:updated>
            <content:encoded><![CDATA[<p>In today’s digital age, having a cross-platform application is essential. With React Native and Expo, you can easily transform your mobile app into a web app, offering your users a seamless experience across multiple devices. Here’s a step-by-step guide to achieving this transition.</p><h4>Why React Native and Expo?</h4><p>React Native allows developers to build mobile apps using JavaScript and React. Expo takes it a step further by providing a suite of tools and services that streamline the development process, including the ability to run your app on web platforms.</p><h4>Step 1: Setting Up Your Environment</h4><p>Before diving into the code, ensure you have the following installed:</p><ul><li>Node.js</li><li>Expo CLI (npm install -g expo-cli)</li><li>Git (optional, for version control)</li></ul><h4>Step 2: Enabling Web Support</h4><p>To get started, navigate to your React Native project directory and run the following command to install the necessary dependencies for web support:</p><pre>npx expo install react-native-web@~0.18.0 react-dom@18.2.0 @expo/webpack-config@^0.17.0</pre><h4>Step 3: Configuring Webpack</h4><p>Create a webpack.config.js file in the root of your project with the following content:</p><pre>const { withExpo } = require(&#39;@expo/webpack-config&#39;);<br>module.exports = async function (env, argv) {<br>  return withExpo(env, argv);<br>};</pre><p>This configuration leverages Expo’s built-in Webpack settings to bundle your app for the web.</p><h4>Step 4: Running Your App on Web</h4><p>To see your app in action on the web, run:</p><pre>npx expo start --web</pre><p>This command will launch a local web server, allowing you to interact with your app in a web browser.</p><h4>Step 5: Adjusting Styles and Components</h4><p>Web and mobile have different style requirements. Ensure your app looks great on both platforms by using the Platform module from React Native to conditionally apply styles:</p><p>javascript</p><pre>import { Platform, StyleSheet } from &#39;react-native&#39;;</pre><pre>const styles = StyleSheet.create({<br>  container: {<br>    ...Platform.select({<br>      web: {<br>        // Web-specific styles<br>      },<br>      default: {<br>        // Mobile-specific styles<br>      },<br>    }),<br>  },<br>});</pre><h4>Step 6: Building for Production</h4><p>Once your app is polished and ready, create a production build by running:</p><pre>npx expo build:web</pre><p>This command generates a web-build directory containing your web app’s static files.</p><h4>Step 7: Deploying Your Web App</h4><p>There are various hosting services you can use to deploy your web app. Here are a few options:</p><ul><li><strong>Vercel</strong>:</li></ul><ol><li>Sign up at Vercel.</li><li>Import your project repository.</li><li>Vercel will automatically detect the web-build directory and deploy your app.</li></ol><ul><li><strong>Netlify</strong>:</li></ul><ol><li>Sign up at Netlify.</li><li>Connect your project repository.</li><li>Set the build command to npx expo build:web and the publish directory to web-build.</li></ol><ul><li><strong>GitHub Pages</strong>:</li></ul><ol><li>Push your project to a GitHub repository.</li><li>Enable GitHub Pages in the repository settings.</li><li>Use gh-pages to publish your web-build directory</li></ol><pre>npm install gh-pages --save-dev</pre><ol><li>Add the following scripts to your package.json:</li></ol><pre>&quot;scripts&quot;: {   &quot;predeploy&quot;: &quot;expo build:web&quot;,   &quot;deploy&quot;: &quot;gh-pages -d web-build&quot; }</pre><p>Run:</p><pre>npm run deploy</pre><h4>Conclusion</h4><p>By following these steps, you can extend your React Native app’s reach to the web, providing a consistent and engaging experience for your users. The process may seem complex at first, but with Expo and a bit of tweaking, your app can thrive on any platform.</p><p>Happy coding!</p><p>foIIow me here</p><p><a href="https://whatsapp.com/channel/0029VapMNlKAInPt93qoA826">Caleb Jephunneh | WhatsApp Channel</a></p><p><a href="https://whatsapp.com/channel/0029VapMNlKAInPt93qoA826">https://whatsapp.com/channel/0029VapMNlKAInPt93qoA826</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e21d10a9154c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How WinHackathons.com Helps You Dominate Your Next Hackathon]]></title>
            <link>https://medium.com/@calebjephuneh/how-winhackathons-com-helps-you-dominate-your-next-hackathon-0542734de12d?source=rss-ef02b8e69895------2</link>
            <guid isPermaLink="false">https://medium.com/p/0542734de12d</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[competition]]></category>
            <category><![CDATA[hacking]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[hackathons]]></category>
            <dc:creator><![CDATA[Dataneard]]></dc:creator>
            <pubDate>Fri, 20 Dec 2024 12:05:46 GMT</pubDate>
            <atom:updated>2024-12-20T12:06:57.006Z</atom:updated>
            <content:encoded><![CDATA[<p>Hackathons are more than just competitions — they’re a launchpad for innovation, creativity, and impactful solutions. But let’s face it: succeeding at hackathons requires more than just showing up. That’s where <strong>WinHackathons.com</strong> steps in, giving you the edge to transform ideas into reality and win big.</p><p>Here’s how WinHackathons empowers you:</p><h3>✅ Generate Winning AI Ideas 🤖</h3><p>Struggling to come up with a groundbreaking solution?<br>Our <strong>AI-powered idea generation tools</strong> help you brainstorm unique, impactful concepts designed to wow hackathon judges and solve real-world problems.</p><h3>✅ Build AI-Driven Pitch Decks 📊</h3><p>You’ve got the idea; now it’s time to sell it.<br>WinHackathons ensures your story stands out with <strong>automated, polished pitch decks</strong> tailored to showcase your solution and impress your audience.</p><h3>✅ Collaborate Seamlessly 🤝</h3><p>Hackathons are all about teamwork, but finding the right teammates can be a challenge.<br>With WinHackathons, you can connect with like-minded innovators, build your dream team, and work on projects that truly make a difference.</p><h3>🌍 A Platform for Everyone</h3><p>Whether you’re a coder, designer, or problem-solver, WinHackathons equips you with the tools to shine. From ideation to execution, we’ve got you covered.</p><p>Hackathons = <strong>Innovation + Collaboration.</strong> WinHackathons = <strong>Your Success Formula.</strong></p><p>👉 <strong>Visit </strong><a href="http://winhackathons.com"><strong>winhackathons.com</strong></a><strong> now</strong> and take the first step toward your next big victory!</p><p>Let’s innovate, collaborate, and win together. 💡🏆</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h0G0CKw8UKAOnHfraOgi9w.png" /></figure><p><strong>#Hackathons #AIInnovation #TechCollaboration #WinHackathons #PitchPerfect</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0542734de12d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ most valuable skill at hackathons isn’t coding — it’s storytelling.]]></title>
            <link>https://medium.com/@calebjephuneh/most-valuable-skill-at-hackathons-isnt-coding-it-s-storytelling-dc8ab36b6b71?source=rss-ef02b8e69895------2</link>
            <guid isPermaLink="false">https://medium.com/p/dc8ab36b6b71</guid>
            <category><![CDATA[cybersecurity]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[winner]]></category>
            <category><![CDATA[hackathons]]></category>
            <dc:creator><![CDATA[Dataneard]]></dc:creator>
            <pubDate>Mon, 11 Nov 2024 16:10:24 GMT</pubDate>
            <atom:updated>2024-11-11T17:09:31.538Z</atom:updated>
            <content:encoded><![CDATA[<h3>𝗧𝗵𝗲 most valuable skill at hackathons isn’t coding — it’s storytelling.</h3><p>When people see my LinkedIn profile, they see 39× hackathon wins and think “Wow, that’s a lot of code!” What they don’t see is that my secret weapon isn’t my technical skills — it’s my ability to craft a compelling narrative. Here’s why storytelling trumps coding in hackathons:</p><p>🎨 THE ART OF THE PITCH<br>In hackathons, you’re not just building a project — you’re selling an idea, a dream, an 𝘦𝘷𝘦𝘳𝘥𝘪𝘴𝘵𝘢𝘯𝘵 𝘶𝘵𝘰𝘱𝘪𝘢, if you will. I once won a hackathon with a UI that was mostly smoke and mirrors. 𝗧𝗵𝗲 𝗯𝗮𝗰𝗸𝗲𝗻𝗱 𝘄𝗮𝘀 𝗵𝗲𝗹𝗱 𝘁𝗼𝗴𝗲𝘁𝗵𝗲𝗿 𝘄𝗶𝘁𝗵 𝗱𝘂𝗰𝘁 𝘁𝗮𝗽𝗲 𝗮𝗻𝗱 𝗵𝗼𝗽𝗲, 𝗯𝘂𝘁 𝗼𝘂𝗿 𝘀𝘁𝗼𝗿𝘆 𝗼𝗳 𝗵𝗼𝘄 𝗶𝘁 𝗰𝗼𝘂𝗹𝗱 𝗰𝗵𝗮𝗻𝗴𝗲 𝘁𝗵𝗲 𝘄𝗼𝗿𝗹𝗱 𝘄𝗮𝘀 𝗶𝗿𝗿𝗲𝘀𝗶𝘀𝘁𝗶𝗯𝗹𝗲.</p><p>💡 TAILORED NARRATIVES<br>Judges aren’t just evaluating code — they’re buying into visions. I’ve learned to tailor my pitch to each judge’s background. 𝗔𝘁 𝗮 𝗿𝗲𝗰𝗲𝗻𝘁 𝗵𝗮𝗰𝗸𝗮𝘁𝗵𝗼𝗻, 𝗜 𝗽𝗶𝘁𝗰𝗵𝗲𝗱 𝘁𝗵𝗲 𝘀𝗮𝗺𝗲 𝗽𝗿𝗼𝗷𝗲𝗰𝘁 𝘁𝗵𝗿𝗲𝗲 𝗱𝗶𝗳𝗳𝗲𝗿𝗲𝗻𝘁 𝘄𝗮𝘆𝘀 𝘁𝗼 𝘁𝗵𝗿𝗲𝗲 𝗱𝗶𝗳𝗳𝗲𝗿𝗲𝗻𝘁 𝗷𝘂𝗱𝗴𝗲𝘀. 𝗪𝗲 𝘄𝗼𝗻 𝗳𝗶𝗿𝘀𝘁 𝗽𝗹𝗮𝗰𝗲.</p><p>🚀 BEYOND THE HACKATHON<br>This skill isn’t just for winning prizes — it’s liquid gode for careers. The ability to tell a compelling story about your work is invaluable in:</p><p>1. Startup pitches<br>2. Product management<br>3. Technical interviews: 𝗜 𝗹𝗮𝗻𝗱𝗲𝗱 a 𝗷𝗼𝗯 𝗯𝘆 𝘁𝗲𝗹𝗹𝗶𝗻𝗴 𝘁𝗵𝗲 𝘀𝘁𝗼𝗿𝘆 𝗼𝗳 𝗮 𝗵𝗮𝗰𝗸𝗮𝘁𝗵𝗼𝗻 𝗽𝗿𝗼𝗷𝗲𝗰𝘁 𝘁𝗵𝗮𝘁 𝗱𝗶𝗱𝗻’𝘁 𝗲𝘃𝗲𝗻 𝘄𝗶𝗻 𝗮𝗻𝘆𝘁𝗵𝗶𝗻𝗴!</p><p>💼 THE ETHICS OF STORYTELLING<br>Now, you might be thinking, “Isn’t this just smoke and mirrors?” Here’s the truth: A hackathon isn’t about showcasing a finished product — it’s about pitching potential. 𝗬𝗼𝘂’𝗿𝗲 𝗻𝗼𝘁 𝘀𝗲𝗹𝗹𝗶𝗻𝗴 𝘄𝗵𝗮𝘁 𝘆𝗼𝘂’𝘃𝗲 𝗯𝘂𝗶𝗹𝘁 𝗶𝗻 𝟮𝟰 𝗵𝗼𝘂𝗿𝘀 — 𝘆𝗼𝘂’𝗿𝗲 𝘀𝗲𝗹𝗹𝗶𝗻𝗴 𝘁𝗵𝗲 𝗱𝗿𝗲𝗮𝗺 𝗼𝗳 𝘄𝗵𝗮𝘁 𝗶𝘁 𝗰𝗼𝘂𝗹𝗱 𝗯𝗲𝗰𝗼𝗺𝗲.</p><p>🌟 MY HACKATHON TIPS:</p><p>1. Focus on the problem you’re solving, not just your solution.<br>2. Practice your pitch as much as you code.<br>3. Use analogies to make complex tech relatable.<br>4. Show passion — enthusiasm is contagious!<br>5. Be ready to pivot your story based on judges’ reactions.</p><p>Remember, in hackathons and in life, it’s not just about what you build — it’s about the story you tell. Master this, and you’ll not only win hackathons but also hearts, minds, and maybe even your dream job.</p><p>For more of this content follow my WhatsApp channel 👉<a href="https://whatsapp.com/channel/0029VapMNlKAInPt93qoA826">https://whatsapp.com/channel/0029VapMNlKAInPt93qoA826</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dc8ab36b6b71" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ ’    . But I have won 21 out of 41]]></title>
            <link>https://medium.com/@calebjephuneh/-bfc8f7badb44?source=rss-ef02b8e69895------2</link>
            <guid isPermaLink="false">https://medium.com/p/bfc8f7badb44</guid>
            <category><![CDATA[competition]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[hackathons]]></category>
            <category><![CDATA[hacking]]></category>
            <dc:creator><![CDATA[Dataneard]]></dc:creator>
            <pubDate>Sun, 10 Nov 2024 06:03:06 GMT</pubDate>
            <atom:updated>2024-11-10T06:21:37.195Z</atom:updated>
            <content:encoded><![CDATA[<p>𝗜 𝗱𝗼𝗻’𝘁 𝘄𝗿𝗶𝘁𝗲 𝗰𝗼𝗱𝗲 𝗮𝘁 𝗵𝗮𝗰𝗸𝗮𝘁𝗵𝗼𝗻𝘀.</p><p>Well, let me correct that—𝗜 𝗱𝗼𝗻’𝘁 𝘄𝗿𝗶𝘁𝗲 𝙖𝙡𝙡 𝗺𝘆 𝗰𝗼𝗱𝗲 𝗮𝘁 𝗵𝗮𝗰𝗸𝗮𝘁𝗵𝗼𝗻𝘀.</p><p>Something I learned from Hackcon by Major League Hacking is that software engineers are transitioning from 𝘤𝘳𝘦𝘢𝘵𝘪𝘯𝘨 code to 𝘦𝘥𝘪𝘵𝘪𝘯𝘨 it. I realized I’ve been subconsciously doing this already.</p><p>At most hackathons, I rely on AI-based tools to generate boilerplate code. From there, I modify and optimize it to fit my project. Here are the three AI tools that have massively boosted my workflow at hackathons:</p><p>🔥 𝗖𝘂𝗿𝘀𝗼𝗿 𝗖𝗼𝗱𝗲 𝗘𝗱𝗶𝘁𝗼𝗿<br>A fork of Visual Studio Code that uses your entire codebase as a knowledge base. It’s brilliant for context-aware code generation, far better than GitHub Copilot. Cursor even allows inline edits—𝗲𝗱𝗶𝘁𝗶𝗻𝗴 your code rather than generating it from scratch.</p><p>🚀 𝗩𝗲𝗿𝗰𝗲𝗹 𝗩𝟬<br>V0 is a generative user interface system by Vercel that outputs React code powered by 𝘀𝗵𝗮𝗱𝗰𝗻/𝘂𝗶 and 𝗧𝗮𝗶𝗹𝘄𝗶𝗻𝗱 𝗖𝗦𝗦. For me, this is a no-brainer because I’m already using Next.js. It can even generate custom components you can 𝗻𝗽𝗺 𝗶𝗻𝘀𝘁𝗮𝗹𝗹 directly into your project—𝘪𝘯𝘴𝘵𝘢𝘯𝘵 𝘱𝘳𝘰𝘥𝘶𝘤𝘵𝘪𝘷𝘪𝘵𝘺 𝘣𝘰𝘰𝘴𝘵.</p><p>🤖 𝗖𝗹𝗮𝘂𝗱𝗲 𝗔𝗿𝘁𝗶𝗳𝗮𝗰𝘁𝘀<br>Part of 𝗖𝗹𝗮𝘂𝗱𝗲 𝟯.𝟱, this feature simplifies code generation in a traditional chat interface. You can view live previews and access a history of your interactions, all in an easy-to-navigate tab. It’s a game changer for debugging and understanding your teammates’ code in the middle of a hackathon. This tool has saved me 𝘵𝘦𝘯𝘴 𝘰𝘧 𝘩𝘰𝘶𝘳𝘴 𝘢𝘵 𝘦𝘢𝘤𝘩 𝘩𝘢𝘤𝘬𝘢𝘵𝘩𝘰𝘯.</p><p>Here’s the big shift: The primary role of a software engineer is evolving from 𝘤𝘰𝘥𝘦 𝘤𝘳𝘦𝘢𝘵𝘪𝘰𝘯 to 𝘤𝘰𝘥𝘦 𝘤𝘶𝘳𝘢𝘵𝘪𝘰𝘯. We’re no longer just writing code—we’re guiding AI tools to build it smarter and faster.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bfc8f7badb44" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>