<?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: Chad Dyar</title>
    <description>The latest articles on DEV Community by Chad Dyar (@chadtdyar).</description>
    <link>https://dev.to/chadtdyar</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%2F3811599%2F0adb0b4b-5659-4c7c-8f09-49347539478f.jpg</url>
      <title>DEV Community: Chad Dyar</title>
      <link>https://dev.to/chadtdyar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chadtdyar"/>
    <language>en</language>
    <item>
      <title>HEADLINE: Build Real Connections at Work</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 22 May 2026 07:23:01 +0000</pubDate>
      <link>https://dev.to/chadtdyar/headline-build-real-connections-at-work-45bn</link>
      <guid>https://dev.to/chadtdyar/headline-build-real-connections-at-work-45bn</guid>
      <description>&lt;p&gt;HEADLINE: Build Real Connections at Work&lt;/p&gt;

&lt;p&gt;In today's work environments, conversations often feel like performances. But what if they didn't have to? "How to Talk to Humans" offers a map to genuine communication. Discover how trust and real relationships can transform your work life.&lt;/p&gt;

&lt;p&gt;CTA: Read more about the book&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TITLE: Authentic Communication for Developers</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 22 May 2026 07:23:00 +0000</pubDate>
      <link>https://dev.to/chadtdyar/title-authentic-communication-for-developers-f17</link>
      <guid>https://dev.to/chadtdyar/title-authentic-communication-for-developers-f17</guid>
      <description>&lt;p&gt;TITLE: Authentic Communication for Developers&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Communication as Code: Like clean code, clear communication is essential in tech. It's about being straightforward and honest.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From Performance to Connection: Shift from performing in meetings to forming real connections. "How to Talk to Humans" can guide you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trust Building in Teams: Communication isn't just exchanging information. It's about building trust within your team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tools to Enhance Your Message: Consider tools like ContentF&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Tony had to help me get dressed last Tuesday morning.</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 22 May 2026 06:11:10 +0000</pubDate>
      <link>https://dev.to/chadtdyar/tony-had-to-help-me-get-dressed-last-tuesday-morning-ohe</link>
      <guid>https://dev.to/chadtdyar/tony-had-to-help-me-get-dressed-last-tuesday-morning-ohe</guid>
      <description>&lt;p&gt;Tony had to help me get dressed last Tuesday morning.&lt;/p&gt;

&lt;p&gt;I have rheumatoid arthritis. When it flares, it goes for the hands. By the time I made it to my laptop, the content system had already posted to LinkedIn and Mastodon. Nine items published over three days while I was mostly down.&lt;/p&gt;

&lt;p&gt;This is the architecture behind that.&lt;/p&gt;

&lt;p&gt;The Stack&lt;/p&gt;

&lt;p&gt;The pipeline runs on three components: a Supabase marketing_queue table, a local Python publisher process called Clawbot, and a weekly Sunday approval workflow I run in a Cowork session.&lt;/p&gt;

&lt;p&gt;The queue table is the central object. Every piece of content lives there as a row with these key columns: platform, title, body, status, week_of, day_of_week, source.&lt;/p&gt;

&lt;p&gt;The Status Flow&lt;/p&gt;

&lt;p&gt;Items move through these statuses: pending, ready, approved, published.&lt;/p&gt;

&lt;p&gt;The publisher only touches items with status = approved or ready_to_publish. It never touches pending, ready, or human_required. This is the key architectural decision. Approved is the gate. Nothing publishes without my explicit sign-off.&lt;/p&gt;

&lt;p&gt;The Validation Layer&lt;/p&gt;

&lt;p&gt;Before any content goes into the queue as ready, it passes two database functions:&lt;/p&gt;

&lt;p&gt;SELECT public.is_publishable_content(body, title) as passes,&lt;br&gt;
       public.content_validation_reason(body, title) as reason;&lt;/p&gt;

&lt;p&gt;The validation catches: body under 200 characters, metadata prefixes in the body field, brief-format content that was never expanded into finished copy, and a biographical accuracy check that rejects content with specific phrases that would be factually wrong for my situation.&lt;/p&gt;

&lt;p&gt;Last week I had 22 items rejected. The failure mode: batch content submitted as planning briefs instead of finished copy. The system caught it. I still have to clean it up manually.&lt;/p&gt;

