<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dave Mackey</title>
    <description>The latest articles on DEV Community by Dave Mackey (@davidshq).</description>
    <link>https://dev.to/davidshq</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F132908%2F233b6099-b7cf-4fd6-abdb-24ed5872a18a.jpeg</url>
      <title>DEV Community: Dave Mackey</title>
      <link>https://dev.to/davidshq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/davidshq"/>
    <language>en</language>
    <item>
      <title>Supabase CLI and Docker Mounts Denied</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Fri, 22 Aug 2025 18:25:19 +0000</pubDate>
      <link>https://dev.to/davidshq/supabase-cli-and-docker-mounts-denied-2foj</link>
      <guid>https://dev.to/davidshq/supabase-cli-and-docker-mounts-denied-2foj</guid>
      <description>&lt;p&gt;It was supposed to be simple. I've worked with Supabase before. I've used the Supabase CLI before. This shouldn't take long.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx supabase start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The Docker images are downloaded successfully and the containers are being built when:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;br&gt;
 &lt;code&gt;failed to start docker container: Error response from daemon: mounts denied:                                      &lt;br&gt;
The path /socket_mnt/home/username/.docker/desktop/docker.sock is &amp;gt; not shared from the host and is not known to Docker.&lt;br&gt;
You can configure shared paths from Docker -&amp;gt; Preferences... -&amp;gt; Resources -&amp;gt; File Sharing.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ummm, what?&lt;/p&gt;

&lt;p&gt;The Supabase CLI doesn't place the Docker files into one's repo - it's meant to be transparent. That's great until one runs into problems.&lt;/p&gt;

&lt;p&gt;I found a &lt;a href="https://github.com/supabase/cli/issues/3593" rel="noopener noreferrer"&gt;Supabase CLI issue on GitHub&lt;/a&gt; that discusses the problem. The problem seems to only occur when using Analytics. The easiest workaround is to update the &lt;code&gt;config.toml&lt;/code&gt; for one's project from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[analytics]
enabled = false
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[analytics]
enabled = true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No, I don't like this solution...but it is the easiest (assuming you don't need analytics).&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>docker</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Thoughts on StackOverflow 2025 Developer Survey</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Mon, 04 Aug 2025 17:04:15 +0000</pubDate>
      <link>https://dev.to/davidshq/thoughts-on-stackoverflow-2025-developer-survey-part-1-3d5o</link>
      <guid>https://dev.to/davidshq/thoughts-on-stackoverflow-2025-developer-survey-part-1-3d5o</guid>
      <description>&lt;p&gt;This isn't a systematic analysis of &lt;a href="https://survey.stackoverflow.co/2025" rel="noopener noreferrer"&gt;StackOverflow's 2025 Developer Survey&lt;/a&gt;, it's the random tidbits I found most interesting.&lt;/p&gt;

