<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ashraf Ali</title><description>Notes on technology, design, work, and whatever else is interesting.</description><link>https://ashrafali.net/</link><atom:link href="https://ashrafali.net/feed/" rel="self" type="application/rss+xml"/><item><title>How Claude Helped Me Stage Manage a Conference (While the Governor Called the White House)</title><link>https://ashrafali.net/how-claude-helped-me-stage-manage-a-conference-while-the-governor-called-the-white-house/</link><guid isPermaLink="false">https://ashrafali.net/?p=3038</guid><description>One month before showtime, I landed a freelance gig as Production Manager and Stage Manager for the 2025 MOVE Chamber Conference at Capital One Hall. A connection came through, and I was the glue between the MOVE Chamber team and the Capital One Hall production crew. I&amp;#8217;ve spent years running one-man shows. ATEM switcher, driving [&amp;hellip;]</description><pubDate>Tue, 07 Oct 2025 18:12:15 GMT</pubDate><content:encoded>&lt;p class=&quot;wp-block-paragraph&quot;&gt;One month before showtime, I landed a freelance gig as Production Manager and Stage Manager for the &lt;a href=&quot;https://conference.movechamber.org/&quot;&gt;2025 MOVE Chamber Conference&lt;/a&gt; at Capital One Hall. A connection came through, and I was the glue between the MOVE Chamber team and the Capital One Hall production crew.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I&amp;#8217;ve spent years running one-man shows. ATEM switcher, driving every camera, setting up every cable, being everything all at once. It works. I&amp;#8217;ve made it work. But walking into Capital One Hall and seeing a &lt;em&gt;real&lt;/em&gt; production setup? That was something else.&lt;/p&gt;



&lt;figure class=&quot;wp-block-gallery has-nested-images columns-4 is-cropped wp-block-gallery-2&quot;&gt;
&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;2560&quot; data-id=&quot;3043&quot; src=&quot;/wp-content/uploads/2025/10/IMG_7516-scaled.jpeg&quot; alt=&quot;&quot; class=&quot;wp-image-3043&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/10/IMG_7516-scaled.jpeg 1920w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7516-768x1024.jpeg 768w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7516-1152x1536.jpeg 1152w, /wp-content/uploads/2025/10/IMG_7516-1536x2048.jpeg 1536w&quot; sizes=&quot;auto, (max-width: 1920px) 100vw, 1920px&quot; /&gt;&lt;/figure&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;2560&quot; data-id=&quot;3044&quot; src=&quot;/wp-content/uploads/2025/10/IMG_7517-scaled.jpeg&quot; alt=&quot;&quot; class=&quot;wp-image-3044&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/10/IMG_7517-scaled.jpeg 1920w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7517-768x1024.jpeg 768w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7517-1152x1536.jpeg 1152w, /wp-content/uploads/2025/10/IMG_7517-1536x2048.jpeg 1536w&quot; sizes=&quot;auto, (max-width: 1920px) 100vw, 1920px&quot; /&gt;&lt;/figure&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;2560&quot; data-id=&quot;3045&quot; src=&quot;/wp-content/uploads/2025/10/IMG_7532-scaled.jpeg&quot; alt=&quot;&quot; class=&quot;wp-image-3045&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/10/IMG_7532-scaled.jpeg 1920w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7532-768x1024.jpeg 768w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7532-1152x1536.jpeg 1152w, /wp-content/uploads/2025/10/IMG_7532-1536x2048.jpeg 1536w&quot; sizes=&quot;auto, (max-width: 1920px) 100vw, 1920px&quot; /&gt;&lt;/figure&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;2560&quot; data-id=&quot;3046&quot; src=&quot;/wp-content/uploads/2025/10/IMG_8773-scaled.jpeg&quot; alt=&quot;&quot; class=&quot;wp-image-3046&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/10/IMG_8773-scaled.jpeg 1920w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_8773-768x1024.jpeg 768w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_8773-1152x1536.jpeg 1152w, /wp-content/uploads/2025/10/IMG_8773-1536x2048.jpeg 1536w&quot; sizes=&quot;auto, (max-width: 1920px) 100vw, 1920px&quot; /&gt;&lt;/figure&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2560&quot; height=&quot;1920&quot; data-id=&quot;3039&quot; src=&quot;/wp-content/uploads/2025/10/IMG_7487-scaled.jpeg&quot; alt=&quot;&quot; class=&quot;wp-image-3039&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/10/IMG_7487-scaled.jpeg 2560w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7487-768x576.jpeg 768w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7487-1536x1152.jpeg 1536w, /wp-content/uploads/2025/10/IMG_7487-2048x1536.jpeg 2048w&quot; sizes=&quot;auto, (max-width: 2560px) 100vw, 2560px&quot; /&gt;&lt;/figure&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;2560&quot; data-id=&quot;3040&quot; src=&quot;/wp-content/uploads/2025/10/IMG_7490-scaled.jpeg&quot; alt=&quot;&quot; class=&quot;wp-image-3040&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/10/IMG_7490-scaled.jpeg 1920w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7490-768x1024.jpeg 768w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7490-1152x1536.jpeg 1152w, /wp-content/uploads/2025/10/IMG_7490-1536x2048.jpeg 1536w&quot; sizes=&quot;auto, (max-width: 1920px) 100vw, 1920px&quot; /&gt;&lt;/figure&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;2560&quot; data-id=&quot;3041&quot; src=&quot;/wp-content/uploads/2025/10/IMG_7482-scaled.jpeg&quot; alt=&quot;&quot; class=&quot;wp-image-3041&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/10/IMG_7482-scaled.jpeg 1920w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7482-768x1024.jpeg 768w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7482-1152x1536.jpeg 1152w, /wp-content/uploads/2025/10/IMG_7482-1536x2048.jpeg 1536w&quot; sizes=&quot;auto, (max-width: 1920px) 100vw, 1920px&quot; /&gt;&lt;/figure&gt;