&lt;p&gt;The Sunday Workflow&lt;/p&gt;

&lt;p&gt;Sunday evenings I run a content batch process. It generates fresh content for the current week, validates it, and inserts it with status ready. Then I do a manual approval pass: reading each item, improving anything that needs work, and updating to approved. Clawbot clears the approved queue on its schedule throughout the week.&lt;/p&gt;

&lt;p&gt;When I cannot do the Sunday review, the prior week's approved queue continues clearing. The gap is visible in the metrics but the output does not completely stop.&lt;/p&gt;

&lt;p&gt;What I Would Do Differently&lt;/p&gt;

&lt;p&gt;The biggest gap right now: the 22 rejected items represent a failure in the content generation step. The validator caught them correctly. But they represent wasted generation cost and manual cleanup work. I am adding a stricter pre-validation pass to the Sunday generation workflow so rejected items never make it into the queue in the first place.&lt;/p&gt;

&lt;p&gt;Second gap: long-form content has no automated path to published. It parks at ready and waits for me to manually post it. That is intentional for quality reasons, but it means long-form has a higher abandonment rate. Working on a simpler handoff that reduces friction without removing human review.&lt;/p&gt;

&lt;p&gt;The thing that surprised me most: the system does not know it is impressive. It just runs. Tuesday morning when the arthritis was bad, it published at 8:47 AM the same as any other Tuesday. No acknowledgment, no notice. Just the work.&lt;/p&gt;

&lt;p&gt;I find that oddly reassuring.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Three days of an arthritis flare. Forty accounts. Zero intervention from me. That was the test. I did not design the test. I jus</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 22 May 2026 06:11:08 +0000</pubDate>
      <link>https://dev.to/chadtdyar/three-days-of-an-arthritis-flare-forty-accounts-zero-intervention-from-me-that-was-the-test-i-550d</link>
      <guid>https://dev.to/chadtdyar/three-days-of-an-arthritis-flare-forty-accounts-zero-intervention-from-me-that-was-the-test-i-550d</guid>
      <description>&lt;p&gt;Three days of an arthritis flare. Forty accounts. Zero intervention from me. That was the test. I did not design the test. I just ended up in it. Here is what I built in February that made the May test passable, and the technical decisions that mattered. The stack: Supabase (PostgreSQL) with a marketing_queue table. Key columns are platform, body, title, week_of, day_of_week, status, content_type, and source. Status flow runs from pending (failed validation or needs review) to ready (validated, queued) to approved (cleared for publishing) to ready_to_publish (execution target) to published or rejected. Validation uses two database functions. is_publishable_content(body, title) returns boolean. content_validation_reason(body, title) returns the failure reason. Every insert runs validation before touching the table. The functions check for metadata prefixes in body, minimum length of 200 characters, biographical accuracy triggers, and brief-format field patterns. Two DB triggers rewrite bad status values on every insert and update: normalize_publish_status on marketing_queue and normalize_publish_status_comet on comet_posts. These catch any status value outside the valid set and rewrite it automatically. Upstream mistakes cannot persist in the queue. The publishing agent is Comet, a local Python process. It reads from marketing_queue where status is in approved or ready_to_publish and drives publication platform by platform on a schedule. Content generation runs as a scheduled Cowork task. It calls Claude with a documented story bank and voice rules, generates the full content batch across nine platforms, validates each piece against the DB functions, and inserts clean rows. What worked: the validation functions before every insert, the status normalization triggers, and the story bank documentation. What I would change: the queue depth (7 to 10 days is the right target, not 3 to 5) and adding a dead man's switch for the Comet process since it runs locally with no uptime monitoring. Current queue state: 41 published, 8 human_required, 8 pending, 14 rejected. No stuck items. If you are building a similar content pipeline and want to compare notes, I am at chadtdyar.com or in the comments below.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TITLE: The Art of Asking Questions in Leadership</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 22 May 2026 04:12:40 +0000</pubDate>
      <link>https://dev.to/chadtdyar/title-the-art-of-asking-questions-in-leadership-2cc</link>
      <guid>https://dev.to/chadtdyar/title-the-art-of-asking-questions-in-leadership-2cc</guid>
      <description>&lt;p&gt;TITLE: The Art of Asking Questions in Leadership&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Power of Questions: Leadership is not about having all the answers. It's about asking the right questions to unlock potential.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From Opera to Tech: My journey from the world of opera to tech has shown me that coaching is guiding someone to find their own path.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Emotional Intelligence Meets Resilience: In 'Performance Whisperer', I discuss how these elements bridge together to foster growth without burnout.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aligning Leadership: Al&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>TITLE: Finding Courage in Everyday Moments</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 08 May 2026 22:29:04 +0000</pubDate>
      <link>https://dev.to/chadtdyar/title-finding-courage-in-everyday-moments-4l8b</link>
      <guid>https://dev.to/chadtdyar/title-finding-courage-in-everyday-moments-4l8b</guid>
      <description>&lt;p&gt;TITLE: Finding Courage in Everyday Moments&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Everyday Battle with Fear&lt;br&gt;