&lt;p&gt;(Okay, this was taking way longer than I anticipated, I'm breaking it up into two parts but also, I'm being long-winded. :-P Usually I go back and trim things down but if I don't post this now, I never will).&lt;/p&gt;

&lt;h2&gt;
  
  
  Developers Profile
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I'd like to see educational degrees split up by area of study. I've been doing this for years and have a B.S. but it's not even tangentially related to coding.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technology
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It would be great to see these results graphed over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Programming Languages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I appreciate that SO broke out JS and TS as two separate entries, but I'd also love to know what the percentage is when the two are combined. There would be a lot of overlap so it isn't as simple as adding the two percentages together.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Databases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL dominating isn't surprising.&lt;/li&gt;
&lt;li&gt;I'm a little surprised that Valkey is relatively low (2.4%) compared to Redis (28%). I'll be interested to see if these percentages shift significantly in the next 12 months.&lt;/li&gt;
&lt;li&gt;It's interesting that Supabase is broke out separately from PostgreSQL, as under the hood it is PostgreSQL.&lt;/li&gt;
&lt;li&gt;I find it OpenSearch doesn't appear on the list. I'm wondering if many OpenSearch folks checked off Elasticsearch because that is what was listed?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cloud development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;This is an interesting list, a number of the tools on this list can be used in cloud development but I wouldn't consider them cloud development tools (e.g. npm, pip, homebrew...).&lt;/li&gt;
&lt;li&gt;I'd maybe consolidate this list a bit to:

&lt;ul&gt;
&lt;li&gt;Docker - 71.1%&lt;/li&gt;
&lt;li&gt;AWS - 43.3%&lt;/li&gt;
&lt;li&gt;Kubernetes - 28.5%&lt;/li&gt;
&lt;li&gt;Microsoft Azure - 26.3%&lt;/li&gt;
&lt;li&gt;Google Cloud - 24.6%&lt;/li&gt;
&lt;li&gt;Cloudflare - 20.1%&lt;/li&gt;
&lt;li&gt;Terraform - 17.8%&lt;/li&gt;
&lt;li&gt;Firebase - 13.1%&lt;/li&gt;
&lt;li&gt;Digital Ocean - 10.7%&lt;/li&gt;
&lt;li&gt;Vercel - 10.6%&lt;/li&gt;
&lt;li&gt;Netlify - 5.9%&lt;/li&gt;
&lt;li&gt;Supabase - 5.4%&lt;/li&gt;
&lt;li&gt;Heroku - 5.4%&lt;/li&gt;
&lt;li&gt;IBM Cloud - 1.2%&lt;/li&gt;
&lt;li&gt;Yandex Cloud - 0.7%&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;I'm not familiar with all the tooling on the list, which should be on there that I didn't include? There were a few that were uncertain for me...&lt;/li&gt;

&lt;li&gt;I consider knowing Docker to be essential for developers working with the web. If you don't know it or a comparable containerization technology and are looking for a job - learn it, please. :)&lt;/li&gt;

&lt;li&gt;Cloudflare has really been stepping up its offerings on a continuous basis and are impressively close to Google Cloud and Microsoft Azure, much older players in the space.&lt;/li&gt;

&lt;li&gt;Supabase has acquired a respectable 5.4%, I anticipate that continuing to increase and would be surprised if some of that growth doesn't come at Firebase's expense.&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Web Frameworks and Technologies
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Wow, there is a lot of tech lumped in here. Let's break this down a bit:&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  JS/TS
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Runtimes

&lt;ul&gt;
&lt;li&gt;Node.js - 48.7%&lt;/li&gt;
&lt;li&gt;Deno - 4%&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Frontend Frameworks

&lt;ul&gt;
&lt;li&gt;React - 44.7%&lt;/li&gt;
&lt;li&gt;jQuery - 23.4%&lt;/li&gt;
&lt;li&gt;Angular - 18.2%&lt;/li&gt;
&lt;li&gt;Vue.js - 17.6%&lt;/li&gt;
&lt;li&gt;AngularJS - 7.2%&lt;/li&gt;
&lt;li&gt;Svelte - 7.2%&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Server Side

&lt;ul&gt;
&lt;li&gt;Next.js - 20.8%&lt;/li&gt;
&lt;li&gt;Express - 19.9%&lt;/li&gt;
&lt;li&gt;NestJS - 6.7%&lt;/li&gt;
&lt;li&gt;Astro - 4.5%&lt;/li&gt;
&lt;li&gt;Nuxt.js - 4%&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  .NET
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;ASP.NET Core - 19.7%&lt;/li&gt;
&lt;li&gt;ASP.NET - 14.2%&lt;/li&gt;
&lt;li&gt;Blazor - 7%&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Python
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI - 14.8%&lt;/li&gt;
&lt;li&gt;Flask - 14.4%&lt;/li&gt;
&lt;li&gt;Django - 12.6%&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  PHP
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;WordPress - 13.6%&lt;/li&gt;
&lt;li&gt;Laravel - 8.9%&lt;/li&gt;
&lt;li&gt;Symfony - 4%&lt;/li&gt;
&lt;li&gt;Drupal - 2.2%&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Java
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Spring Boot - 14.7%&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Ruby
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ruby on Rails - 5.9%&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dev IDEs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;As with Web Frameworks lets break things down a bit here:&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Language Agnostic
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Visual Studio Code - 75.9%&lt;/li&gt;
&lt;li&gt;Visual Studio - 29% (agnostic-ish)&lt;/li&gt;
&lt;li&gt;Notepad++ - 27.4%&lt;/li&gt;
&lt;li&gt;IntelliJ IDEA - 27.1% (agnostic-ish)&lt;/li&gt;
&lt;li&gt;Vim - 24.3%&lt;/li&gt;
&lt;li&gt;Cursor - 17.9% - AI&lt;/li&gt;
&lt;li&gt;Neovim - 14%&lt;/li&gt;
&lt;li&gt;Nano - 12.2%

&lt;ul&gt;
&lt;li&gt;More a text editor than an IDE.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Sublime Text - 10.5%&lt;/li&gt;

&lt;li&gt;Claude Code - 9.7% - AI

&lt;ul&gt;
&lt;li&gt;This isn't really an IDE in any traditional sense.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Zed - 7.3%

&lt;ul&gt;
&lt;li&gt;I haven't had a chance to use it, but I love that it is native code, not running on a browser.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Eclipse - 7.1%&lt;/li&gt;

&lt;li&gt;VSCodium - 6.2%&lt;/li&gt;

&lt;li&gt;Windsurf - 4.9% - AI&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Java
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;IntelliJ IDEA - 27.1%&lt;/li&gt;
&lt;li&gt;Eclipse - 7.1%&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Python
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;PyCharm - 15%&lt;/li&gt;
&lt;li&gt;Jupyter Nb/JupyterLab - 14.1%&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Android
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Android Studio - 15%

&lt;ul&gt;
&lt;li&gt;I'd really like to see a competitor to this.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h4&gt;
  
  
  Apple
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Xcode - 10%&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  JS / TS
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;WebStorm - 7.6%&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  .NET
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Visual Studio - 29%&lt;/li&gt;
&lt;li&gt;Rider - 7.1%

&lt;ul&gt;
&lt;li&gt;I tend to use both VS and Rider when working on .NET projects, with a preference for Rider.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  PHP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PhpStorm - 5.8%&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Rust
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;RustRover - 3.2%&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  RAD AI Tools
&lt;/h3&gt;

&lt;p&gt;I wouldn't consider these IDEs in any traditional sense.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lovable.dev - 2.4%&lt;/li&gt;
&lt;li&gt;Bolt - 2.3%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's worth noting that a huge number of these IDEs are created by JetBrains (IntelliJ IDEA, Android Studio, PyCharm, WebStorm, Rider, PhpStorm, RustRover)!&lt;/p&gt;

&lt;p&gt;If you know how to use one you will feel comfortable with others.&lt;/p&gt;

&lt;p&gt;Also worth noting is that a number of the options are forks of Visual Studio Code (e.g., Cursor, VSCodium, Windsurf) and as such use a browser under the hood. Traditionally this has run pretty smoothly but with AI I'm finding that the browser rendering engines seem to struggle - this is true across IDEs and other apps (e.g. Chrome/Edge, Spotify).&lt;/p&gt;

&lt;h2&gt;
  
  
  Large Language Models
&lt;/h2&gt;

&lt;p&gt;I've spent most of my time with OpenAI and Anthropic (Claude) models with minor experimentation with Gemini. I'm particularly interested in the Microsoft Phi-4 models as I think there is promise in smaller LLMs for many tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Documentation and Collaboration Tools
&lt;/h2&gt;

&lt;p&gt;This area could be split into a number of different areas and I wouldn't see a number of them as competitors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Version Control
&lt;/h3&gt;

&lt;p&gt;Both of the options here do a lot more than version control including CI/CD.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub - 81.1%&lt;/li&gt;
&lt;li&gt;GitLab - 35.6%&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Project Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Jira - 46.4%

&lt;ul&gt;
&lt;li&gt;This is common across the industry but I'm not sure I've met anyone who loves it.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Azure Devops - 16.6%

&lt;ul&gt;
&lt;li&gt;Is this where Devops fits? I've barely used it.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Trello - 13.7%

&lt;ul&gt;
&lt;li&gt;Now owned by Atlassian, who created Jira.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Asana - 4.4%&lt;/li&gt;

&lt;li&gt;Clickup - 3.9%

&lt;ul&gt;
&lt;li&gt;I am using this for some stuff currently and have found it to be a bit buggy.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Linear - 3.7%

&lt;ul&gt;
&lt;li&gt;I haven't used it recently, but when I did it was a pleasant experience.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Microsoft Planner - 2.9%&lt;/li&gt;

&lt;li&gt;Monday.com - 2.6%&lt;/li&gt;

&lt;li&gt;Redmine - 2.5%&lt;/li&gt;

&lt;li&gt;Airtable - 2.5%

&lt;ul&gt;
&lt;li&gt;I like this, it does more than project management...I'm not sure where to put it.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;YouTrack - 2.4%&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Collaboration / Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Markdown - 34.8%

&lt;ul&gt;
&lt;li&gt;I love markdown.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Confluence - 32.8%

&lt;ul&gt;
&lt;li&gt;Also by Atlassian, I like it more than Jira.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Notion - 16.5%&lt;/li&gt;

&lt;li&gt;Obsidian - 16.1%

&lt;ul&gt;
&lt;li&gt;This is for editing/managing markdown.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Google Workspace - 15.2%&lt;/li&gt;

&lt;li&gt;Miro - 14.3%

&lt;ul&gt;
&lt;li&gt;Whiteboard&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Wikis - 10.4%

&lt;ul&gt;
&lt;li&gt;Best of both worlds is if you can use markdown in repos and have it fed into your wiki which covers more than individual repos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Google Colab - 7%

&lt;ul&gt;
&lt;li&gt;I see this as more like Jupyter.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Lucid (Lucidchart) - 5.3%

&lt;ul&gt;
&lt;li&gt;Whiteboard and Diagrams&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Doxygen - 4.3%&lt;/li&gt;

&lt;li&gt;Stack Overflow for Teams - 2.4%&lt;/li&gt;

&lt;li&gt;Coda - 1%

&lt;ul&gt;
&lt;li&gt;Similar to Notion&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Operating Systems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It took me a long time to get used to the fact that folks preferred Macs over Windows or Linux for coding. I think I've been around computers for too long and pre-*nix Mac I associated with artistic creative endeavors.&lt;/li&gt;
&lt;li&gt;The stat about Android exceeding Ubuntu usage is a bit confusing. People are doing significant amounts of development on Android? I find that hard to believe (unless its due to economic constraints).&lt;/li&gt;
&lt;li&gt;imho, following MacOS there should be a Linux category. Ubuntu, Linux (non-WSL), WSL, Debian, Arch, Fedora, Red Hat, etc. are all Linux distributions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI Agent Data Storage Tools
&lt;/h2&gt;

&lt;p&gt;I'm a bit surprised to see supabase clocking in here at 20.9%!&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Agent Orchestration Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ollama - 51.1%&lt;/li&gt;
&lt;li&gt;LangChain - 32.9%&lt;/li&gt;
&lt;li&gt;LangGraph - 16.2%&lt;/li&gt;
&lt;li&gt;Vertex AI - 15.1%&lt;/li&gt;
&lt;li&gt;Amazon Bedrock Agents - 14.5%&lt;/li&gt;
&lt;li&gt;OpenRouter - 13.4%&lt;/li&gt;
&lt;li&gt;Llama Index - 13.3%&lt;/li&gt;
&lt;li&gt;AutoGen (Microsoft) - 12%&lt;/li&gt;
&lt;li&gt;Zapier - 11.8%&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI Agent Observability and Security
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Grafana + Prometheus - 43%&lt;/li&gt;
&lt;li&gt;Sentry - 31.8%&lt;/li&gt;
&lt;li&gt;Snyk - 18.2%&lt;/li&gt;
&lt;li&gt;New Relic - 13%&lt;/li&gt;
&lt;li&gt;LangSmith - 12.5%&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI Agent Out-of-the-Box Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ChatGPT - 81.7%&lt;/li&gt;
&lt;li&gt;GitHub Copilot - 67.9%&lt;/li&gt;
&lt;li&gt;Google Gemini - 47.4%&lt;/li&gt;
&lt;li&gt;Claude Code - 40.8%&lt;/li&gt;
&lt;li&gt;Microsoft Copilot - 31.3%&lt;/li&gt;
&lt;li&gt;Perplexity - 16.2%&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Company Size
&lt;/h2&gt;

&lt;p&gt;I'm surprised by how few developers are working solo (3.9%)! &lt;/p&gt;

</description>
      <category>survey</category>
      <category>webdev</category>
      <category>programming</category>
      <category>learning</category>
    </item>
    <item>
      <title>The Dangers of Vibe Coding Part 1: Premature Optimization</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Wed, 23 Jul 2025 14:20:40 +0000</pubDate>
      <link>https://dev.to/davidshq/the-dangers-of-vibe-coding-part-1-premature-optimization-1125</link>
      <guid>https://dev.to/davidshq/the-dangers-of-vibe-coding-part-1-premature-optimization-1125</guid>
      <description>&lt;h1&gt;
  
  
  Stronger Hook in the Intro:
&lt;/h1&gt;

&lt;p&gt;I wrote this article, but I asked ChatGPT for recommendations on how to improve it. It suggested I needed a stronger hook for the intro and I enjoyed its suggestion:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I set out to build a simple browser extension. Two hours later, I was knee-deep in cyclomatic complexity metrics. Welcome to vibe coding with AI." -- ChatGPT.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Your Regularly Scheduled Intro...
&lt;/h2&gt;

&lt;p&gt;Funny, intelligent, and not at all the way I talk...anyways...&lt;/p&gt;

&lt;p&gt;I've noticed an issue I've run into repeatedly with vibe coding is premature optimization. It happened again with a simple browser extension (&lt;a href="https://github.com/davidshq/forgetfulme" rel="noopener noreferrer"&gt;ForgetfulMe&lt;/a&gt;) I'm vibing currently.&lt;/p&gt;

&lt;p&gt;No, I'm not talking about the AI doing premature optimization on its own (though that happens frequently). Instead, I'm talking about the AI tempting me to focus on premature optimization.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"&lt;strong&gt;TL;DR&lt;/strong&gt;: AI coding assistants are great at pointing out problems—but they also make it dangerously easy to procrastinate via premature optimization. In early-stage projects, chasing perfection can stall real progress." -- ChatGPT.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  The Temptations of AI Feedback
&lt;/h1&gt;

&lt;p&gt;One of my practices is to regularly ask the AI to create a markdown document with significant ways in which the code can be improved, bugs that need fixing, and best practices that aren't being followed. This works well, a little too well.&lt;/p&gt;

&lt;p&gt;For example, when I recently asked it to analyze the codebase for dead code it did so and included some additional tidbits such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;A. Overly Complex Functions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Several functions exceed the complexity limit of 10:&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;High Complexity Functions&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;handleMessage&lt;/code&gt; in &lt;code&gt;background.js&lt;/code&gt; (complexity: 19)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;handleSignup&lt;/code&gt; in &lt;code&gt;auth-ui.js&lt;/code&gt; (complexity: 11)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getBookmarks&lt;/code&gt; in &lt;code&gt;supabase-service.js&lt;/code&gt; (complexity: 16)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;categorizeError&lt;/code&gt; in &lt;code&gt;error-handler.js&lt;/code&gt; (complexity: 38)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getUserMessage&lt;/code&gt; in &lt;code&gt;error-handler.js&lt;/code&gt; (complexity: 21)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;createButton&lt;/code&gt; in &lt;code&gt;ui-components.js&lt;/code&gt; (complexity: 12)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;createFormField&lt;/code&gt; in &lt;code&gt;ui-components.js&lt;/code&gt; (complexity: 11)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;createListItem&lt;/code&gt; in &lt;code&gt;ui-components.js&lt;/code&gt; (complexity: 12)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;toSupabaseFormat&lt;/code&gt; in &lt;code&gt;bookmark-transformer.js&lt;/code&gt; (complexity: 15)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;: High - Reduces maintainability and testability&lt;br&gt;
&lt;strong&gt;Recommendation&lt;/strong&gt;: Break down into smaller, focused functions&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, none of that is good. It also reported on the files I have exceeding  300 lines, functions with too many parameters, and the list goes on.&lt;/p&gt;

&lt;p&gt;At other times it's recommended implementing dependency inversion, updating integration tests - you get the idea. &lt;/p&gt;

&lt;p&gt;It has an abundance of ways that I can and should improve the code base (now if only AI wrote a clean codebase to start with!).&lt;/p&gt;

&lt;h1&gt;
  
  
  Why It's a Trap
&lt;/h1&gt;

&lt;p&gt;The danger is that I get distracted from what I was actually trying to accomplish (building X feature or fixing Y bug) and spend precious time on refactoring.&lt;/p&gt;

&lt;p&gt;Yes, these things need to be done - but especially for early prototyping building something is more important than building something perfect.&lt;/p&gt;

&lt;p&gt;Even as I say that it sits poorly in my mouth. I like architecting things the right way, I don't like sloppy code. I'd rather take a little longer to implement things well than save some time writing messy code.&lt;/p&gt;

&lt;p&gt;But...&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;If AI is to be used productively we have to balance developing features against perfecting code. For side projects, for early prototyping too much optimization is a bad thing. Sure, the AI can do it for us, but (at least currently) this isn't a fast process and the hours we spend on refactoring are hours not spent on building out basic functionality.&lt;/p&gt;

&lt;p&gt;What do you think?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Have you caught yourself vibe coding into a refactoring rabbit hole? How do you balance AI feedback with actual progress?" -- ChatGPT.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  What Else Did ChatGPT Do?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;I followed its suggestion to break up a long paragraph.&lt;/li&gt;
&lt;li&gt;I also implemented section headings as it suggested, but generally used my own wording.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Difficulties of Being Neurodivergent (and/or Chronically Ill) at a Conference</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Sat, 26 Apr 2025 20:26:57 +0000</pubDate>
      <link>https://dev.to/davidshq/difficulties-of-being-neurodivergent-andor-chronically-ill-at-a-conference-4jpd</link>
      <guid>https://dev.to/davidshq/difficulties-of-being-neurodivergent-andor-chronically-ill-at-a-conference-4jpd</guid>
      <description>&lt;p&gt;[Thanks to &lt;a href="https://dev.to/sarahmatta"&gt;Sarah Matta&lt;/a&gt; for the photo which is of me as I begin a Lightning Talk at Haystack. See &lt;a href="https://www.linkedin.com/posts/sarah-matta_haystackconf-activity-7320915180639469569-N7nT" rel="noopener noreferrer"&gt;Sarah's LinkedIn post&lt;/a&gt; for original context.]&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I really enjoy going to conferences.&lt;br&gt;
They are awesome!&lt;br&gt;
I love the learning and the conversations!&lt;br&gt;
Simultaneously, I find them stressful and exhausting.&lt;/p&gt;

&lt;p&gt;Over time I have developed a growing awareness of how conferences affect me as well as various accommodations that improve my enjoyment, increase my participation, and minimize mental and physical health effects.&lt;/p&gt;

&lt;p&gt;Yesterday I returned from the &lt;a href="https://haystackconf.com/" rel="noopener noreferrer"&gt;Haystack US&lt;/a&gt; conference. It was AWESOME and yet it was also stretching and exhausting.&lt;/p&gt;

&lt;p&gt;Maybe for some neurodivergents conferences are easy-peasy, but I know I'm not alone in finding conferences difficult, so I want to share what I've learned. I'd also love to hear your thoughts on attending conferences and ways in which you've learned to help yourself experience and participate at maximal levels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Buffer The Conference
&lt;/h2&gt;

&lt;p&gt;I do much better when I arrive the day before a conference and leave the day after. I highly value both, but before the conference is essential. It allows me to get some rest and enter the conference with higher levels of energy and resilience.&lt;/p&gt;

&lt;p&gt;If I have my druthers I also like to tag an extra day on after the conference. This allows me to spend some time in the conference location being a tourist. This means I don't feel the need to try and cram this in during the conference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bring Supplies
&lt;/h2&gt;

&lt;p&gt;I like to bring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My laptop bag&lt;/li&gt;
&lt;li&gt;A laptop (duh) and the AC adapter&lt;/li&gt;
&lt;li&gt;Earbuds&lt;/li&gt;
&lt;li&gt;Tissues (allergies, cold, etc.)&lt;/li&gt;
&lt;li&gt;Note pad (for hand-written notes...okay, mainly for doodling)&lt;/li&gt;
&lt;li&gt;Pens (multiple!)&lt;/li&gt;
&lt;li&gt;Business cards (though I rarely hand these out these days, mainly connect via LinkedIn)&lt;/li&gt;
&lt;li&gt;Snacks (a decent variety including some that provide protein)&lt;/li&gt;
&lt;li&gt;Refillable water bottle (I use a Cirkul, the flavor helps me drink more)&lt;/li&gt;
&lt;li&gt;Deodorant&lt;/li&gt;
&lt;li&gt;Hand Sanitizer&lt;/li&gt;
&lt;li&gt;Medications (e.g. lactaid pills, acid reducers, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Giving Permission
&lt;/h2&gt;

&lt;p&gt;I find people are usually abundantly gracious towards others - and yet many of us struggle to show this grace to ourselves. There are rarely folks looking down on us for leaving early, taking a break instead of attending a session, or not proactively seeking out social conversations - but we often berate ourselves for this behavior.&lt;/p&gt;

&lt;p&gt;Here are a few ways I give myself permission during conferences:&lt;/p&gt;

&lt;h3&gt;
  
  
  Taking Breaks
&lt;/h3&gt;

&lt;p&gt;I allow myself not to attend a session (or multiple!) and to take a break. For me this can be a walk, a trip to a bookstore, or (most often) a nap. Sometimes this is because I'm not interested in any of the sessions available at the moment but more often it's because I need a break - and that's okay!&lt;/p&gt;

&lt;h3&gt;
  
  
  Missing Out
&lt;/h3&gt;

&lt;p&gt;What's harder is when there is something I really want to do and I have major FOMO but I need to skip it anyways. At Haystack I attended the BBQ on Monday night and it was awesome! On Tuesday, despite my strong desire, I skipped the meetup after the workshops. I knew I was depleted and that while I could be &lt;em&gt;physically&lt;/em&gt; present I likely wouldn't be intellectually or emotionally present.&lt;/p&gt;

&lt;p&gt;I left before the bitter end from the Wednesday dinner and excused myself early from the Thursday dinner.&lt;/p&gt;

&lt;p&gt;Why? On Wednesday it was because I knew I needed the rest to be ready for Thursday. On Thursday it was because I realized that I was already cooked. &lt;/p&gt;

&lt;h3&gt;
  
  
  Goofing Off
&lt;/h3&gt;

&lt;p&gt;I have an incredibly hard time sitting still during lectures (yes, I do have ADHD, thank you very much). I tend to battle this by taking fairly copious notes (yes, I know the slides are available, I'm typing so I stay focused!). But sometimes that isn't enough. You might catch me browsing the web, writing some code, or doodling on a piece of paper. &lt;/p&gt;

&lt;p&gt;I want to hear what the speakers have to say and at the same time sometimes I need a break. Rather than making myself miserable, I allow it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Securing Focus
&lt;/h3&gt;

&lt;p&gt;I cannot focus if there is noise around me - particularly if it is human voices. If I'm in a workshop or a presentation that involves extended concentration and interaction (e.g. setting up an infrastructure or writing code) and incidental conversation is occurring around me I'm likely to pull out my earbuds.&lt;/p&gt;

&lt;p&gt;I don't mind that others are talking - I want you to do you! At the same time, I can't be productive if I can hear that talking. I'll put on some music - usually instrumental (I have an &lt;a href="https://open.spotify.com/playlist/1cB6yXTOHhX9m2rxsIQ6Cq?si=140fe235f0084046" rel="noopener noreferrer"&gt;instrumental hard rock playlist&lt;/a&gt;. I also fond of a &lt;a href="https://open.spotify.com/playlist/5esKnrTNLu1ibrfYfy54LJ?si=c91d8a9d4e184394" rel="noopener noreferrer"&gt;softer focus playlist&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I'm not trying to be antisocial, I'm happy to be interrupted, but I'm okay with seeming a bit antisocial - it keeps my frustration levels down and allows me to complete the assignment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Being Socially Inept
&lt;/h3&gt;

&lt;p&gt;I think I'm a fairly good conversationalist and I like meeting new people. Oftentimes I can be energized by a good conversation - but after a while even good conversations will take their toll.&lt;/p&gt;

&lt;p&gt;My first step to accommodate myself is to no longer be proactive in socializing. By this I mean, if I'm feeling high energy I will walk up to people (including those I don't know) and start a conversation. As my energy decreases my ability to do this decreases.&lt;/p&gt;

&lt;p&gt;My second step is to allow myself to be cooked. This means that I've reached the point where not only proactive social interactions go out the window but I also am not making any effort to appear eager to participate in such interactions. Usually I would still &lt;em&gt;love&lt;/em&gt; to talk to someone if they proactively initiate, but I'm also allowing myself to be content with just sitting there, staring vacantly into space.&lt;/p&gt;

&lt;p&gt;The third step is physical withdrawal. When I'm cooked and further other-initiated conversation seem unlikely (or driven by guilt) I take physical leave.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Aftereffects
&lt;/h2&gt;

&lt;p&gt;Some of these activities can be done without any trade-offs (other than a little extra preparation) but some do come with a cost.&lt;/p&gt;

&lt;p&gt;I do miss out on conversations I'd love to have.&lt;br&gt;
I don't attend social gatherings that could be enjoyable.&lt;br&gt;
I may be seen as undisciplined or lazy because I'm not paying full attention to the presentation.&lt;br&gt;
I do miss out on opportunities.&lt;br&gt;
I don't get everything those who are able to marathon through do.&lt;/p&gt;

&lt;p&gt;But at the end of the day, I accept that I am a unique individual (as are we all) and that I have specific strengths and weaknesses and I need to operate within those.&lt;/p&gt;

&lt;h2&gt;
  
  
  But I SHOULD!
&lt;/h2&gt;

&lt;p&gt;I have, many times, attempted to fit my square peg self into a round hole. When I do I suffer and in the long-term it is counter productive.&lt;/p&gt;

&lt;p&gt;I might be able to sit through the lecture without doodling.&lt;br&gt;
I might be able to force myself to stay longer at a social gathering.&lt;/p&gt;

&lt;p&gt;But I've realized that I eventually pay for this and that:&lt;br&gt;
The price is oftentimes significantly more than one would expect. For example, pushing myself too hard on one day may require 2-3 days or recuperation. Sure, I did it but, but was it worth an additional 1-2 days? It isn't a simple 1 - 1 = 0 equation. It's more like 1 - 3 = -2.&lt;br&gt;
The cost is paid frequently when I need the time/energy more and, as importantly, when others need me more.&lt;/p&gt;

&lt;p&gt;I give up some of the social niceties and behavior that allows one to appear more friendly, productive, and energetic because I know I can't do them without sacrifices that I've determined bear a cost beyond their value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluding Thought
&lt;/h2&gt;

&lt;p&gt;I want to encourage you to consider how the activities you are involved in (conferences or otherwise) affects you. To consider the ways in which you can mitigate the negative effects and when there seems to be a negative side to the necessary mitigations to do an informal cost-benefit analysis.&lt;/p&gt;

&lt;p&gt;One significant benefit to doing so is that we give others the encouragement and permission they need to give themselves grace. When I see you treating yourself well, allowing yourself to be uniquely you, it encourages me that it's okay for me to be different too!&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  But You've Done a Lot of Public Speaking...
&lt;/h3&gt;

&lt;p&gt;Yes, it's true. I've spent years doing public speaking / teaching and this does come with a cost but for me (yes, I accept the designation "weirdo") speaking to a group is much less expensive than speaking with a person / people in most circumstances.&lt;/p&gt;

&lt;p&gt;I can walk off a speaking gig with minimal energy loss, but I'll likely experience significant loss as I engage others after the speech.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I Leave You Alone?
&lt;/h3&gt;

&lt;p&gt;I appreciate that people don't want to be a burden to me but it's also important to note that I (and I think most of us) yearn for good conversations with others. Usually we see the cost as acceptable (even if it is steep). We want to talk to you too.&lt;/p&gt;

&lt;p&gt;If I didn't get to talk to you recently or if at some future event I scoot out before you can talk - it isn't because I don't want to talk with you, I've simply hit the limits of what my mind or body can take at that given moment...but I would love to talk another time!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>community</category>
      <category>softskills</category>
      <category>neurodivergent</category>
    </item>
    <item>
      <title>supabase_vector_project container is not ready: unhealthy</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Sat, 15 Mar 2025 01:15:34 +0000</pubDate>
      <link>https://dev.to/davidshq/supabasevectorproject-container-is-not-ready-unhealthy-518i</link>
      <guid>https://dev.to/davidshq/supabasevectorproject-container-is-not-ready-unhealthy-518i</guid>
      <description>&lt;p&gt;This will be brief...&lt;/p&gt;

&lt;p&gt;I ran into an issue using &lt;code&gt;supabase start&lt;/code&gt;. It would get pretty far and then stop the containers due to a networking error.&lt;/p&gt;

&lt;p&gt;I ended up finding an issue &lt;a href="https://github.com/supabase/cli/issues/2588" rel="noopener noreferrer"&gt;"supabase_vector_project container is not ready: unhealthy"&lt;/a&gt; in which noga-dev notes that enabling "Expose daemon on tcp://localhost:2375 without TLS" in Docker Desktop resolves the issue.&lt;/p&gt;

&lt;p&gt;That is my experience as well.&lt;/p&gt;

&lt;p&gt;I'm sure there is at least 1 other person in the world who will run into this issue...&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>webdev</category>
      <category>docker</category>
      <category>programming</category>
    </item>
    <item>
      <title>Initial Thoughts on bolt.new</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Tue, 04 Mar 2025 21:26:04 +0000</pubDate>
      <link>https://dev.to/davidshq/initial-thoughts-on-boltnew-4be0</link>
      <guid>https://dev.to/davidshq/initial-thoughts-on-boltnew-4be0</guid>
      <description>&lt;p&gt;I've been playing around with Stackblitz's bolt.new, it's pretty impressive.&lt;/p&gt;

&lt;p&gt;Here are some things I like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's very simple to get started with plain English instructions for an app idea.&lt;/li&gt;
&lt;li&gt;You can connect to Supabase to use as your backend, bolt takes care of new setups and can modify databases, etc. with your explicit permission.&lt;/li&gt;
&lt;li&gt;You can connect to Netlify to use as your frontend. bolt takes care of deploying to Netlify.&lt;/li&gt;
&lt;li&gt;Bolt detects when there are errors being thrown by the app and offers to automatically fix them - and in my experience it succeeds, although it make take a few efforts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some things I don't like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is no native integration with Git! This to me is crazy! I totally want my code, including the code bolt writes for me, to be in Git.&lt;/li&gt;
&lt;li&gt;Bolt describes what it is changing and the files it will work with but the actual code doesn't show a diff. I like how GitHub Copilot and Cursor both show diffs that one can then approve.&lt;/li&gt;
&lt;li&gt;I was able to click on Deploy before configuring Netlify, which was a bit confusing. It should prompt you to configure Netlify if you are trying to deploy but haven't.

&lt;ul&gt;
&lt;li&gt;Ideally bolt should support deploying to any valid node.js server, not just to Netlify.&lt;/li&gt;
&lt;li&gt;It'd be great if at least Vercel was also supported.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;I've had instances where Bolt started failing to Deploy and didn't seem to know why. Closing out the project in bolt and then opening a new bolt instance seems to fix the issue.&lt;/li&gt;

&lt;li&gt;The chat history seems to be pretty limited. This isn't great as I'd like to be able to follow all the conversation from the beginning of the project forward.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;I did subscribe. I ran out of the initial free tokens pretty quickly - but the subscription for $20/mo. gives me 10m tokens a &lt;del&gt;day&lt;/del&gt; month - which seems pretty generous.&lt;/p&gt;

&lt;p&gt;I think this will become even more impressive when bolt gets better at not rewriting entire files and focuses only on those areas that need changes.&lt;/p&gt;

&lt;p&gt;And those are my initial thoughts.&lt;/p&gt;

&lt;p&gt;Have you tried using bolt.new? Thoughts on your experience? Any other tools you prefer?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Building Production-Grade Web Applications with Supabase – Part 2</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Sun, 19 Jan 2025 14:31:33 +0000</pubDate>
      <link>https://dev.to/davidshq/building-production-grade-web-applications-with-supabase-part-2-2k9h</link>
      <guid>https://dev.to/davidshq/building-production-grade-web-applications-with-supabase-part-2-2k9h</guid>
      <description>&lt;p&gt;I’m working through David Lorenz’s book &lt;a href="https://amzn.to/3Pw8rCo" rel="noopener noreferrer"&gt;Building Production-Grade Web Applications with Supabase&lt;/a&gt; (affiliate link) and just finished  &lt;strong&gt;Chapter 3 – Creating the Ticket Management Pages…&lt;/strong&gt;. I’ve run into a few issues and thought I’d share them along with how I’ve fixed them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section: Setting up Pico.css with Next.js
&lt;/h2&gt;

&lt;p&gt;You can ignore &lt;code&gt;pageProps.children&lt;/code&gt; and leave it as &lt;code&gt;children&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section: Building the login form
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should I really edit app/page.js as LoginPage?
&lt;/h3&gt;

&lt;p&gt;Even though Lorenz explicitly states:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;So, open up  &lt;strong&gt;app/page.js&lt;/strong&gt;  and change the  &lt;strong&gt;Page&lt;/strong&gt;  component so that it only will return the  &lt;strong&gt;Login&lt;/strong&gt;  component for now…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I still had to &lt;a href="https://github.com/PacktPublishing/Building-Production-Grade-Web-Applications-with-Supabase/blob/Ch03_TicketSystem_UI/src/app/page.js" rel="noopener noreferrer"&gt;go look for myself&lt;/a&gt; the next time I encountered instructions to edit &lt;code&gt;LoginPage&lt;/code&gt;. I expected us to create a new page rather than using the existing &lt;code&gt;page.js&lt;/code&gt;, but no, wipe everything out in &lt;code&gt;page.js&lt;/code&gt; and paste in only the &lt;code&gt;LoginPage&lt;/code&gt; code as given in the book.&lt;/p&gt;

&lt;h3&gt;
  
  
  Error: &lt;code&gt;searchParams&lt;/code&gt; should be awaited
&lt;/h3&gt;

&lt;p&gt;Once we update the &lt;code&gt;app/Login.js&lt;/code&gt; with the toggling logic (for turning on/off the password field) we start seeing this error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Route "/" used `searchParams.magicLink`. `searchParams` should be awaited before using its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis
    at LoginPage (src/app/page.js:3:38)
  1 | import { Login } from "./Login";
  2 | export default function LoginPage({ searchParams }) {
&amp;gt; 3 | const wantsMagicLink = searchParams.magicLink === "yes";
    | ^
  4 | return &amp;lt;Login isPasswordLogin={!wantsMagicLink} /&amp;gt;;
  5 | }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To fix this we want to make the &lt;code&gt;LoginPage&lt;/code&gt; function in &lt;code&gt;app/page.js&lt;/code&gt; asynchronous like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Login } from "./Login";

export default async function LoginPage({ searchParams }) {
  const params = await searchParams;
  const wantsMagicLink = params.magicLink === "yes";
  return &amp;lt;Login isPasswordLogin={!wantsMagicLink} /&amp;gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Saving the Username and Password
&lt;/h3&gt;

&lt;p&gt;In the book we are instructed to update our code in &lt;code&gt;Login.js&lt;/code&gt; like so:&lt;/p&gt;

&lt;blockquote&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"use client";
import { useRef } from "react";
export const Login = () =&amp;gt; {
const emailInputRef = useRef(null);
const passwordInputRef = useRef(null);
return (
...
)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;Just in case this isn’t entirely clear, here is what your code should look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"use client";
import { useRef } from "react";
import Link from "next/link";

export const Login = ({ isPasswordLogin }) =&amp;gt; {
  const emailInputRef = useRef(null);
  const passwordInputRef = useRef(null);

  return(
    ...
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where the &lt;code&gt;...&lt;/code&gt; is we aren’t changing anything. Essentially, everything from &lt;code&gt;return(&lt;/code&gt; on remains the exact same as before.&lt;/p&gt;

&lt;p&gt;The “big thing” I’m pointing out above is that one shouldn’t remove &lt;code&gt;import Link from "next/link";&lt;/code&gt; instead add &lt;code&gt;"use client";&lt;/code&gt; and the &lt;code&gt;useRef&lt;/code&gt; import before it.&lt;/p&gt;

&lt;p&gt;Side note: Maybe we’ll learn later, but I find it a little odd to use &lt;code&gt;useRef&lt;/code&gt; instead of &lt;code&gt;useState&lt;/code&gt; here, but then again, I’m not a Next.js or React expert.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where does that &lt;code&gt;onSubmit&lt;/code&gt; event go?
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;Login.js&lt;/code&gt; within the &lt;code&gt;return( ... )&lt;/code&gt;, replace the current &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; with the form code that includes the &lt;code&gt;onSubmit&lt;/code&gt; handler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section: Visualizing the Ticket Management UI
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Subsection: Creating a shared UI layout with navigation elements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The CSS ex unit?
&lt;/h3&gt;

&lt;p&gt;In the code for &lt;code&gt;app/tickets/TenantName.js&lt;/code&gt; Lorenz uses the rarely used CSS &lt;code&gt;ex&lt;/code&gt; unit:&lt;/p&gt;

&lt;blockquote&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;strong style={{ marginLeft: "1ex" }}&amp;gt;
{props.tenantName}
&amp;lt;/strong&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;I suspect that this is actually a typo and that Lorenz intended for this to be &lt;code&gt;1em&lt;/code&gt;. While &lt;code&gt;ex&lt;/code&gt; is a valid CSS unit it is rarely utilized and is based on the height of the current font. For more on this topic see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/Style/Examples/007/units.en.html" rel="noopener noreferrer"&gt;W3’s Example Page for EM, PX, PT, CM, IN…&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.w3schools.com/cssref/css_units.php" rel="noopener noreferrer"&gt;W3School’s CSS Units&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.perplexity.ai/search/should-one-use-the-ex-css-unit-J60NLHX0SQ64j4xG4rPq3g" rel="noopener noreferrer"&gt;Perplexity: Should one use the ex CSS unit?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Subsection: Designing the Ticket List Page
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Creating dummy tickets where?
&lt;/h3&gt;

&lt;p&gt;For those who aren’t familiar with React the instruction to add &lt;code&gt;dummyTickets&lt;/code&gt; to the &lt;code&gt;page.js&lt;/code&gt; file may not be clear enough. You’ll want put these in the &lt;code&gt;TicketListPage()&lt;/code&gt; function before the &lt;code&gt;return&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Import how?
&lt;/h3&gt;

&lt;p&gt;Lorenz instructs us to import the &lt;code&gt;TicketList&lt;/code&gt; component into &lt;code&gt;page.js&lt;/code&gt;. This is pretty straightforward but may be helpful to note that since this is a “named export” we want our import in &lt;code&gt;page.js&lt;/code&gt; to look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { TicketList } from "./TicketList";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And not like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import TicketList from "./TicketList";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you do the latter you’ll get one of those lovable error messages:&lt;/p&gt;

&lt;blockquote&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./src/app/tickets/page.js:1:1 Export default doesn't exist in target module

1 | import TicketList from "./TicketList"; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
2 | 
3 | export default function TicketListPage() { 4 | const dummyTickets = [

The export default was not found in module [project]/src/app/tickets/TicketList.js [app-rsc] (ecmascript). Did you mean to import TicketList? All exports of the module are statically known (It doesn't have dynamic exports). So it's known statically that the requested export doesn't exist.
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Subsection: Constructing the Ticket Details page
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Error: Route “/tickets/details/[id]” used…
&lt;/h3&gt;

&lt;p&gt;When we follow the instructions for creating the &lt;code&gt;TicketDetailsPage&lt;/code&gt; function we will see the following error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Route "/tickets/details/[id]" used `params.id`. `params` should be awaited before using its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis
    at TicketDetailsPage (src/app/tickets/details/[id]/page.js:4:50)
  2 | return (
  3 | &amp;lt;div&amp;gt;
&amp;gt; 4 | Ticket Details page with &amp;lt;strong&amp;gt;ID={params.id}&amp;lt;/strong&amp;gt;
    | ^
  5 | &amp;lt;/div&amp;gt;
  6 | );
  7 | }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may recall that we’ve seen a similar error earlier with the &lt;code&gt;LoginPage&lt;/code&gt; function and that we resolved it by making our function async and awaiting the parameter. We’ll do the same here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default async function TicketDetailsPage({ params }) {
  const ticketParams = await params;
  const id = ticketParams.id;

  return (
    &amp;lt;div&amp;gt;
      Ticket Details page with &amp;lt;strong&amp;gt;ID={id}&amp;lt;/strong&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Error: Route “/tickets/details/[id]” used… (again?)
&lt;/h3&gt;

&lt;p&gt;After updating the &lt;code&gt;/tickets/details/[id]/page.js&lt;/code&gt; file (&lt;code&gt;TicketDetailsPage&lt;/code&gt; function) we get a very similar error as we did in the last section. What gives? Simple, we updated our code in the last section but the book doesn’t know that, so the book is still using &lt;code&gt;params.id&lt;/code&gt;, simply replace &lt;code&gt;params.id&lt;/code&gt; with &lt;code&gt;id&lt;/code&gt; and everything should be right as rain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subsection: Adding the comments section to the ticket details
&lt;/h2&gt;

&lt;p&gt;The path for the new comments file should be &lt;code&gt;/tickets/details/[id]/TicketComments.js&lt;/code&gt; and not &lt;code&gt;/tickets/details[id]/TicketComments.js&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Error: Encountered two children with the same key…
&lt;/h3&gt;

&lt;p&gt;While Next.js doesn’t throw any errors in the terminal output after adding the code that displays the actual comments to &lt;code&gt;TicketComments.js&lt;/code&gt; you will see one in the browser:&lt;/p&gt;

&lt;blockquote&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Encountered two children with the same key, `{comment.date}`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version.
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;There are two reasons this occurs. The first is that we aren’t actually using the date as the key, because we have quotes around &lt;code&gt;{comment.date}&lt;/code&gt; we are passing in the string literal &lt;code&gt;comment.date&lt;/code&gt;. To fix this we need to remove the quotes so that this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;article key="{comment.date}"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Is replaced with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;article key={comment.date}&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once this is done we won’t get that error anymore but we should note that there is another issue, even if it isn’t apparent at the moment. What happens if two or more individuals comment on the same date? Our keys again aren’t unique and we’ll see this same error. We can fix this quickly by adding an &lt;code&gt;id&lt;/code&gt; property to our comments. Our updated &lt;code&gt;comments&lt;/code&gt; should now look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const comments = [
  {
    id: 1,
    author: "Dave",
    date: "2027-01-01",
    content: "This is a comment from Dave",
  },
  {
    id: 2,
    author: "Alice",
    date: "2027-01-02",
    content: "This is a comment from Alice",
  },
];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we just need to change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;article key={comment.date}&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;article key={comment.id}&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Subsection: Implementing a page to create a new ticket
&lt;/h2&gt;

&lt;p&gt;Nothing to see here folks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subsection: Implementing a user overview
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Getting the Icons Installed
&lt;/h3&gt;

&lt;p&gt;We need to install the &lt;code&gt;@tabler/icons-react&lt;/code&gt; package: &lt;code&gt;npm i @tabler/icons-react&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;While Lorenz uses &lt;code&gt;IconCheck&lt;/code&gt; I’d recommend using &lt;code&gt;IconUserCheck&lt;/code&gt; as it’s a little clearer what one is displaying.&lt;/p&gt;

&lt;p&gt;We need to import the &lt;code&gt;IconUserCheck&lt;/code&gt; and &lt;code&gt;IconUserOff&lt;/code&gt; components in our &lt;code&gt;users/page.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { IconUserCheck, IconUserOff } from "@tabler/icons-react";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we need to replace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        &amp;lt;td&amp;gt;
         {user.name}
         ({user.isAvailable ? "Available" : "Not available"})
        &amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;td style={{ color: !user.isAvailable ? "red" : undefined }}&amp;gt;
 {user.isAvailable ? &amp;lt;IconUserCheck /&amp;gt; : &amp;lt;IconUserOff /&amp;gt;} {user.name}
&amp;lt;/td&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Subsection: Enhancing the navigation component
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What’s that link look like again?
&lt;/h3&gt;

&lt;p&gt;Here is what a link should look like when the &lt;code&gt;pathname&lt;/code&gt; code has been appended:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;Link role="button" href="/tickets" {...(pathname === "/tickets" ? activeProps : inactiveProps)}&amp;gt;Ticket List&amp;lt;/Link&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change the &lt;code&gt;pathname === "/tickets"&lt;/code&gt; to whichever page the link is pointing at, e.g. if the link points to &lt;code&gt;/tickets/new&lt;/code&gt; then you should set the pathname section to &lt;code&gt;pathname === "/tickets/new"&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations, you are now person #3 that is interested in this post. &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcmm1746fpgkgvnxygxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcmm1746fpgkgvnxygxk.png" alt="😉" width="72" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Building Production-Grade Web Applications with Supabase – Part 1</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Mon, 13 Jan 2025 20:17:08 +0000</pubDate>
      <link>https://dev.to/davidshq/building-production-grade-web-applications-with-supabase-part-1-3j6o</link>
      <guid>https://dev.to/davidshq/building-production-grade-web-applications-with-supabase-part-1-3j6o</guid>
      <description>&lt;p&gt;(This post was originally published on &lt;a href="https://babyprogrammer.com/blog/building-production-grade-web-applications-with-supabase-part-1/" rel="noopener noreferrer"&gt;Baby Programmer&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I'm working through David Lorenz's book Building Production-Grade Web Applications with Supabase (affiliate link) and just finished Chapter 2 - Setting Up Supabase with Next.js. I've run into a few issues and figured I'd share them along with how I've fixed them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section: Initializing and testing the base Supabase JavaScript client within Next.js
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Error: Parsing ecmascript source code failed
&lt;/h3&gt;

&lt;p&gt;One is instructed to use the following code to check for Supabase buckets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSupabaseClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listBuckets&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
     &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bucket List&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unfortunately, this will result in the following error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ⨯ ./src/app/page.js:9:5
 Parsing ecmascript source code failed
   7 |     supabase.storage.listBuckets().then((result) =&amp;gt;
   8 |       console.log("Bucket List", result)
 &amp;gt; 9 |     });
     |     ^
  10 |   }, []);
  11 |
  12 |   return (

Expected ',', got '}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fortunately, the fix is quite simple, add an opening brace immediately following &lt;code&gt;.then((result) =&amp;gt;&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSupabaseClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listBuckets&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bucket List&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Error: ReferenceError: useEffect is not defined
&lt;/h3&gt;

&lt;p&gt;Once the above error has been resolved we hit our next one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⨯ ReferenceError: useEffect is not defined
    at Home (src/app/page.js:5:2)
  3 |
  4 | export default function Home() {
&amp;gt; 5 |   useEffect(() =&amp;gt; {
    |  ^
  6 |     const supabase = createSupabaseClient();
  7 |     supabase.storage.listBuckets().then((result) =&amp;gt; {
  8 |       console.log("Bucket List", result) {
  digest: '3325505329'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The issue is that we haven't imported useEffect from React for use on this page. Doing so is simple, add an import for useEffect immediately after the import for Image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next/image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createSupabaseClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/supabase-utils/client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Error: Ecmascript file had an error
&lt;/h3&gt;

&lt;p&gt;You'll be immediately greeted with yet another error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⨯ ./src/app/page.js:2:10
Ecmascript file had an error
  1 | import Image from "next/image";
&amp;gt; 2 | import { useEffect } from "react";
    |          ^^^^^^^^^
  3 | import { createSupabaseClient } from '@/supabase-utils/client';
  4 |
  5 | export default function Home() {

You're importing a component that needs `useEffect`. This React hook only works in a client component. To fix, mark the file (or its parent) with the `"use client"` directive.

 Learn more: https://nextjs.org/docs/app/api-reference/directives/use-client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luckily, the solution is once again quite simple. At the top of the file add &lt;code&gt;"use client";&lt;/code&gt; like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next/image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Section: Using the Supabase client with Pages Router and App Router
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Subsection: Utilizing createBrowserClient on the frontend
&lt;/h3&gt;

&lt;p&gt;The first issue we run into isn't really an error, its more that some of the instructions may not be entirely clear to some readers. The reader is instructed to update the createSupabaseClient function to use &lt;code&gt;createBrowserClient&lt;/code&gt; like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBrowserClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@supabase/ssr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createSupabaseClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;createBrowserClient&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where that ... is one shouldn't literally place ..., rather one should insert the contents that previously were within &lt;code&gt;createClient()&lt;/code&gt;, e.g. the final code should look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBrowserClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@supabase/ssr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createSupabaseClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;createBrowserClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_SUPABASE_ANON_KEY&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are then instructed to make two relatively small adjustments to the &lt;code&gt;client.js&lt;/code&gt; file:&lt;/p&gt;

&lt;p&gt;We rename the file from &lt;code&gt;client.js&lt;/code&gt; to &lt;code&gt;browserClient.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We rename &lt;code&gt;createSupabaseClient&lt;/code&gt; to &lt;code&gt;getSupabaseBrowserClient&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But this creates some additional work for us, unless your editor picks up and auto-corrects the changes:&lt;/p&gt;

&lt;p&gt;First, we need to update our import in &lt;code&gt;page.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getSupabaseBrowserClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/supabase-utils/browserClient&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we need to update our instantiation of the client in &lt;code&gt;page.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getSupabaseBrowserClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are told that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"In VS Code, you can press F2 to rename createSupabaseClient. It will automatically be renamed across your project. If you change a filename, VS Code should also pick up the references and refactor the path in other files accordingly."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(I was using Cursor and the changes were not picked up...could certainly have been the connection between the chair and the keyboard in this case)&lt;/p&gt;

&lt;h3&gt;
  
  
  Subsection: Utilizing createServerClient on the backend
&lt;/h3&gt;

&lt;p&gt;This section is quite long and a bit confusing, as Lorenz acknowledges.&lt;/p&gt;

&lt;p&gt;There is one block of code that is particularly confusing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;        &lt;span class="nf"&gt;setAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cookiesToSet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;cookiesToSet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;
          &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;
          &lt;span class="nx"&gt;cookiesToSet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance it can seem like we are performing the same step twice. It's easy to overlook that the first instance is modifying the request cookies while the second is modifying the response cookies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rest
&lt;/h2&gt;

&lt;p&gt;I skipped the section on using &lt;code&gt;createServerClient&lt;/code&gt; with the Pages Router, I'm working on a greenfield project at the moment, if I need to work with a Next.js using Pages Router I can always revisit.&lt;/p&gt;

&lt;p&gt;The section on Connecting directly to the database is fairly basic, if you are familiar with SQL db's it makes intuitive sense.&lt;/p&gt;

&lt;p&gt;The section on using TypeScript is primarily about running a single command to generate (and then regenerate, as needed) type definitions.&lt;/p&gt;

&lt;p&gt;The chapter closes out with basic examples of creating a client for Nuxt 3 (Vue) and Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  The End
&lt;/h2&gt;

&lt;p&gt;And that's the conclusion of chapter 2. Now wasn't that post just gripping?&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>react</category>
      <category>nextjs</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Some Resources on Mainframes and COBOL</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Sun, 12 Apr 2020 13:50:24 +0000</pubDate>
      <link>https://dev.to/davidshq/some-resources-on-mainframes-and-cobol-34ao</link>
      <guid>https://dev.to/davidshq/some-resources-on-mainframes-and-cobol-34ao</guid>
      <description>&lt;p&gt;Learning COBOL has been on my bucket list for a number of years now (along with other elder languages). The current pandemic crisis and its stress upon important systems written in COBOL has caused me to take a few more steps in that direction.&lt;/p&gt;

&lt;p&gt;In addition to having a soft spot for elder languages I also enjoy curating and compiling information on topics I'm interested in. I've put together two pages - one on &lt;a href="https://babyprogrammer.com/mainframes/" rel="noopener noreferrer"&gt;mainframes&lt;/a&gt; and one on &lt;a href="https://babyprogrammer.com/cobol/" rel="noopener noreferrer"&gt;COBOL&lt;/a&gt;. I'll expand on both as I learn more.&lt;/p&gt;

&lt;p&gt;Would love to hear if you have other resources you think are highly valuable on these topics. :)&lt;/p&gt;

&lt;p&gt;Best introductory article I've read on the topic thus far is &lt;a href="https://devops.com/the-beauty-of-the-cobol-programming-language-v2/" rel="noopener noreferrer"&gt;Bob Reselman's The Beauty of the COBOL Programming Language&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For entertainment value, Jeff Atwood's &lt;a href="https://blog.codinghorror.com/cobol-everywhere-and-nowhere/" rel="noopener noreferrer"&gt;COBOL: Everywhere and Nowhere&lt;/a&gt; is enjoyable both for its original humor and in light of our current circumstances.&lt;/p&gt;

&lt;p&gt;Stay safe everyone!&lt;/p&gt;

</description>
      <category>cobol</category>
      <category>mainframes</category>
      <category>resources</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>A (Fairly) Exhaustive List of Books on WordPress Development.</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Sat, 26 Oct 2019 22:33:39 +0000</pubDate>
      <link>https://dev.to/davidshq/a-fairly-exhaustive-list-of-books-on-wordpress-development-1e73</link>
      <guid>https://dev.to/davidshq/a-fairly-exhaustive-list-of-books-on-wordpress-development-1e73</guid>
      <description>&lt;p&gt;There are various lists around the internet of books on WordPress Development but I found them to be largely incomplete and was frustrated by how some of them seemed to suggest that such-and-such a book was relatively new when it was, in fact, quite old.&lt;/p&gt;

&lt;p&gt;So I've created a list of books on WordPress Development that I think / hope is significantly more extensive than anything I found elsewhere on the web.&lt;/p&gt;

&lt;p&gt;I've included only books published in 2011 and following. Even this is quite a ways back, but there isn't an overabundance of books on WP so looking this far back is necessary.&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts, you can find the complete list here:&lt;br&gt;
&lt;a href="http://wpdeveloping.com/wordpress-developer-books/" rel="noopener noreferrer"&gt;http://wpdeveloping.com/wordpress-developer-books/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you read any of these books? Which do you think are best? Does one cover topics not covered in another book? Are their books I should add to the list that aren't on it currently?&lt;/p&gt;

&lt;p&gt;Thanks in advance!&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>books</category>
    </item>
    <item>
      <title>Looking for Advice: Best Method for Adding Fill-in-the-Blank Functionality to WordPress Plugin</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Thu, 03 Oct 2019 14:58:12 +0000</pubDate>
      <link>https://dev.to/davidshq/looking-for-advice-best-method-for-adding-fill-in-the-blank-functionality-to-wordpress-plugin-26om</link>
      <guid>https://dev.to/davidshq/looking-for-advice-best-method-for-adding-fill-in-the-blank-functionality-to-wordpress-plugin-26om</guid>
      <description>&lt;p&gt;Hi All,&lt;/p&gt;

&lt;p&gt;I'm building a new WordPress plugin for interactive fill-in-the-blank notes. Goal: Anyone who is presenting information and likes to use fill-in-the-blank style handouts could do so using this plugin (without the need for printed copies while retaining interactivity).&lt;/p&gt;

&lt;p&gt;My rough plan is to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Custom Post Type.&lt;/li&gt;
&lt;li&gt;Provide an editor for text notes (and images / other media) to be added by the presenter.(a)&lt;/li&gt;
&lt;li&gt;Presenters would select a word/phrase they wanted to blank out.(b)&lt;/li&gt;
&lt;li&gt;Participants at the presentation could pull up the notes on their phone/laptop and fill out the blanks as the presentation occurs.(c)&lt;/li&gt;
&lt;li&gt;At the end of the presentation participants could enter their email address and have the notes (including their filled out answers and perhaps the correct ones if they differ) emailed to them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It is a pretty simple/straightforward plugin and this is essentially an MVP. I'd love to add additional features in the future (save to PDF, Evernote, Google Drive, etc.; easy analytics for the presenter to gauge actual participation, etc.).&lt;/p&gt;

&lt;p&gt;There are three areas in particular that I'm looking to gain additional perspective on, I've noted them as (a), (b), and (c) above. Below I provide additional details on these along with questions I have.&lt;/p&gt;

&lt;p&gt;(a) I could use the Gutenberg block editor to create a block that handles this OR I could use the traditional TinyMCE non-Gutenberg editor. Thoughts on advantages of one over the other? Am I missing any additional (better) options?&lt;/p&gt;

&lt;p&gt;(b) Ideally there would be several ways to do this, e.g., select the word and use a key combination (say Ctrl+Shift+B) and an editor button. Once this is done CSS will be used to show that the selected word/phrase will be shown as blank from the front end.&lt;/p&gt;

&lt;p&gt;This could be done using a shortcode, like:&lt;br&gt;
The best programming website is [lqdnotes]dev.to[/lqdnotes]&lt;/p&gt;

&lt;p&gt;Or it could be done using an html attribute like:&lt;br&gt;
The best programming website is &amp;lt;span class="lqd_blank"&amp;gt;dev.to&amp;lt;/span&amp;gt;&lt;/p&gt;

&lt;p&gt;I tend to prefer the latter as it doesn't clutter the editor interface notes with shortcodes. Any reason to go with the former or another method altogether?&lt;/p&gt;

&lt;p&gt;(c) When the front end page is displayed the parser would display the text as-is except for when it found a blanked word, in which case it would replace the blanked word with a form text box with some styling to ensure it looked as if it was in the regular flow of the page (e.g., no borders, sizing with rest of text, no difference in color, etc.).&lt;/p&gt;

&lt;p&gt;Are there any better ways to accomplish this? Ideas you'd suggest?&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts!&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>php</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Find WordPress Function Declarations</title>
      <dc:creator>Dave Mackey</dc:creator>
      <pubDate>Wed, 02 Oct 2019 14:19:31 +0000</pubDate>
      <link>https://dev.to/davidshq/find-wordpress-function-declarations-hac</link>
      <guid>https://dev.to/davidshq/find-wordpress-function-declarations-hac</guid>
      <description>&lt;p&gt;Early stages Python script that reads in a WP core file and creates a list of functions declared within the file.&lt;/p&gt;

&lt;p&gt;Eventual goal is that this would be able to parse all of WP core and that it would leave off function and just provide the declaration.&lt;/p&gt;

&lt;p&gt;developer.wordpress.org/reference, unfortunately only shows 49 pages of results for functions, so if there are more results, you don't get to see them. No easy way to browse all functions.&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@davidshq/findwpfunctiondeclarations?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;


</description>
      <category>replit</category>
      <category>python</category>
    </item>
  </channel>
</rss>