&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2560&quot; height=&quot;1920&quot; data-id=&quot;3042&quot; src=&quot;/wp-content/uploads/2025/10/IMG_7498-scaled.jpeg&quot; alt=&quot;&quot; class=&quot;wp-image-3042&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/10/IMG_7498-scaled.jpeg 2560w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7498-768x576.jpeg 768w, https://ashrafali.net/wp-content/uploads/2025/10/IMG_7498-1536x1152.jpeg 1536w, /wp-content/uploads/2025/10/IMG_7498-2048x1536.jpeg 2048w&quot; sizes=&quot;auto, (max-width: 2560px) 100vw, 2560px&quot; /&gt;&lt;/figure&gt;
&lt;/figure&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Every single thing was humming wonderfully. The Aquilon switcher they were using costs $145k. That&amp;#8217;s not flex, that&amp;#8217;s bulletproof 4K that just &lt;em&gt;works&lt;/em&gt; (so many inputs!). Proper networking. Proper wiring. Everything labeled. Everything ready. When they needed to switch from one thing to another, they had the technical capability to do it &lt;em&gt;instantly&lt;/em&gt;. The crew was &lt;em&gt;excellent&lt;/em&gt;. When I mentioned making global announcements in the hall, they set up a &amp;#8220;ding&amp;#8221; button for me on the fly using Bitfocus Companion. Just like that. That&amp;#8217;s the kind of competency that makes you better at your job.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I also realized there&amp;#8217;s power in being the dedicated person instead of always feeling like you have to do everything. Watching everyone hum together, delegated and responsible, each person owning their domain—it was incredible to witness. Much of the production staff operates on freelance contracts, which was interesting to see in practice. Everyone knew their role, showed up ready, and executed.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Claude was threaded through everything I did. Run of Show generation. Spreadsheet organization. Timing management. Rewriting things on the spot. Getting client approvals faster. Drafting emails that got quicker responses. Organizing files and assets so everything was in the right place.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;At night, I got a last minute agenda change. No problem. The morning of the event, I regenerated the entire Run of Show as a new PDF, printed it, and emailed it to everyone. Done. No stress. No second-guessing.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Last year&amp;#8217;s team had set up solid documentation, but I needed to rewrite it to be more user-friendly and accessible to more people, more centralized in one Google Sheet. Claude helped me do that quickly without losing the essential data. And here&amp;#8217;s what mattered most: Claude didn&amp;#8217;t hallucinate. It didn&amp;#8217;t make things up. At all. It supersized every decision I needed to make and made me feel &lt;em&gt;reassured&lt;/em&gt;. When you&amp;#8217;re managing a live event, that confidence is everything.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Mid-event, things got hairy. Virginia&amp;#8217;s Governor was scheduled to speak, but his team informed us he had a call with the White House in just a few minutes upon arrival. We had to move &lt;em&gt;fast&lt;/em&gt;.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I started banging out messages through stagetimer.io (which, by the way, just &lt;em&gt;works&lt;/em&gt;—love that tool). Adjusting timing. Coordinating transitions. Getting people off stage. Moving podium furniture live The production crew was in my ear on comms, and I was texting the MOVE Chamber team on the other side. We executed. The Governor felt prepared. We moved quickly. And it &lt;em&gt;worked&lt;/em&gt;. That moment was control. That moment was what they hired me for.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;At one point, I had to present to all the judges and speakers in front of the hall to keep them aligned on the agenda. They felt reassured, they understood their roles, and everyone was on the same page. That&amp;#8217;s the job. Being solution-oriented, not panic-oriented. Making easy transitions with good onboarding. Being the person who can step up and say, &amp;#8220;Here&amp;#8217;s what&amp;#8217;s happening, here&amp;#8217;s what you need to do, we&amp;#8217;ve got this.&amp;#8221;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Where my generalist skillset supercharged: One pitch team&amp;#8217;s PowerPoint wasn&amp;#8217;t loading videos the day of. I had to re-download the videos and restitch them in Final Cut Pro. Graphics on the fly. MOVE Chamber membership registration graphics. When we adjusted prayer times, I logged in and updated the app notifications. Tiny hiccups too like one misspelling on a card I made on the spot for a speaker and one missed card (also made on the fly). Not perfect, but done. That&amp;#8217;s okay.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Why does this matter? Because understanding graphics, video, computers, AI, and production means I can interject and solve problems &lt;em&gt;quickly&lt;/em&gt;. They don&amp;#8217;t have to pull in another professional. I can be the one who handles it. That&amp;#8217;s the generalist advantage. You can flex. You can move. You can download a LinkedIn video, edit in Final Cut Pro, switch to Canva for a graphic, use ffmpeg to re-encode video, extract assets from a PowerPoint using zip, use Replicate to clean up images with Seedance-4. It&amp;#8217;s fun as hell to move like that.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;With all this AI and tech, you&amp;#8217;d think everything is digital. Nope.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Paper is power. Print, print, print. Get the black marker. Get the Paper Mate Felt tips and thank me later. I made sure everyone had physical copies of the run of show in their hands with pens. Conversations happen faster.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;And backups on backups on backups. I never trust just technology. Chargers everywhere. My phone as a clock. Auto-reminders set on my Apple Watch so if I stepped out of the hall, it would buzz me. On my spreadsheets, I triple-link the same information for everyone. Same data, multiple places, all synced. Because everyone has their own ways of doing something, and you need to meet them where they are. Analog systems matter, even in an AI-supercharged workflow.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I had two comms systems running: production comms in one ear, walkie-talkies with the MOVE Chamber folks in the other. The walkie-talkies weren&amp;#8217;t clear enough, so we adapted. Texted instead. The person kept reviewing their phone, and it worked. I felt like central command. Telling people, &amp;#8220;Alright, we&amp;#8217;re rolling,&amp;#8221; and having the guidance of the production crew backing me up. It was intense. It was exhilarating.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;And at the end? I had to catch a flight at the tail end of the production. But I left confident that the team could take over with no hitches. Because that&amp;#8217;s what great production teams do. The Capital One Hall crew is excellent, and I was grateful to work alongside them.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;The takeaway? Generalist skills + AI tools = superpowers. I could move fast, adapt on the fly, and solve problems in real-time because I had both the technical range &lt;em&gt;and&lt;/em&gt; the AI assistance to supercharge every decision. But it&amp;#8217;s not just the tools. It&amp;#8217;s the people. Great production teams are everything. Being empowered to lead and own decisions made all the difference.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;And yeah, some practical stuff I learned: caffeine pills (100mg) plus one cup of coffee equals no crash. Eat your veggies. Ask more questions. Follow up with CYAs. Set reminders. Print everything.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;It was my first time in this role. InshaAllah, it won&amp;#8217;t be my last.&lt;/p&gt;</content:encoded></item><item><title>Dial-a-site—yes, you can call that website using the Internet Phone Book ⇝</title><link>https://ashrafali.net/dial-a-site-yes-you-can-call-that-website-using-the-internet-phone-book/</link><guid isPermaLink="false">https://ashrafali.net/?p=3026</guid><description>I came across the Internet Phone Book via Manu&amp;#8217;s blog and I have to say, I love the quirkyness of the whole thing! The idea of a tiny book with fixed websites that give a description or two about the web just gives me that nice meld of nostalgia and newness. The part that got [&amp;hellip;]</description><pubDate>Fri, 12 Sep 2025 11:52:24 GMT</pubDate><content:encoded>&lt;p class=&quot;wp-block-paragraph&quot;&gt;I came across the &lt;a href=&quot;https://internetphonebook.net/&quot;&gt;Internet Phone Book&lt;/a&gt; via &lt;a href=&quot;https://manuelmoreale.com/two-quick-news-items&quot;&gt;Manu&amp;#8217;s blog&lt;/a&gt; and I have to say, I love the quirkyness of the whole thing! The idea of a tiny book with fixed websites that give a description or two about the web just gives me that nice meld of nostalgia and &lt;em&gt;newness&lt;/em&gt;. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;The part that got me giggling was the &lt;a href=&quot;https://internetphonebook.net/dial/&quot;&gt;Dial-a-site&lt;/a&gt; tool. Just type the number corresponding in the Phone Book and you get the website instantly! Complete with phone tones. Try it with 263 to get &lt;a href=&quot;https://pablo.energy/&quot;&gt;Pablo Moreno&amp;#8217;s site&lt;/a&gt; as an example. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I just love, love the simplicity of it. Personally, I think it&amp;#8217;s better than QR codes (ugh, what an ugly eye sore everywhere), more memorable (I can remember 3 digits plus I know how phones work!), and faster to input than something like a bit.ly URL.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;For many of my clients, they rely on vanity urls to share short links from their domains. But constantly creating unique vanity urls can sometimes feel overwhelming, especially for orgs that have 15-20 registration links per month. Perhaps this is a simpler way! &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Hmm, dial-a-site for your own site. I should whip up a wordpress plugin for this. &lt;/p&gt;
&lt;div class=&quot;link-blog-domain-links&quot;&gt;&lt;a href=&quot;https://internetphonebook.net/dial/&quot;&gt;internetphonebook.net&lt;/a&gt; via&lt;a href=&quot;https://manuelmoreale.com/two-quick-news-items&quot;&gt;manuelmoreale.com&lt;/a&gt;&lt;/div&gt;</content:encoded></item><item><title>Websites should not ask me to add a Passkey while I am logging to your site!</title><link>https://ashrafali.net/websites-should-not-ask-me-to-add-a-passkey-while-i-am-logging-to-your-site/</link><guid isPermaLink="false">https://ashrafali.net/?p=3020</guid><description>Just ran into an extremely frustrating issue where Dropbox asked me to add a passkey to my account. Now I have not fully transitioned all my accounts to passkeys, so I wanted to do it intentionally, on my terms. But my 1Password flow, in conjunction with Dropbox&amp;#8217;s Passkey request resulted in me creating a passkey [&amp;hellip;]</description><pubDate>Wed, 20 Aug 2025 14:24:29 GMT</pubDate><content:encoded>&lt;p class=&quot;wp-block-paragraph&quot;&gt;Just ran into an extremely frustrating issue where Dropbox asked me to add a passkey to my account. Now I have not fully transitioned all my accounts to passkeys, so I wanted to do it intentionally, on my terms. But my 1Password flow, in conjunction with Dropbox&amp;#8217;s Passkey request resulted in me creating a passkey right before logging into my account. Which is not what I desired!&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;How many users are making such dramatic changes on their accounts without realizing it? Websites and platforms are so adamant about pushing past keys for security. Well, what about considering the UX and user interface challenges that users may be facing?&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I know I&amp;#8217;m frustrated. I&amp;#8217;m sure others are too. I really hope nobody loses their accounts as a result of something like this. But sadly we know this story all too well.&lt;/p&gt;</content:encoded></item><item><title>Tip: Use AI to Help Convert a Make.com Workflow to a n8n Workflow</title><link>https://ashrafali.net/tip-use-ai-to-help-convert-a-make-com-workflow-to-a-n8n-workflow/</link><guid isPermaLink="false">https://ashrafali.net/?p=3009</guid><description>Did you know that Make.com allows you to export a Workflow Blueprint? Go to your Scenario, Click on the three dots in the bottom menu bar and select Export Blueprint. The file you download will be a resulting JSON file. Send it to your favorite LLM. I prefer to use Claude Opus 4.1 for this. [&amp;hellip;]</description><pubDate>Sat, 16 Aug 2025 13:24:36 GMT</pubDate><content:encoded>&lt;p class=&quot;wp-block-paragraph&quot;&gt;Did you know that Make.com allows you to export a Workflow Blueprint? Go to your Scenario, Click on the three dots in the bottom menu bar and select &lt;code&gt;Export Blueprint&lt;/code&gt;. The file you download will be a resulting JSON file. Send it to your favorite LLM. I prefer to use Claude Opus 4.1 for this.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Then, ask it to recreate the workflow in n8n as JSON. You can copy and paste the JSON straight into n8n using keyboard shortcuts.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Additionally, you can set up the shell nodes in n8n and copy the resulting JSON. Then, import it into your AI window and ask it to fill the remaining details.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;You&amp;#8217;ll still have to debug your n8n workflow as I&amp;#8217;ve run into several nerdy, developer bugs (i.e. did you format your JSON imports and exports? did you pass the data from node to node correctly? Are you passing a string or a number? And more aspects like this. AI might not always get this right).&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Here is my existing make.com workflow:&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2560&quot; height=&quot;1502&quot; src=&quot;/wp-content/uploads/2025/08/CleanShot-2025-08-16-at-14.22.38@2x-scaled.png&quot; alt=&quot;&quot; class=&quot;wp-image-3012&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/08/CleanShot-2025-08-16-at-14.22.38@2x-scaled.png 2560w, https://ashrafali.net/wp-content/uploads/2025/08/CleanShot-2025-08-16-at-14.22.38@2x-768x450.png 768w, https://ashrafali.net/wp-content/uploads/2025/08/CleanShot-2025-08-16-at-14.22.38@2x-1536x901.png 1536w, /wp-content/uploads/2025/08/CleanShot-2025-08-16-at-14.22.38@2x-2048x1201.png 2048w&quot; sizes=&quot;auto, (max-width: 2560px) 100vw, 2560px&quot; /&gt;&lt;/figure&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;And here is my new n8n workflow:&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2560&quot; height=&quot;1498&quot; src=&quot;/wp-content/uploads/2025/08/CleanShot-2025-08-16-at-14.23.37@2x-scaled.png&quot; alt=&quot;&quot; class=&quot;wp-image-3013&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/08/CleanShot-2025-08-16-at-14.23.37@2x-scaled.png 2560w, https://ashrafali.net/wp-content/uploads/2025/08/CleanShot-2025-08-16-at-14.23.37@2x-768x449.png 768w, https://ashrafali.net/wp-content/uploads/2025/08/CleanShot-2025-08-16-at-14.23.37@2x-1536x899.png 1536w, /wp-content/uploads/2025/08/CleanShot-2025-08-16-at-14.23.37@2x-2048x1198.png 2048w&quot; sizes=&quot;auto, (max-width: 2560px) 100vw, 2560px&quot; /&gt;&lt;/figure&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;P.S. It&amp;#8217;s a bit tacky that n8n puts the GitHub star widget on the top right of every window. Devs, please kindly remove the widget :)&lt;/p&gt;</content:encoded></item><item><title>How to Connect a Monday.com Webhook to your n8n Workflow</title><link>https://ashrafali.net/how-to-connect-monday-com-webhook-to-your-n8n-workflow/</link><guid isPermaLink="false">https://ashrafali.net/?p=3004</guid><description>Recently for a client, I was working to switch over from Make.com to their own n8n install in order to manage some automations. I was struggling to deal with Monday.com&amp;#8217;s challenge response to the webhook using n8n. After some finagling with Claude and trial/error with curl, I was able to build a workflow that got [&amp;hellip;]</description><pubDate>Sat, 16 Aug 2025 12:56:10 GMT</pubDate><content:encoded>&lt;p class=&quot;wp-block-paragraph&quot;&gt;Recently for a client, I was working to switch over from Make.com to their own n8n install in order to manage some automations. I was struggling to deal with &lt;a href=&quot;https://developer.monday.com/api-reference/reference/webhooks&quot;&gt;Monday.com&amp;#8217;s challenge response to the webhook&lt;/a&gt; using n8n. After some finagling with Claude and trial/error with &lt;code&gt;curl&lt;/code&gt;, I was able to build a workflow that got me through.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Here is the n8n workflow json that you can copy and paste:&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;Monday.com Webhook - Exact Documentation&quot;,
  &quot;nodes&quot;: &amp;#91;
    {
      &quot;parameters&quot;: {
        &quot;httpMethod&quot;: &quot;POST&quot;,
        &quot;path&quot;: &quot;monday-webhook&quot;,
        &quot;responseMode&quot;: &quot;responseNode&quot;,
        &quot;options&quot;: {}
      },
      &quot;name&quot;: &quot;Webhook&quot;,
      &quot;type&quot;: &quot;n8n-nodes-base.webhook&quot;,
      &quot;typeVersion&quot;: 1,
      &quot;position&quot;: &amp;#91;0, 0],
      &quot;webhookId&quot;: &quot;2e18be0d-ef25-4009-8724-8906e1700cb0&quot;,
      &quot;id&quot;: &quot;4f6c0d7e-cf39-4b04-af53-303ed741d388&quot;
    },
    {
      &quot;parameters&quot;: {
        &quot;conditions&quot;: {
          &quot;string&quot;: &amp;#91;
            {
              &quot;value1&quot;: &quot;={{ $json.body.challenge }}&quot;,
              &quot;operation&quot;: &quot;isNotEmpty&quot;
            }
          ]
        }
      },
      &quot;name&quot;: &quot;If Challenge Exists&quot;,
      &quot;type&quot;: &quot;n8n-nodes-base.if&quot;,
      &quot;typeVersion&quot;: 1,
      &quot;position&quot;: &amp;#91;200, 0],
      &quot;id&quot;: &quot;d39443cf-ebc2-4426-a612-852a482eb18b&quot;
    },
    {
      &quot;parameters&quot;: {
        &quot;respondWith&quot;: &quot;json&quot;,
        &quot;responseBody&quot;: &quot;={{ $node&amp;#91;\&quot;Webhook\&quot;].json&amp;#91;\&quot;body\&quot;] }}&quot;,
        &quot;options&quot;: {
          &quot;responseCode&quot;: 200
        }
      },
      &quot;name&quot;: &quot;Return Challenge JSON&quot;,
      &quot;type&quot;: &quot;n8n-nodes-base.respondToWebhook&quot;,
      &quot;typeVersion&quot;: 1,
      &quot;position&quot;: &amp;#91;400, -100],
      &quot;id&quot;: &quot;7faa215a-d4d2-466a-98f1-2f83331177e8&quot;
    },
    {
      &quot;parameters&quot;: {
        &quot;respondWith&quot;: &quot;json&quot;,
        &quot;responseBody&quot;: &quot;{\&quot;success\&quot;: true}&quot;,
        &quot;options&quot;: {
          &quot;responseCode&quot;: 200
        }
      },
      &quot;name&quot;: &quot;Return Success&quot;,
      &quot;type&quot;: &quot;n8n-nodes-base.respondToWebhook&quot;,
      &quot;typeVersion&quot;: 1,
      &quot;position&quot;: &amp;#91;400, 100],
      &quot;id&quot;: &quot;8faa215a-d4d2-466a-98f1-2f83331177e9&quot;
    }
  ],
  &quot;connections&quot;: {
    &quot;Webhook&quot;: {
      &quot;main&quot;: &amp;#91;
        &amp;#91;
          {
            &quot;node&quot;: &quot;If Challenge Exists&quot;,
            &quot;type&quot;: &quot;main&quot;,
            &quot;index&quot;: 0
          }
        ]
      ]
    },
    &quot;If Challenge Exists&quot;: {
      &quot;main&quot;: &amp;#91;
        &amp;#91;
          {
            &quot;node&quot;: &quot;Return Challenge JSON&quot;,
            &quot;type&quot;: &quot;main&quot;,
            &quot;index&quot;: 0
          }
        ],
        &amp;#91;
          {
            &quot;node&quot;: &quot;Return Success&quot;,
            &quot;type&quot;: &quot;main&quot;,
            &quot;index&quot;: 0
          }
        ]
      ]
    }
  },
  &quot;meta&quot;: {
    &quot;instanceId&quot;: &quot;f4e93957bea2bfbb949bc11ce90a97c3c32f37ea7ba5e965c8ac9cd10fea6dc3&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;From Claude, here is a full breakdown of the nodes:&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Workflow Overview&lt;/strong&gt;&lt;/h2&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;This workflow handles Monday.com webhook verification and events with 4 nodes connected in a branching pattern.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Node 1: Webhook (Entry Point)&lt;/strong&gt;&lt;/h3&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;&quot;name&quot;: &quot;Webhook&quot;
&quot;type&quot;: &quot;n8n-nodes-base.webhook&quot;
&lt;/code&gt;&lt;/pre&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Receives incoming HTTP POST requests from Monday.com&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;/webhook/monday-webhook&lt;/code&gt; &amp;#8211; This creates the endpoint URL&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Response Mode&lt;/strong&gt;: &lt;code&gt;responseNode&lt;/code&gt; &amp;#8211; Means it waits for another node to send the response (not immediate)&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Position&lt;/strong&gt;: &lt;code&gt;[0, 0]&lt;/code&gt; &amp;#8211; Located at the start of the workflow visually&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Webhook ID&lt;/strong&gt;: A unique identifier for this webhook instance&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Node 2: If Challenge Exists (Decision Node)&lt;/strong&gt;&lt;/h3&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;&quot;name&quot;: &quot;If Challenge Exists&quot;
&quot;type&quot;: &quot;n8n-nodes-base.if&quot;
&lt;/code&gt;&lt;/pre&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Checks if the incoming request contains a &lt;code&gt;challenge&lt;/code&gt; field&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Condition&lt;/strong&gt;: &lt;code&gt;{{ $json.body.challenge }}&lt;/code&gt; with operation &lt;code&gt;isNotEmpty&lt;/code&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;This checks if there&amp;#8217;s a challenge field in the request body&lt;/li&gt;



&lt;li&gt;&lt;code&gt;$json.body&lt;/code&gt; refers to the parsed JSON body from the webhook&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Branching&lt;/strong&gt;: Creates two paths:
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;True branch&lt;/strong&gt; (index 0): Goes to &amp;#8220;Return Challenge JSON&amp;#8221;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;False branch&lt;/strong&gt; (index 1): Goes to &amp;#8220;Return Success&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Node 3: Return Challenge JSON (True Branch)&lt;/strong&gt;&lt;/h3&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;&quot;name&quot;: &quot;Return Challenge JSON&quot;
&quot;type&quot;: &quot;n8n-nodes-base.respondToWebhook&quot;
&lt;/code&gt;&lt;/pre&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Responds to Monday.com&amp;#8217;s verification challenge&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Response Type&lt;/strong&gt;: &lt;code&gt;json&lt;/code&gt;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Response Body&lt;/strong&gt;: &lt;code&gt;={{ $node[&quot;Webhook&quot;].json[&quot;body&quot;] }}&lt;/code&gt;
&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;This returns the ENTIRE body that was received&lt;/li&gt;



&lt;li&gt;Matches Monday&amp;#8217;s requirement: return exactly what they sent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Status Code&lt;/strong&gt;: 200&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Position&lt;/strong&gt;: &lt;code&gt;[400, -100]&lt;/code&gt; &amp;#8211; Positioned above (negative Y) the other response node&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Node 4: Return Success (False Branch)&lt;/strong&gt;&lt;/h3&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;&quot;name&quot;: &quot;Return Success&quot;
&quot;type&quot;: &quot;n8n-nodes-base.respondToWebhook&quot;
&lt;/code&gt;&lt;/pre&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Responds to regular webhook events (not challenges)&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Response Type&lt;/strong&gt;: &lt;code&gt;json&lt;/code&gt;&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Response Body&lt;/strong&gt;: &lt;code&gt;{&quot;success&quot;: true}&lt;/code&gt; &amp;#8211; A simple success acknowledgment&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Status Code&lt;/strong&gt;: 200&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Position&lt;/strong&gt;: &lt;code&gt;[400, 100]&lt;/code&gt; &amp;#8211; Positioned below (positive Y) the challenge response&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Connections (Workflow Logic)&lt;/strong&gt;&lt;/h3&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;&quot;connections&quot;: {
  &quot;Webhook&quot;: → &quot;If Challenge Exists&quot;
  &quot;If Challenge Exists&quot;: 
    - &amp;#91;True] → &quot;Return Challenge JSON&quot;
    - &amp;#91;False] → &quot;Return Success&quot;
}
&lt;/code&gt;&lt;/pre&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Flow Scenarios&lt;/strong&gt;&lt;/h3&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Scenario 1: Monday.com sends verification challenge&lt;/strong&gt;&lt;/p&gt;