We face fear daily, whether it's a new project or a career change. My transition from opera to sales taught me this firsthand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Courage in the Corporate World&lt;br&gt;
Standing on a stage, real or metaphorical, demands courage. It's about believing your voice will carry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lessons from Benny, Maya, and Wick&lt;br&gt;
'In The Spiderhands, the Bag Monster, and the Blanket Snakes,' three dogs guide us through what courage looks like.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Teaching Kids About Bravery&lt;br&gt;
This children's book shows kids that bravery isn't about size. It's about facing fears with a steady heart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Courage Leads to Growth&lt;br&gt;
By embracing our fears, whether in boardrooms or classrooms, we build resilience and grow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More About the Book&lt;br&gt;
Learn more about how this book can teach courage to children.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://www.chadtdyar.com/books/the-spiderhands-bag-monster-blanket-snakes" rel="noopener noreferrer"&gt;https://www.chadtdyar.com/books/the-spiderhands-bag-monster-blanket-snakes&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  leadership #courage
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>TITLE: Navigating Faith and Identity in Complex Environments</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 08 May 2026 03:02:06 +0000</pubDate>
      <link>https://dev.to/chadtdyar/title-navigating-faith-and-identity-in-complex-environments-3d1h</link>
      <guid>https://dev.to/chadtdyar/title-navigating-faith-and-identity-in-complex-environments-3d1h</guid>
      <description>&lt;p&gt;TITLE: Navigating Faith and Identity in Complex Environments&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The Tension Between Faith and Identity&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore how faith and identity often clash, especially in high-pressure environments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A Preacher's Kid's Journey&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discuss the personal journey from a South Carolina parsonage to a recital hall, and finally to a bar that becomes a sanctuary.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Role of Chosen Families&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highlight the freedom found when chosen families form as inherited ones fracture.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lessons in Personal Growth&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Share how understanding where you come from and where you choose to go can be worlds apart.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Gospel Trilogy's Impact&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discuss how the trilogy brings these struggles to life on stage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Conclusion&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect readers to "The Gospel Trilogy" for a deeper exploration of these themes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://www.chadtdyar.com/books/the-gospel-trilogy" rel="noopener noreferrer"&gt;https://www.chadtdyar.com/books/the-gospel-trilogy&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TITLE: How Dogs Teach Kids Self-Awareness: A Practical Insight</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 08 May 2026 03:02:05 +0000</pubDate>
      <link>https://dev.to/chadtdyar/title-how-dogs-teach-kids-self-awareness-a-practical-insight-nl</link>
      <guid>https://dev.to/chadtdyar/title-how-dogs-teach-kids-self-awareness-a-practical-insight-nl</guid>
      <description>&lt;p&gt;TITLE: How Dogs Teach Kids Self-Awareness: A Practical Insight&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Challenge of Self-Awareness: Kids struggle to understand their own actions. Dogs, with their simple, honest interactions, offer a unique way to teach this skill.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Role of Wick, Maya, and Benny: In "The Sparkle, the Snuggle, and the Song," these dogs aren't just characters. They're guides, showing kids the impact of their daily choices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Practical Lessons from Play: The book uses playful scenarios to demonstrate how different decisions affect feelings and group dynamics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Empowering Children's Independence: The story offers a framework for helping kids learn to reflect on their choices, promoting independence without adult interference.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tools for Parents and Educators: With scripts for tricky moments, the book provides a practical tool for teaching self-awareness.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conclusion: Discover how Wick, Maya, and Benny can help teach kids self-awareness.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://www.chadtdyar.com/books/the-sparkle-the-snuggle-and-the-song" rel="noopener noreferrer"&gt;https://www.chadtdyar.com/books/the-sparkle-the-snuggle-and-the-song&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ChildDevelopment #Learning
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Hey friends,</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 01 May 2026 18:53:47 +0000</pubDate>
      <link>https://dev.to/chadtdyar/hey-friends-1pon</link>
      <guid>https://dev.to/chadtdyar/hey-friends-1pon</guid>
      <description>&lt;p&gt;Hey friends, &lt;/p&gt;

&lt;p&gt;Do you ever find yourself staring at a blank screen, wondering where your next big idea is going to come from? I’ve been there too. Some days, the creativity flows like a river, and on others, it feels like I’m trying to squeeze water from a stone. &lt;/p&gt;

&lt;p&gt;This Thursday, I want to share a few techniques that have helped me break through those creative blocks. Whether you’re a developer, writer, or just someone who loves to create, these tips might resonate with you. &lt;/p&gt;

&lt;p&gt;First off, changing your environment can make a world of difference. Sometimes a simple shift, like working from a different room or heading to a café, can ignite fresh thoughts. It’s all about finding a space that inspires you.&lt;/p&gt;

&lt;p&gt;Next, don’t underestimate the power of conversation. Talking things through with a friend or colleague can spark new ideas. Often, simply verbalizing your thoughts helps you see them from a different angle.&lt;/p&gt;

&lt;p&gt;Lastly, give yourself permission to explore without pressure. Set aside some time to play with ideas—no matter how wild they may seem. You might be surprised at what you discover when you allow yourself to wander creatively.&lt;/p&gt;

&lt;p&gt;Let’s embrace those moments of uncertainty together. Creativity isn’t just about the end result; it’s about the journey and the connections we make along the way. What strategies do you use to keep your creative juices flowing? Share your thoughts below!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TITLE: Mastering Sales Improvisation: A Systematic Approach</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 01 May 2026 18:53:46 +0000</pubDate>
      <link>https://dev.to/chadtdyar/title-mastering-sales-improvisation-a-systematic-approach-27bl</link>
      <guid>https://dev.to/chadtdyar/title-mastering-sales-improvisation-a-systematic-approach-27bl</guid>
      <description>&lt;p&gt;TITLE: Mastering Sales Improvisation: A Systematic Approach&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Art of the Pivot: Understand why sales is more than just numbers. It's about handling unexpected turns like a pro.&lt;/li&gt;
&lt;li&gt;Improv as a Sales Tool: Discover how sales can be approached like an improv performance, focusing on genuine responses.&lt;/li&gt;
&lt;li&gt;Breaking Down Improvisation: Learn the four core components: status, listening, offer/accept, and framing.&lt;/li&gt;
&lt;li&gt;Building Your Skills: Each component is a muscle you can train. Find out how these skills help in handling objections.&lt;/li&gt;
&lt;li&gt;Turning Losses into Wins: Explore how being prepared to adapt ensures you land where you need to be in sales.&lt;/li&gt;
&lt;li&gt;The Role of Visual Consistency: For brand builders, Palette Pro helps maintain visual consistency, complementing the adaptability mindset.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://www.chadtdyar.com/books/think-on-your-feet-land-on-your-numbers" rel="noopener noreferrer"&gt;https://www.chadtdyar.com/books/think-on-your-feet-land-on-your-numbers&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TITLE: Embrace Authenticity in the Workplace</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 24 Apr 2026 14:01:05 +0000</pubDate>
      <link>https://dev.to/chadtdyar/title-embrace-authenticity-in-the-workplace-43od</link>
      <guid>https://dev.to/chadtdyar/title-embrace-authenticity-in-the-workplace-43od</guid>
      <description>&lt;p&gt;TITLE: Embrace Authenticity in the Workplace&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Mask We Wear&lt;br&gt;