&lt;ol class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Monday sends: {&amp;#8220;challenge&amp;#8221;: &amp;#8220;abc123xyz&amp;#8221;}&lt;/li&gt;



&lt;li&gt;Webhook receives it&lt;/li&gt;



&lt;li&gt;IF node checks: Is challenge present? YES&lt;/li&gt;



&lt;li&gt;Return Challenge JSON sends back: {&amp;#8220;challenge&amp;#8221;: &amp;#8220;abc123xyz&amp;#8221;}&lt;/li&gt;



&lt;li&gt;Monday.com verifies and activates webhook&lt;/li&gt;
&lt;/ol&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Scenario 2: Monday.com sends actual webhook event&lt;/strong&gt;&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Monday sends: {&amp;#8220;event&amp;#8221;: {&amp;#8220;type&amp;#8221;: &amp;#8220;item_created&amp;#8221;, &amp;#8230;}}&lt;/li&gt;



&lt;li&gt;Webhook receives it&lt;/li&gt;



&lt;li&gt;IF node checks: Is challenge present? NO&lt;/li&gt;



&lt;li&gt;Return Success sends back: {&amp;#8220;success&amp;#8221;: true}&lt;/li&gt;



&lt;li&gt;Monday.com knows event was received&lt;/li&gt;
&lt;/ul&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Key Design Elements&lt;/strong&gt;&lt;/h3&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Response Mode&lt;/strong&gt;: Uses &lt;code&gt;responseNode&lt;/code&gt; pattern where the webhook waits for explicit response nodes&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Expression Syntax&lt;/strong&gt;: Uses n8n&amp;#8217;s &lt;code&gt;={{}}&lt;/code&gt; expression format for dynamic values&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Node References&lt;/strong&gt;: &lt;code&gt;$node[&quot;Webhook&quot;].json[&quot;body&quot;]&lt;/code&gt; allows accessing data from previous nodes&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Conditional Branching&lt;/strong&gt;: The IF node splits the flow based on whether it&amp;#8217;s a verification or regular event&lt;/li&gt;
&lt;/ul&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;This workflow elegantly handles both Monday.com&amp;#8217;s webhook verification process and ongoing event processing in a single, simple flow.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Testing the Monday.com Webhook with cURL&lt;/h2&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Based on the workflow structure, here are the test commands:&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;&lt;strong&gt;Test 1: Challenge Verification (What Monday.com sends during setup)&lt;/strong&gt;&lt;/h3&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;bash&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;curl -X POST https://your-n8n-instance-url.com/webhook/monday-webhook \
  -H &quot;Content-Type: application/json&quot; \
  -d &apos;{&quot;challenge&quot;: &quot;3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P&quot;}&apos; \
  -v&lt;/code&gt;&lt;/pre&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;strong&gt;Expected Response:&lt;/strong&gt;&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;json&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;{&quot;challenge&quot;: &quot;3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P&quot;}&lt;/code&gt;&lt;/pre&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Status: 200 OK&lt;/li&gt;



&lt;li&gt;The workflow should echo back the exact JSON it received&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>My $100 Claude Code Subscription is a Steal (for me), and I Have the Receipts to Prove It</title><link>https://ashrafali.net/my-100-claude-code-subscription-is-a-steal-for-me-and-i-have-the-receipts-to-prove-it/</link><guid isPermaLink="false">https://ashrafali.net/?p=2996</guid><description>I&amp;#8217;m truly happy with my $100/month Claude Max subscription. Generally speaking, it works great for me, but the one catch is that I sometimes hit my usage limits. When that happens, I just have to wait for the five-hour reset. My own little timeout in the corner. So, I found this nifty utility from khromov called claude-code-off-switcher, which [&amp;hellip;]</description><pubDate>Fri, 18 Jul 2025 09:24:37 GMT</pubDate><content:encoded>&lt;p class=&quot;wp-block-paragraph&quot;&gt;I&amp;#8217;m truly happy with my $100/month Claude Max subscription. Generally speaking, it works great for me, but the one catch is that I sometimes hit my usage limits. When that happens, I just have to wait for the five-hour reset. My own little timeout in the corner.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;So, I found this nifty utility from&amp;nbsp;khromov&amp;nbsp;called&amp;nbsp;&lt;a href=&quot;https://github.com/khromov/claude-code-auth-switcher&quot;&gt;claude-code-off-switcher&lt;/a&gt;, which makes it super easy to flip between my personal plan and the pay-as-you-go API.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Just for fun, I wanted to run a quick command on the API to see how much it would cost. It started creeping up to $1.60 for a single test, and I realized this is the quickest way to burn my money.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Speaking of burning money, I got curious. I wanted to see exactly how much I&amp;nbsp;&lt;em&gt;would&lt;/em&gt;&amp;nbsp;have burned last month if I hadn&amp;#8217;t been on the subscription plan. I used the&amp;nbsp;&lt;a href=&quot;https://github.com/ryoppippi/ccusage&quot;&gt;ccusage&lt;/a&gt;&amp;nbsp;tool to find out (which is so light, it doesn&amp;#8217;t even need to be installed, you can just run it with one command).&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;And will you look at that:&lt;/p&gt;



&lt;figure class=&quot;wp-block-image size-full&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1958&quot; height=&quot;1770&quot; src=&quot;/wp-content/uploads/2025/07/CleanShot-2025-07-18-at-10.23.56@2x.png&quot; alt=&quot;&quot; class=&quot;wp-image-2998&quot; srcset=&quot;https://ashrafali.net/wp-content/uploads/2025/07/CleanShot-2025-07-18-at-10.23.56@2x.png 1958w, https://ashrafali.net/wp-content/uploads/2025/07/CleanShot-2025-07-18-at-10.23.56@2x-768x694.png 768w, /wp-content/uploads/2025/07/CleanShot-2025-07-18-at-10.23.56@2x-1536x1389.png 1536w&quot; sizes=&quot;auto, (max-width: 1958px) 100vw, 1958px&quot; /&gt;&lt;/figure&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Man, it makes my $100 subscription look absolutely fantastic in comparison.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Now, I just have to wait patiently for the clock to tick until the next reset.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;&lt;/p&gt;</content:encoded></item><item><title>It&amp;#8217;s the little details, like a curvy, wavy highlighting blue line ⇝</title><link>https://ashrafali.net/its-the-little-details-like-a-curvy-wavy-highlighting-blue-line/</link><guid isPermaLink="false">https://ashrafali.net/?p=2962</guid><description>I was absolutely floored by this tiny design touch on Making Software, a new book being written by Dan Hollick. The content is already interesting and warrants a full read, but, look! It colors the line blue and highlights it with a squiggly blue underline. Just delightful! It felt like I was underlining it with [&amp;hellip;]</description><pubDate>Mon, 14 Jul 2025 12:36:37 GMT</pubDate><content:encoded>&lt;p class=&quot;wp-block-paragraph&quot;&gt;I was absolutely floored by this tiny design touch on &lt;a href=&quot;http://makingsoftware.com&quot; data-type=&quot;link&quot; data-id=&quot;makingsoftware.com&quot;&gt;Making Software&lt;/a&gt;, a new book being written by Dan Hollick. The content is already interesting and warrants a full read, but, look!&lt;/p&gt;



&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img decoding=&quot;async&quot; src=&quot;/wp-content/uploads/2025/07/Highlight-Effect-on-Making-Software-Website.gif&quot; alt=&quot;Highlight Effect on Making Software&quot; title=&quot;Highlight Effect on Making Software Website.gif&quot;/&gt;&lt;/figure&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;It colors the line blue and highlights it with a squiggly blue underline. Just delightful! It felt like I was underlining it with a blue pen myself. The website was built in Next.JS and I really wanted to understand how it was recreated. So I asked Claude Code to look at the site and see how it was done using the Playwright MCP. After a few minutes, it recreated it in a demo file. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Here is the &lt;a href=&quot;https://codepen.io/nerveband/pen/yyYNOJK&quot;&gt;Codepen&lt;/a&gt; to try it yourself:&lt;/p&gt;



&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;light&quot; data-default-tab=&quot;css,result&quot; data-slug-hash=&quot;yyYNOJK&quot; data-pen-title=&quot;Blue Highlight Wavy Effect&quot; data-user=&quot;nerveband&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/nerveband/pen/yyYNOJK&quot;&gt;
  Blue Highlight Wavy Effect&lt;/a&gt; by Ashraf Ali (&lt;a href=&quot;https://codepen.io/nerveband&quot;&gt;@nerveband&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;




&lt;p class=&quot;wp-block-paragraph&quot;&gt;The font on the diagrams are set in &lt;a href=&quot;https://departuremono.com/&quot;&gt;Departure Mono&lt;/a&gt;, a free, open source font with a type specimen that has playful feel.&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;link-blog-domain-links&quot;&gt;&lt;a href=&quot;https://makingsoftware.com&quot;&gt;makingsoftware.com&lt;/a&gt;&lt;/div&gt;</content:encoded></item><item><title>Losing the Signal: How My &amp;#8220;Perfect&amp;#8221; Tool Revealed a Deeper Problem with Time</title><link>https://ashrafali.net/losing-the-signal-how-my-perfect-tool-revealed-a-deeper-problem/</link><guid isPermaLink="false">https://ashrafali.net/?p=2955</guid><description>I built a tool to transcribe incoming WhatsApp voice notes, and it&amp;#8217;s awesome. It&amp;#8217;s one of my first vibe-coded tools and the main tool that has daily, practical benefit for me. I used to get a lot of voice notes. All the time. It&amp;#8217;s easier for folks to voice note than write out their thoughts, [&amp;hellip;]</description><pubDate>Sun, 13 Jul 2025 13:05:00 GMT</pubDate><content:encoded>&lt;p class=&quot;wp-block-paragraph&quot;&gt;I built a tool to &lt;a href=&quot;https://github.com/nerveband/whatsapp_voice_transcription&quot;&gt;transcribe incoming WhatsApp voice notes&lt;/a&gt;, and it&amp;#8217;s awesome. It&amp;#8217;s one of my first vibe-coded tools and the main tool that has daily, practical benefit for me. &lt;br&gt;&lt;br&gt;I used to get a lot of voice notes. All the time. It&amp;#8217;s easier for folks to voice note than write out their thoughts, so I get it. Yet, I was often in situations where I couldn&amp;#8217;t actually listen to these voice notes. I whipped this tool up (before Meta enabled their &lt;a href=&quot;https://faq.whatsapp.com/241617298315321/?cms_platform=iphone&amp;amp;helpref=platform_switcher&quot;&gt;client-side transcribe function&lt;/a&gt; which is a hit or miss) using the &lt;a href=&quot;https://github.com/WhiskeySockets/Baileys&quot;&gt;Baileys&lt;/a&gt; framework. It runs locally on my machine, monitors for incoming voice messages, sends them to the cloud for transcription and summarization, and then sends both back to me.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Now, let&amp;#8217;s put aside the obvious security implications—I&amp;#8217;m effectively obviating the point of an encrypted protocol by intercepting the messages myself. For me personally, the convenience is worth the security trade-off. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;The real negative of the tool, however, is what gets lost in translation. Case in point: I recently received a voice message where the&amp;nbsp;&lt;em&gt;tone&lt;/em&gt;&amp;nbsp;conveyed a completely different meaning than the text of the transcript or the summary. It was far more beneficial to hear that voice note, even at 2x speed, than it was to just rely on the text. I know sentiment analysis exists, and screenplays have dealt with translating paper to a cinematic format for ages, but voice is another layer of communication for human beings. Text just doesn&amp;#8217;t cut it.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Human beings rely on so many cues. &lt;a href=&quot;https://en.wikipedia.org/wiki/FaceTime&quot;&gt;FaceTime was groundbreaking when it first came out&lt;/a&gt; with the iPhone 4 release, but even &lt;em&gt;it&lt;/em&gt; doesn&amp;#8217;t hit the mark for me. You need the gestures, the way someone shifts in their seat, the intonation of their voice, how loud or soft they are, or how they say nothing at all. All of it communicates so much.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I remember &lt;a href=&quot;https://news.stanford.edu/stories/2021/02/four-causes-zoom-fatigue-solutions&quot;&gt;reading somewhere&lt;/a&gt; that Zoom calls are so tiring because your brain is constantly and tirelessly looking for those extra signals of connection that are so natural in person. Because you&amp;#8217;re on a screen, you can&amp;#8217;t get them, but your brain exhausts itself trying. To me, that makes perfect sense. I can be in multiple in-person meetings and not feel nearly as tired as I do after a single Zoom session.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;This extends to remote work culture. Some companies just use Slack and calls, while others try to replicate a virtual office with persistent rooms you can join. I find that somewhat invasive, like someone is looking over your shoulder the entire time. Even with the camera off, I freak out that I might accidentally unmute myself or that someone will walk into my room and I&amp;#8217;ll suddenly be exposed. I don&amp;#8217;t feel like I have control over my space or my privacy.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;In addition, creative work requires you to get into &lt;a href=&quot;https://en.wikipedia.org/wiki/Flow_(psychology)&quot;&gt;a flow state&lt;/a&gt;, to have uninterrupted time. I turn off notifications for most of my apps, especially ticket-driving ones like Jira or Trello or Front. I don&amp;#8217;t know how people deal with the constant pings, just like an inbox where the number keeps going up—one, two, three, four, five. It creates so much unnecessary anxiety about what you haven&amp;#8217;t gotten to and what you have to do next. It&amp;#8217;s so overwhelming.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;We need the sanctity and safety to get away from our coworkers, but in an always-online environment, we&amp;#8217;re all expected to respond quicker. It seems like everyone has the ability to interrupt you with any notification at any time. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;A few years back, I remember distinctly this moment, being in Death Valley with friends, gazing up at the stars, when I got a call from a friend telling me his father was going to die soon. I couldn&amp;#8217;t be in the moment. And to be honest, my cell phone shouldn&amp;#8217;t have been on. What would have been wrong if I had responded a few hours later? Why do we need this immediacy?&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;All these apps are constantly vying for our attention. Just one more click, one more like, and we feed their algorithms and someone else&amp;#8217;s curiosity. I&amp;#8217;m guilty of this, too, wondering why someone hasn&amp;#8217;t responded to my text after a couple of hours. How did I create that same expectation for myself and others? It wasn&amp;#8217;t always like this.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;These devices are hijacking our minds and creating anxiety. We need a notification diet. One of my favorite things is switching the action button on my iPhone to &amp;#8220;Do Not Disturb.&amp;#8221; One click, and I know my phone won&amp;#8217;t buzz. I need that ability to just turn everything off.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I do think we can (and should) fight back in gentle (and more forceful) ways. My way is turning off notifications, responding on my own schedule, taking intentional breaks, and eating without a screen. I try to communicate in person first, then by phone call, then voice note, and only then text. &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;This is also why I love backpacking and why I keep going: I&amp;#8217;m always chasing a feeling I had in my second time to Wyoming. We had an easy day, so I just sat in my chair, took off my shoes, and let my feet touch the grass. I remember just observing the details: the bright, verdant blades of grass, the undisturbed blue sky, the flowers swaying slightly. The weather was pristine. And for a moment, my brain quieted down. There was no cell signal. I couldn&amp;#8217;t escape the moment. That was&amp;nbsp;&lt;em&gt;my&lt;/em&gt;&amp;nbsp;moment. And it was so damn beautiful.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Mindfulness experts say you can achieve this in daily life. I believe that. As a Muslim, I pray five times a day, and we have the concept of&amp;nbsp;&lt;em&gt;khushu&lt;/em&gt;—an intentional focus on God. You train yourself to concentrate your thoughts, because distraction is inherent in the human mind. In a world that&amp;#8217;s constantly stealing our attention, it&amp;#8217;s so important that we claim these moments for ourselves.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;So I&amp;#8217;m telling myself in the mirror: How do I grasp on to the moment? &lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Sometimes I calm my nervous system just by touching my wife&amp;#8217;s shoulder or getting an intense hug from a friend. Those moments of touch can interrupt the never-ending flow of anxious thoughts. I can push back.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I&amp;#8217;m trying, slowly, to win back my attention, to win back my intentionality, to set my boundaries clearly so that I can be still. The chaos of the world will never go away, so I have to live in the moment. As one of my favorite writers, Oliver Burkeman says in&amp;nbsp;&lt;em&gt;Four Thousand Weeks&lt;/em&gt;, you only get this time. Don&amp;#8217;t let another notification take you away from yourself.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;If you have any other tips, send me an &lt;a href=&quot;mailto:hello@ashrafali.net&quot;&gt;email&lt;/a&gt;. I&amp;#8217;d love to hear them.&lt;/p&gt;</content:encoded></item><item><title>English in, CLI out: Natural Language is Sweet</title><link>https://ashrafali.net/english-in-cli-out-natural-language-is-sweet/</link><guid isPermaLink="false">https://ashrafali.net/?p=2952</guid><description>I&amp;#8217;m curious if we&amp;#8217;re reaching a point where using an LLM as a general-purpose interpreter (one that has access to context, tooling, and function calling) can effectively replace the need to build custom tools. If an AI can call actions based on natural human language, why would I need to build a bespoke app? For [&amp;hellip;]</description><pubDate>Sat, 12 Jul 2025 09:58:00 GMT</pubDate><content:encoded>&lt;p class=&quot;wp-block-paragraph&quot;&gt;I&amp;#8217;m curious if we&amp;#8217;re reaching a point where using an LLM as a general-purpose interpreter (one that has access to context, tooling, and function calling) can effectively replace the need to build custom tools. If an AI can call actions based on natural human language, why would I need to build a bespoke app?&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;For instance, I&amp;#8217;ve been experimenting with this exact idea by using a Todoist MCP (Model Context Protocol) server and a Playwright MCP, I can essentially talk to any website, even if I don&amp;#8217;t have API access. The AI can scrape the information I need locally, parse it, and then turn it into tasks automatically in Todoist. All of this is driven by simple, natural language queries.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Honestly, if I take it a step further and just pair that setup with a good voice model from OpenAI, ElevenLabs, or Deepgram, I could just talk to my system. I&amp;#8217;d effectively have a walking, talking assistant that I pay next to nothing for, one that can manage and manipulate all of my personal tools. That&amp;#8217;s really cool, and the 9-year-old hacker inside me would be in shock.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;My next step is to see if I can create a robot that connects to my Claude Code instance. Could it take the context from my tools, feed it back to me like a human, and allow me to have a two-way conversation to get things done? This would be a system that works with &lt;em&gt;all&lt;/em&gt; of my tools, not just the ones that OpenAI or other big companies decide to expose in their app-store-ified ecosystems (looks like someone has built a somewhat clunky/cool version that I&amp;#8217;ve played with called &lt;a href=&quot;https://getvoicemode.com/&quot;&gt;Voice Mode&lt;/a&gt;).&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;On that note, I&amp;#8217;d really appreciate the first developer who figures out how to run MCP servers directly on an iPhone. That would be a huge deal. We&amp;#8217;ll probably end up putting them on the web first because servers are just easier for these models to handle, but being able to do it all locally on-device would be incredible. We would get to control the interaction &lt;em&gt;and&lt;/em&gt; retain our own data.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;I look forward to the future where we can run a local LLM and do all of these things privately and offline. We&amp;#8217;ll each have our own personal robots working on our own computers, tasked with whatever we need them to do, so we can finally offload the difficulty of the mundane. Please, someone speed up with affordable laundry robots. Thank you :)&lt;/p&gt;</content:encoded></item><item><title>Power Users Are Stuck Between the Desktop Website and a Limited Mobile App</title><link>https://ashrafali.net/power-users-are-stuck-between-the-desktop-website-and-a-limited-mobile-app/</link><guid isPermaLink="false">https://ashrafali.net/?p=2944</guid><description>I often feel very stuck trying to do power-user things on my phone. It can be something as simple as file converting or as complex as finding a setting buried in a byzantine menu. The frustrating part is that phones today can absolutely handle the performance needs; developers just refuse to expose that capability for [&amp;hellip;]</description><pubDate>Fri, 11 Jul 2025 10:55:47 GMT</pubDate><content:encoded>&lt;p class=&quot;wp-block-paragraph&quot;&gt;I often feel very stuck trying to do power-user things on my phone. It can be something as simple as file converting or as complex as finding a setting buried in a byzantine menu.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;The frustrating part is that phones today can absolutely handle the performance needs; developers just refuse to expose that capability for a myriad of reasons. My guess is it’s a mix of a smaller technical audience on mobile and the headache of dealing with constantly changing APIs. Or maybe it’s Apple&amp;#8217;s HIG principles and their insistence on dumbing down every interface to its simplest form (which has its pros and cons) but at the end of the day, no one wants to deal with 4,000 little switches just to get one thing working.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;Still, I believe the balance has fallen on the side of &amp;#8220;easy to use&amp;#8221; far more often than it has on the &amp;#8220;growing power user&amp;#8221; path. I find myself constantly using the desktop version of a service in mobile Safari, and it performs perfectly fine, so performance clearly isn&amp;#8217;t the barrier. The truth is, there probably isn&amp;#8217;t enough demand for most people to want these tools, and it takes significant upkeep to expose highly technical features on a device that struggles to show that much density at once (though, in my opinion, that&amp;#8217;s a lame excuse).&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;The friction of mobile development, with its restrictive APIs and the entitlements required for app stores, just disenfranchises developers from even attempting to make more technically capable tools. This is why I love that tools like Claude Code are making it easier for me to build my own power tools that run on the web, which I can spin up and deploy quickly to bypass those restrictions. I&amp;#8217;m just going to keep tapping into that potential because it&amp;#8217;s there.&lt;/p&gt;



&lt;p class=&quot;wp-block-paragraph&quot;&gt;As a side note: this is also the huge advantage of a home lab (which I know the majority of people will never get into). Being able to spin up your own tools, host them on your own server, and use them remotely to do whatever you want? That&amp;#8217;s pretty neat. Now where do I find an extra Mac to play &amp;#8220;server&amp;#8221; with me? :)&lt;/p&gt;</content:encoded></item></channel></rss>