Corporate spaces often feel like they demand a disguise. But what if we could step into work as we truly are?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Authenticity as a Strength&lt;br&gt;
"Bring Your Best Self To Work" isn't about breaking rules; it's about being genuine. This book is for those tired of playing roles at work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My Journey: Opera to Corporate&lt;br&gt;
I've walked this path from opera stages to corporate halls and found authenticity isn't just possible; it's powerful.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>I shipped ContentForge's iOS app on the fourth App Store submission. Here is what each rejection was and how I fixed it, because</title>
      <dc:creator>Chad Dyar</dc:creator>
      <pubDate>Fri, 24 Apr 2026 14:01:04 +0000</pubDate>
      <link>https://dev.to/chadtdyar/i-shipped-contentforges-ios-app-on-the-fourth-app-store-submission-here-is-what-each-rejection-4fjk</link>
      <guid>https://dev.to/chadtdyar/i-shipped-contentforges-ios-app-on-the-fourth-app-store-submission-here-is-what-each-rejection-4fjk</guid>
      <description>&lt;p&gt;I shipped ContentForge's iOS app on the fourth App Store submission. Here is what each rejection was and how I fixed it, because I could not find this information clearly written anywhere when I needed it.&lt;/p&gt;

&lt;p&gt;Rejection 1: Missing Info.plist purpose strings (ITMS-90683)&lt;/p&gt;

&lt;p&gt;If your Capacitor app uses any plugin that touches a privacy-sensitive iOS API, you need a corresponding NSUsageDescription string in your Info.plist. Apple's CI scanner catches this automatically and rejects the build before it ever reaches a human reviewer.&lt;/p&gt;

&lt;p&gt;My app used Capacitor's StatusBar plugin. The purpose string was missing.&lt;/p&gt;

&lt;p&gt;The fix: add the required string to ios/App/App/Info.plist. After fixing this the first time, I built a Node script that runs in CI and checks for missing strings automatically. It reads the Capacitor plugins from package.json, maps each one to the privacy APIs it touches, and verifies the corresponding purpose strings exist. That script runs on every push to main.&lt;/p&gt;

&lt;p&gt;Rejection 2: Incomplete AppIcon.appiconset&lt;/p&gt;

&lt;p&gt;Apple requires specific icon sizes for every device type your app supports. My asset catalog was missing several of the required dimensions.&lt;/p&gt;

&lt;p&gt;The fix: generate the full set programmatically from a 1024x1024 source PNG. Make sure the source PNG is flat RGB with no alpha channel and is not upscaled from a smaller source.&lt;/p&gt;

&lt;p&gt;Rejection 3: Magic link auth fails in Apple's review sandbox&lt;/p&gt;

&lt;p&gt;Apple's review team cannot use magic link authentication. They work in a sandboxed environment where email links do not resolve. If your app's only auth path is magic link, reviewers cannot create an account.&lt;/p&gt;

&lt;p&gt;The fix: detect whether you are running as a Capacitor native app using Capacitor.isNativePlatform(), and conditionally hide the magic link UI. On iOS, show only email and password. On web, show magic links as normal.&lt;/p&gt;

&lt;p&gt;What passed on submission 4&lt;/p&gt;

&lt;p&gt;The fourth submission included all of the above plus: server.startPage set to app.html in capacitor.config.ts, comprehensive touch target fixes at 44x44px minimum, 16px minimum font size on all inputs to prevent iOS zoom-on-focus, and env(safe-area-inset-*) padding on sticky navs for notch and Dynamic Island support.&lt;/p&gt;

&lt;p&gt;The CI workflow I wish I had before submission 1&lt;/p&gt;

&lt;p&gt;After all of this, the CI pipeline on main now runs npm install and build, the custom Info.plist lint script, TypeScript type check, and Vercel deploy preview. If the Info.plist lint fails, the build fails. The ITMS-90683 rejection path is now closed.&lt;/p&gt;

&lt;p&gt;If you are building a Capacitor app and heading toward App Store submission: read the full App Store Review Guidelines before you build the auth flow, test in airplane mode if you have any concern about network-dependent auth flows, and build the CI lint before you need it.&lt;/p&gt;

</description>
      <category>cicd</category>
      <category>ios</category>
      <category>mobile</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
