<?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: Alex</title>
    <description>The latest articles on DEV Community by Alex (@alexhadley).</description>
    <link>https://dev.to/alexhadley</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3976027%2F6c426a38-21a9-4049-9687-8af70d25bfdc.jpeg</url>
      <title>DEV Community: Alex</title>
      <link>https://dev.to/alexhadley</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexhadley"/>
    <language>en</language>
    <item>
      <title>How Architecture Decisions in Sprint One Become Production Problems by Sprint Ten</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Fri, 26 Jun 2026 10:46:59 +0000</pubDate>
      <link>https://dev.to/alexhadley/how-architecture-decisions-in-sprint-one-become-production-problems-by-sprint-ten-47d5</link>
      <guid>https://dev.to/alexhadley/how-architecture-decisions-in-sprint-one-become-production-problems-by-sprint-ten-47d5</guid>
      <description>&lt;p&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3lev23dpyajijlob5j3x.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3lev23dpyajijlob5j3x.jpg" alt=" " width="800" height="700"&gt;&lt;/a&gt;&lt;br&gt;
Most mobile app post-mortems tell the same story. The architecture looked fine at the start. The first few sprints shipped clean. Then somewhere around sprint eight or ten, velocity collapsed. Features that should have taken a day started taking a week. The codebase became something the team worked around rather than inside.&lt;/p&gt;

&lt;p&gt;The decisions that caused this were made before a single user touched the app.&lt;/p&gt;

&lt;p&gt;This is a breakdown of where those decisions typically go wrong specifically for iOS and Android apps built for Chicago's healthcare, logistics, and fintech markets, where the integration surface is wide and the tolerance for production failures is low.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Choosing a Framework Without Auditing the Integration Surface First
&lt;/h2&gt;

&lt;p&gt;The React Native vs Flutter vs native debate gets framed as a performance question. It's actually an integration question.&lt;/p&gt;

&lt;p&gt;Before a framework decision gets made, the right exercise is to map every third-party system the app will talk to: EHR systems, payment processors, mapping SDKs, push notification services, background sync requirements, Bluetooth or NFC if the app has hardware interaction. Then ask which of those integrations have well-maintained native modules for the chosen framework and which ones will require writing a bridge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitcot.com/react-native-app-development-company/" rel="noopener noreferrer"&gt;React Native&lt;/a&gt; handles most standard integrations cleanly. Where it breaks down is deep platform APIs anything that requires persistent background execution on iOS, fine-grained Bluetooth control, or tight integration with Apple's health data stack. If those are core features, &lt;a href="https://www.bitcot.com/ios-app-development-services/" rel="noopener noreferrer"&gt;native Swift&lt;/a&gt; removes an entire layer of indirection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitcot.com/flutter-app-development/" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt; has a different tradeoff. Its rendering consistency is genuinely excellent you get pixel-perfect parity across iOS and Android because Flutter draws its own UI rather than delegating to platform components. But the plugin ecosystem is thinner than React Native's, and for enterprise apps with complex native dependencies, that gap shows up during integration sprints.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The framework decision should be documented as an Architectural Decision Record (ADR)&lt;/strong&gt; written down with the rationale, the alternatives considered, and the tradeoffs accepted. If a development team cannot produce that document, the decision was made by default rather than by design.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# ADR-001: Framework Selection&lt;/span&gt;

Status:     Accepted
Date:       2026-06-01
Decision:   React Native

Context:
&lt;span class="p"&gt;  -&lt;/span&gt; Team has existing JS/TS experience
&lt;span class="p"&gt;  -&lt;/span&gt; App requires Stripe, Mapbox, push notifications
&lt;span class="p"&gt;  -&lt;/span&gt; No deep platform API requirements identified in discovery

Alternatives considered:
&lt;span class="p"&gt;  -&lt;/span&gt; Flutter: rejected thinner Stripe plugin support at time of decision
&lt;span class="p"&gt;  -&lt;/span&gt; Native Swift/Kotlin: rejected doubles team size, no iOS-only requirement

Consequences:
&lt;span class="p"&gt;  -&lt;/span&gt; If HealthKit integration required later → native module needed
&lt;span class="p"&gt;  -&lt;/span&gt; Agreed: revisit at sprint 8 if background sync requirements change
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. State Management Chosen for Familiarity, Not for Scale
&lt;/h2&gt;

&lt;p&gt;This is where a large percentage of React Native apps quietly accumulate debt.&lt;/p&gt;

&lt;p&gt;Redux is the most common state management choice in React Native projects often because developers know it, not because the app's state complexity warrants it. For apps with simple local state a few screens, a handful of API calls, minimal cross-component dependencies Redux introduces ceremony without benefit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Over-engineered: Redux for a simple user preference&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;setThemeAction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createAction&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Theme&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ui/setTheme&lt;/span&gt;&lt;span class="dl"&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;uiReducer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createReducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;builder&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;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setThemeAction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&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="c1"&gt;// ✅ Better: Zustand for isolated, low-frequency state&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useUIStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UIState&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;set&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="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;setTheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&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;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&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;The right approach is to audit the state model before writing it. What data is genuinely global auth state, user profile, app configuration versus what is local to a screen or feature module? Global state should be small and stable. Feature state should live as close to where it's used as possible.&lt;/p&gt;

&lt;p&gt;For &lt;a href="https://www.bitcot.com/android-app-development-company/" rel="noopener noreferrer"&gt;Android app development&lt;/a&gt; in Kotlin, &lt;code&gt;ViewModel&lt;/code&gt; with &lt;code&gt;StateFlow&lt;/code&gt; handles most cases cleanly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Clean: ViewModel + StateFlow no MVI ceremony needed&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderViewModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;OrderRepository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ViewModel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;_state&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MutableStateFlow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OrderUiState&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;StateFlow&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;OrderUiState&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asStateFlow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;loadOrders&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;viewModelScope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isLoading&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOrders&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;isLoading&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. API Contract Assumptions That Break Under Real Conditions
&lt;/h2&gt;

&lt;p&gt;Chicago's enterprise mobile market means most apps integrate with systems that were not built for mobile consumption. EHR APIs, logistics platform APIs, internal ERP systems these were designed for server-to-server or web consumption, not for mobile clients on variable network conditions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Over-fetching on slow connections
&lt;/h3&gt;

&lt;p&gt;An API endpoint that returns a 40-field object when the mobile screen needs five of those fields is not just inefficient it's a UX problem when the client is on a 3G connection in a hospital basement or a warehouse. A BFF (backend for frontend) layer shapes API responses for mobile consumption and is often worth building before launch, not retrofitting after.&lt;/p&gt;

&lt;h3&gt;
  
  
  No offline handling strategy
&lt;/h3&gt;

&lt;p&gt;For Chicago logistics and supply chain apps driver apps, field service tools, inventory scanners offline-first architecture is a core requirement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// WatermelonDB for offline-first React Native&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;Database&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;field&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="s1"&gt;@nozbe/watermelondb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Model&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;synced_at&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="nx"&gt;syncedAt&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;is_pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;isPending&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// written offline, synced later&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Sync when connectivity restores&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;syncPendingOrders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Database&lt;/span&gt;&lt;span class="p"&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;pending&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;orders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;is_pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;for &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;order&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;pending&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;pushToServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;markAsSynced&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 handling written for the happy path only
&lt;/h3&gt;

&lt;p&gt;API error responses in production bear little resemblance to documentation. Endpoints return &lt;code&gt;200&lt;/code&gt; with error payloads. Token refresh sequences race with parallel requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Swift actor prevent token refresh race condition&lt;/span&gt;
&lt;span class="kd"&gt;actor&lt;/span&gt; &lt;span class="kt"&gt;TokenRefreshCoordinator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;refreshTask&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;

  &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;validToken&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;throws&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;ongoing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;refreshTask&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ongoing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;  &lt;span class="c1"&gt;// join existing refresh&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Task&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchNewToken&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;refreshTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;refreshTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&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;h2&gt;
  
  
  4. Navigation Architecture That Doesn't Account for Deep Linking
&lt;/h2&gt;

&lt;p&gt;Deep linking gets treated as a feature to add later. In apps that need to handle push notification taps, email links, or web-to-app handoffs, it's a constraint that should shape navigation architecture from sprint one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Define deep link config early not as an afterthought&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;linking&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LinkingOptions&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;RootParamList&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;prefixes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://app.bitcot.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bitcot://&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;screens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;Home&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;orders/:orderId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&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="na"&gt;Notification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;notifications/:notifId&lt;/span&gt;&lt;span class="dl"&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;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Test in sprint 2, not sprint 9:&lt;/span&gt;
&lt;span class="c1"&gt;// npx uri-scheme open "bitcot://orders/123" --ios&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On &lt;a href="https://www.bitcot.com/ios-app-development-services/" rel="noopener noreferrer"&gt;iOS&lt;/a&gt;, Universal Links require a properly configured &lt;code&gt;apple-app-site-association&lt;/code&gt; file hosted on the domain AND a matching associated domains entitlement in the app. Teams that leave this to the end discover the domain configuration doesn't match the app's bundle ID in a production build, two days before launch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The right time to implement and test deep linking is sprint two or three, not sprint nine.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  5. CI/CD Pipeline Deferred Until the End of the Project
&lt;/h2&gt;

&lt;p&gt;Continuous integration for mobile is harder to set up than for web, and it gets deferred for that reason. By the time the team gets to it, there are environment-specific workarounds, manually managed signing certificates, and build steps that only work on one developer's machine.&lt;/p&gt;

&lt;p&gt;A mobile CI/CD pipeline configured at project start should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated builds triggered on pull request merge&lt;/li&gt;
&lt;li&gt;Unit and integration test runs against each build&lt;/li&gt;
&lt;li&gt;Code signing managed through the pipeline, not local developer keystores&lt;/li&gt;
&lt;li&gt;Build artifact management for TestFlight (iOS) and internal test track (Android)&lt;/li&gt;
&lt;li&gt;Versioning that increments automatically based on git tags
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Fastfile configure in sprint 1, not sprint 9&lt;/span&gt;
&lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:build_and_test&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;cocoapods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;clean_install: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;run_tests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="ss"&gt;scheme: &lt;/span&gt;&lt;span class="s2"&gt;"MyApp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;devices: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"iPhone 15 Pro"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="ss"&gt;code_coverage: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;lane&lt;/span&gt; &lt;span class="ss"&gt;:beta&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;increment_build_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="ss"&gt;build_number: &lt;/span&gt;&lt;span class="n"&gt;latest_testflight_build_number&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;type: &lt;/span&gt;&lt;span class="s2"&gt;"appstore"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# cert/profile via git no local keystore&lt;/span&gt;
  &lt;span class="n"&gt;build_app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;scheme: &lt;/span&gt;&lt;span class="s2"&gt;"MyApp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;upload_to_testflight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;skip_waiting_for_build_processing: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Teams that address CI/CD before launch address it under deadline pressure with a codebase that wasn't designed with automated testing in mind. That's the more expensive version of the same work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Looks Like in Practice for Chicago App Projects
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.bitcot.com/mobile-app-development-chicago/" rel="noopener noreferrer"&gt;mobile app development&lt;/a&gt; work that holds up in production whether it's a healthcare platform serving clinical workflows, a logistics tool running on a warehouse floor, or a fintech app processing real transactions in the Loop shares a common characteristic: the architectural decisions were made explicitly, documented, and validated against actual product requirements before the first feature sprint started.&lt;/p&gt;

&lt;p&gt;Discovery isn't a project management phase. It's the engineering phase where the foundation gets designed. Skipping it is how sprint one decisions become sprint ten problems.&lt;/p&gt;

&lt;p&gt;Chicago's app market, with its density of complex integration requirements, has less tolerance for technical debt than most. The companies operating here treat architecture as the first deliverable, not the last assumption.&lt;/p&gt;

&lt;p&gt;For teams working through these decisions on a Chicago app project, Bitcot's &lt;a href="https://www.bitcot.com/mobile-app-development-chicago/" rel="noopener noreferrer"&gt;mobile app development practice&lt;/a&gt; runs a structured discovery sprint that surfaces exactly these architectural questions before production code gets written. The &lt;a href="https://www.bitcot.com/case-studies/" rel="noopener noreferrer"&gt;case studies&lt;/a&gt; show how that process plays out across healthcare, fintech, and logistics.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bitcot builds &lt;a href="https://www.bitcot.com/ios-app-development-services/" rel="noopener noreferrer"&gt;iOS&lt;/a&gt;, &lt;a href="https://www.bitcot.com/android-app-development-company/" rel="noopener noreferrer"&gt;Android&lt;/a&gt;, and &lt;a href="https://www.bitcot.com/react-native-app-development-company/" rel="noopener noreferrer"&gt;cross-platform&lt;/a&gt; mobile apps for product teams in &lt;a href="https://www.bitcot.com/mobile-app-development-chicago/" rel="noopener noreferrer"&gt;Chicago&lt;/a&gt; and across the US.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>ios</category>
      <category>android</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How San Diego Web Design Projects Actually Fail (And the Engineering Decisions That Fix Them)</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Fri, 19 Jun 2026 10:01:46 +0000</pubDate>
      <link>https://dev.to/alexhadley/how-san-diego-web-design-projects-actually-fail-and-the-engineering-decisions-that-fix-them-319o</link>
      <guid>https://dev.to/alexhadley/how-san-diego-web-design-projects-actually-fail-and-the-engineering-decisions-that-fix-them-319o</guid>
      <description>&lt;p&gt;I've been building web products in San Diego for over a decade healthcare platforms in Sorrento Valley, fintech dashboards for Torrey Pines firms, ecommerce systems for DTC brands in the East Village. And after 500+ projects, I can tell you the pattern behind almost every failure.&lt;/p&gt;

&lt;p&gt;It's almost never the design.&lt;/p&gt;

&lt;p&gt;It's the engineering decisions made in the first two weeks.&lt;/p&gt;

&lt;p&gt;This post is a developer-first breakdown of where San Diego web projects actually go wrong, what good architecture looks like at each stage, and how to evaluate whether a web development agency here in San Diego or anywhere is actually going to solve your problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The San Diego Web Market Is More Complex Than It Looks
&lt;/h2&gt;

&lt;p&gt;San Diego doesn't have a single tech identity. It has five or six running in parallel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Biotech and life sciences&lt;/strong&gt; (La Jolla, Torrey Pines) : heavy on compliance, data handling, portal access control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defense and aerospace&lt;/strong&gt; (Kearny Mesa, Miramar) : security requirements, government contractor standards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hospitality and tourism&lt;/strong&gt; (Gaslamp, Mission Valley) : seasonal traffic spikes, booking integrations, mobile-first everything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DTC and ecommerce&lt;/strong&gt; (East Village, North Park) : performance obsession, conversion optimization, headless architecture&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Healthcare SaaS&lt;/strong&gt; (UTC, Sorrento Valley) : HIPAA, multi-tenant systems, real-time data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startups&lt;/strong&gt; (everywhere) : speed, MVPs, tight budgets, need to iterate fast&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these requires a fundamentally different approach to web development. A &lt;strong&gt;San Diego web design agency&lt;/strong&gt; that does great work for a restaurant group might build something catastrophically wrong for a biotech client not because they're bad, but because the technical requirements have almost nothing in common.&lt;/p&gt;

&lt;p&gt;When you see a list of "Top Web Design Companies in San Diego," most of it is SEO noise. The real question is: have they built for &lt;em&gt;your&lt;/em&gt; domain before?&lt;/p&gt;

&lt;h2&gt;
  
  
  The 4 Engineering Decisions That Make or Break a San Diego Web Project
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Data Architecture Before Design
&lt;/h3&gt;

&lt;p&gt;I've seen six-figure redesigns fail because the team locked in the front-end before anyone mapped the data model.&lt;/p&gt;

&lt;p&gt;Here's the actual order things should happen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Business requirements
  → Data entities and relationships
    → API contract
      → Component design
        → Visual design
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most agencies reverse this. They start with Figma mockups, get client approval on the visuals, and then try to figure out how to populate those components with real data. When the data model doesn't fit the design (and it never perfectly does), you get hacks extra API calls, denormalized data, frontend state management that's doing the work the backend should do.&lt;/p&gt;

&lt;p&gt;For a &lt;strong&gt;San Diego website development company&lt;/strong&gt; working with complex business logic like a healthcare portal with multiple user roles, or a marketplace with buyer/seller/admin permissions getting the data model right before a single component is built saves weeks of refactoring downstream.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Authentication and Authorization Decision
&lt;/h3&gt;

&lt;p&gt;This sounds boring. It is completely critical.&lt;/p&gt;

&lt;p&gt;Authentication (who are you) and authorization (what can you do) decisions made at project kickoff will determine whether your platform can scale, integrate with enterprise SSO systems, or support multi-tenant access. And these decisions are nearly impossible to reverse cheaply once the app is built.&lt;/p&gt;

&lt;p&gt;The common mistake: choosing the fastest, simplest auth solution for the MVP and assuming you'll "upgrade it later."&lt;/p&gt;

&lt;p&gt;The reality: I've seen teams spend 3 months post-launch ripping out auth systems because the client's enterprise customer required SAML SSO, or because a healthcare client needed role-based access at the record level neither of which was in scope for the "simple" auth they shipped with.&lt;/p&gt;

&lt;p&gt;For any project beyond a basic marketing site, the right question to ask a &lt;strong&gt;San Diego web development agency&lt;/strong&gt; is: &lt;em&gt;"How does your auth system handle role-based access control, and have you integrated it with OKTA or Azure AD before?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We've documented this kind of integration work in depth see our &lt;a href="https://www.bitcot.com/integrations/integration-okta/" rel="noopener noreferrer"&gt;OKTA integration writeup on bitcot.com&lt;/a&gt; for how this plays out on real enterprise projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Mobile Performance as Architecture, Not Afterthought
&lt;/h3&gt;

&lt;p&gt;San Diego has one of the highest mobile usage rates in California driven by its outdoor lifestyle, younger demographic mix, and tourism economy. For any B2C-facing product, mobile is your primary surface, not your secondary one.&lt;/p&gt;

&lt;p&gt;The mistake most teams make: building desktop-first and then "making it responsive." Responsive CSS is not the same as mobile performance architecture.&lt;/p&gt;

&lt;p&gt;Real mobile-first engineering means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image pipeline&lt;/strong&gt;: WebP/AVIF with proper &lt;code&gt;srcset&lt;/code&gt;, served from CDN with aggressive caching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critical CSS inlining&lt;/strong&gt;: above-the-fold styles loaded synchronously, rest deferred&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript budget&lt;/strong&gt;: hard limits on bundle size per route, code-splitting enforced in CI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API response shape&lt;/strong&gt;: mobile endpoints return only the fields the mobile view needs not the same payload as desktop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Touch targets&lt;/strong&gt;: 44px minimum, not an afterthought in CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a quick check you can run on any San Diego web design project right now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run Lighthouse from CLI against your current site&lt;/span&gt;
npx lighthouse https://yoursite.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--only-categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;performance &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--form-factor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mobile &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./report.json

&lt;span class="c"&gt;# Check your LCP specifically&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;report.json | jq &lt;span class="s1"&gt;'.audits["largest-contentful-paint"].displayValue'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your LCP is above 2.5s on mobile, you have a conversion problem. Google's AI-powered search results and Core Web Vitals ranking signals treat this as a hard penalty.&lt;/p&gt;

&lt;p&gt;We rebuilt the mobile architecture for a fitness platform &lt;a href="https://www.bitcot.com/case-studies/studio-sweat-ondemand/" rel="noopener noreferrer"&gt;Studio SWEAT onDemand&lt;/a&gt; that hit 10,000 active users in the first 90 days post-launch. The mobile-first architecture decision was made at kickoff, not at QA.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. API Integration Strategy
&lt;/h3&gt;

&lt;p&gt;Modern San Diego businesses run 10–20 software tools in parallel. Your web platform doesn't live in isolation it needs to talk to your CRM, your ERP, your payment processor, your analytics stack, your email marketing platform, and probably three or four others.&lt;/p&gt;

&lt;p&gt;The engineering decision here is: &lt;strong&gt;do you build point-to-point integrations, or do you design an integration layer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Point-to-point (the common path):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Website → Salesforce
Website → Stripe
Website → HubSpot
Website → Twilio
Website → NetSuite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works until one of those vendors changes their API, or you need to add a new tool, or you want to route data differently. Each integration is a separate maintenance burden.&lt;/p&gt;

&lt;p&gt;Integration layer (the right path for anything beyond 3 integrations):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Website → Internal Event Bus
              → Salesforce connector
              → Stripe connector
              → HubSpot connector
              → Twilio connector
              → NetSuite connector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The internal event bus (even a simple one built on webhooks and a queue) decouples your core application from your integrations. Any connector can be replaced or modified without touching the main application.&lt;/p&gt;

&lt;p&gt;For a &lt;strong&gt;web development company in San Diego&lt;/strong&gt; working on enterprise or mid-market projects, this architectural decision at project start determines whether integrations compound into value or compound into technical debt.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Custom Web Design" Actually Delivers vs. Template Solutions
&lt;/h2&gt;

&lt;p&gt;Let me be blunt about the template vs. custom question, because it's often framed wrong.&lt;/p&gt;

&lt;p&gt;The decision isn't really about aesthetics. Templates can look great. The decision is about &lt;strong&gt;whether your platform needs to do things the template wasn't designed to do.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a template when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need a marketing site, blog, or brochureware presence&lt;/li&gt;
&lt;li&gt;Your content and UX patterns fit within Webflow/WordPress/Squarespace's native capabilities&lt;/li&gt;
&lt;li&gt;You're pre-revenue and speed to market matters more than custom functionality&lt;/li&gt;
&lt;li&gt;The site is a channel, not a product&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Build custom when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your business logic requires custom workflows (multi-step approvals, role-based access, dynamic pricing)&lt;/li&gt;
&lt;li&gt;You need deep integration with 3+ external systems&lt;/li&gt;
&lt;li&gt;You're building a platform where users do work, not just consume content&lt;/li&gt;
&lt;li&gt;Performance at scale matters (10k+ concurrent users, large data sets, real-time features)&lt;/li&gt;
&lt;li&gt;You have compliance requirements (HIPAA, SOC 2, PCI) that a hosted CMS handles poorly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We built a &lt;a href="https://www.bitcot.com/solutions/digital-lending-platform/" rel="noopener noreferrer"&gt;digital lending platform&lt;/a&gt; that required custom risk scoring logic, multi-party document signing, and real-time credit bureau API calls none of which any existing template or CMS could have handled. The custom build wasn't a luxury; it was the only viable path.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Actually Evaluate a San Diego Website Development Agency
&lt;/h2&gt;

&lt;p&gt;Beyond the portfolio review, here are the technical questions that reveal whether an agency knows their craft:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask about their deployment pipeline:&lt;/strong&gt;&lt;br&gt;
"Walk me through what happens when a developer pushes code to production."&lt;/p&gt;

&lt;p&gt;A good answer includes: feature branches, pull request reviews, automated tests, staging environment, deployment automation (CI/CD), rollback procedure. A bad answer is "we push to FTP."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask about their testing approach:&lt;/strong&gt;&lt;br&gt;
"What percentage of code coverage do you typically maintain, and what types of tests do you write?"&lt;/p&gt;

&lt;p&gt;They should mention unit tests, integration tests, and E2E tests (Cypress, Playwright, or similar). If they look confused, move on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask about observability:&lt;/strong&gt;&lt;br&gt;
"How do you monitor performance and errors in production after launch?"&lt;/p&gt;

&lt;p&gt;They should mention error tracking (Sentry or similar), uptime monitoring, performance monitoring, and log aggregation. "We check Google Analytics" is not an answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask about their most painful project:&lt;/strong&gt;&lt;br&gt;
"Tell me about a project that went badly and what you learned from it."&lt;/p&gt;

&lt;p&gt;This one matters more than almost any other question. Agencies that can give you a specific, honest answer with clear takeaways have built the kind of institutional knowledge that protects you. Agencies that deflect or can't recall a bad experience are either inexperienced or dishonest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Project Examples from San Diego Web Development
&lt;/h2&gt;

&lt;p&gt;Here are three project types that illustrate what custom web development actually looks like in practice, with links to the full case studies:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telehealth Platform Healthcare SaaS&lt;/strong&gt;&lt;br&gt;
Multi-tenant architecture serving multiple health systems from a single platform. Required HIPAA-compliant data handling, role-based access at the record level, real-time video integration, and a composable component system that different health enterprises could configure independently.&lt;br&gt;
→ &lt;a href="https://www.bitcot.com/case-studies/temocare-telehealth/" rel="noopener noreferrer"&gt;Full case study: TemoCare Telehealth Platform&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fitness App Mobile-First Consumer Platform&lt;/strong&gt;&lt;br&gt;
iOS and Android app built alongside a web platform for an Orange County/San Diego fitness brand. Required video streaming, subscription management, progress tracking, and a community layer all under a performance budget tight enough to handle 10k+ concurrent users from day one.&lt;br&gt;
→ &lt;a href="https://www.bitcot.com/case-studies/studio-sweat-ondemand/" rel="noopener noreferrer"&gt;Full case study: Studio SWEAT onDemand&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parking Management Platform Enterprise Operations&lt;/strong&gt;&lt;br&gt;
Real-time parking availability, permit management, payment processing, and a reporting dashboard all integrated with physical sensor hardware through a custom API layer. Classic case where no off-the-shelf solution existed for the problem.&lt;br&gt;
→ &lt;a href="https://www.bitcot.com/case-studies/reliant-parking/" rel="noopener noreferrer"&gt;Full case study: Reliant Parking&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Checklist: What Good Web Architecture Looks Like
&lt;/h2&gt;

&lt;p&gt;Use this as a reference when reviewing any &lt;strong&gt;San Diego web design&lt;/strong&gt; proposal or existing codebase:&lt;/p&gt;

&lt;h3&gt;
  
  
  Foundation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Data model documented before UI design begins&lt;/li&gt;
&lt;li&gt;Auth/authz designed for the scale you're heading toward, not just where you are&lt;/li&gt;
&lt;li&gt;API contract (even informal) agreed before frontend dev starts&lt;/li&gt;
&lt;li&gt;Environments defined: local → dev → staging → production&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mobile Lighthouse score target agreed (aim for 80+ performance on mobile)&lt;/li&gt;
&lt;li&gt;Image optimization strategy documented (format, CDN, lazy loading)&lt;/li&gt;
&lt;li&gt;JavaScript bundle budget defined per route&lt;/li&gt;
&lt;li&gt;Core Web Vitals baselines measured before launch&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integrations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;All integrations listed and prioritized at kickoff&lt;/li&gt;
&lt;li&gt;Webhook/event strategy for real-time data sync&lt;/li&gt;
&lt;li&gt;Error handling and retry logic for every external API call&lt;/li&gt;
&lt;li&gt;Integration health monitoring post-launch&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD pipeline configured before first production deploy&lt;/li&gt;
&lt;li&gt;Error tracking (Sentry or equivalent) integrated&lt;/li&gt;
&lt;li&gt;Uptime monitoring configured with alerting&lt;/li&gt;
&lt;li&gt;Database backup and restore procedure tested&lt;/li&gt;
&lt;li&gt;Rollback procedure documented and tested&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought for Developers
&lt;/h2&gt;

&lt;p&gt;If you're a developer in San Diego evaluating whether to work for an agency, freelance, or join a product team the local market here is genuinely interesting. The variety of industries means you'll work on problems that rarely look the same twice.&lt;/p&gt;

&lt;p&gt;If you're a business evaluating a &lt;strong&gt;San Diego web design company&lt;/strong&gt;  ask technical questions. Don't just review portfolios. The engineering decisions made in week one of your project will determine what's possible in year two.&lt;/p&gt;

&lt;p&gt;And if you want to dig into how we approach these problems specifically at Bitcot I'm active here on DEV and happy to discuss in the comments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Alex Hadley Head of Engineering at &lt;a href="https://www.bitcot.com" rel="noopener noreferrer"&gt;Bitcot&lt;/a&gt;, San Diego, CA. We build custom web and mobile platforms for healthcare, fintech, SaaS, and enterprise clients. 500+ projects, 11+ years.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Relevant links:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.bitcot.com/case-studies/" rel="noopener noreferrer"&gt;Bitcot Case Studies&lt;/a&gt; - full project breakdowns&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.bitcot.com/web-app-development-services/" rel="noopener noreferrer"&gt;San Diego Web Design Services&lt;/a&gt; - what we build&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://www.bitcot.com/custom-software-development-services/" rel="noopener noreferrer"&gt;Custom Software Development&lt;/a&gt; - our approach&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Build a Case Management Platform for IDD Service Organizations published: false</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Tue, 16 Jun 2026 14:07:47 +0000</pubDate>
      <link>https://dev.to/alexhadley/how-to-build-a-case-management-platform-for-idd-service-organizationspublished-false-2i8o</link>
      <guid>https://dev.to/alexhadley/how-to-build-a-case-management-platform-for-idd-service-organizationspublished-false-2i8o</guid>
      <description>&lt;p&gt;Most healthcare platforms treat IDD (Intellectual and Developmental Disabilities) service delivery like a generic CRM problem. It isn't. The coordination hierarchy is real: DDS sets policy → Regional Centers execute it → Service Coordinators manage individuals → Providers deliver services. Flatten that model and you get information overload at every level and accountability gaps at every handoff.&lt;/p&gt;

&lt;p&gt;LOIS (Lifecycle Operations and Individual Support) is a purpose-built platform that solves this. Here's what the architecture looks like and why each decision was made.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five-Role Access Model
&lt;/h2&gt;

&lt;p&gt;LOIS defines five distinct roles, each with its own navigation tree, dashboard, and data scope not just permission toggles on a shared UI:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Core Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DDS Administrator&lt;/td&gt;
&lt;td&gt;System-wide oversight across all Regional Centers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regional Center Admin&lt;/td&gt;
&lt;td&gt;Center-level enrollment, coordinator assignment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Coordinator&lt;/td&gt;
&lt;td&gt;Individual caseload, IPP management, alerts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service Provider&lt;/td&gt;
&lt;td&gt;Appointments, health monitoring, case notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Individual / Family&lt;/td&gt;
&lt;td&gt;Care plan access, self-logged vitals, messaging&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A role-based routing layer maps every authenticated session to a dedicated layout. PostgreSQL row-level security policies enforce the same segmentation at the query layer so role separation is a data guarantee, not just a UI concern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frontend&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 16 (App Router) + React 19 + TypeScript&lt;/li&gt;
&lt;li&gt;Redux Toolkit for global state, Apollo Client for GraphQL, Axios for REST&lt;/li&gt;
&lt;li&gt;Tailwind CSS + CVA for type-safe component variants&lt;/li&gt;
&lt;li&gt;Recharts for role-specific dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backend&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NestJS 11 + TypeScript (code-first GraphQL via Apollo Server)&lt;/li&gt;
&lt;li&gt;PostgreSQL + TypeORM with row-level security&lt;/li&gt;
&lt;li&gt;GraphQL Subscriptions over WebSocket for real-time vitals alerts and IPP notifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Cognito for multi-org identity (JWT role claims verified on every resolver)&lt;/li&gt;
&lt;li&gt;AWS S3 with presigned URLs for direct-upload document storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;End-to-end TypeScript means the same type definitions flow from the GraphQL schema → NestJS resolvers → database entities → React component props. In compliance-sensitive domains, this is a correctness requirement, not a preference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Data Modeling Decision: Individual-Centric, Not Center-Centric
&lt;/h2&gt;

&lt;p&gt;This is where most IDD platforms fail. When an individual transfers between Regional Centers (which is routine), their full history should travel with them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- The individuals table holds a mutable FK to current center&lt;/span&gt;
&lt;span class="n"&gt;individuals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_regional_center_id&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;regional_centers&lt;/span&gt;

&lt;span class="c1"&gt;-- All history tables reference the individual, not the center&lt;/span&gt;
&lt;span class="n"&gt;ipp_records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;individual_id&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;individuals&lt;/span&gt;
&lt;span class="n"&gt;health_vitals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;individual_id&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;individuals&lt;/span&gt;
&lt;span class="n"&gt;service_authorizations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;individual_id&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;individuals&lt;/span&gt;
&lt;span class="n"&gt;case_notes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;individual_id&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;individuals&lt;/span&gt;
&lt;span class="n"&gt;appointment_records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;individual_id&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="n"&gt;individuals&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transferring an individual updates &lt;code&gt;current_regional_center_id&lt;/code&gt;. Every historical record stays intact.&lt;/p&gt;

&lt;h2&gt;
  
  
  IPP Status Is Computed, Not Manually Set
&lt;/h2&gt;

&lt;p&gt;The Individual Program Plan (IPP) is the legal backbone of IDD service delivery. LOIS computes its status dynamically from &lt;code&gt;review_due_date&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getIPPStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reviewDueDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Current&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Due Soon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Overdue&lt;/span&gt;&lt;span class="dl"&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;daysUntilDue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;differenceInDays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reviewDueDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;daysUntilDue&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Current&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;daysUntilDue&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Due Soon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Overdue&lt;/span&gt;&lt;span class="dl"&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;No coordinator action required. The status surfaces in every dashboard simultaneously the moment a plan goes overdue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Health Monitoring as a Native Layer
&lt;/h2&gt;

&lt;p&gt;Rather than integrating with an external EHR, LOIS embeds vitals tracking directly. Service Providers see blood pressure, heart rate, temperature, and O₂ saturation for every assigned individual in a single table color-coded alerts at the cell level, elapsed time since last reading, unresolved alert badge counts.&lt;/p&gt;

&lt;p&gt;Individuals can log their own readings from their portal. That reading immediately appears in the provider's patient health table and the coordinator's case view. Multiple parties contributing to the same record produces a more complete picture than any single source could.&lt;/p&gt;

&lt;h2&gt;
  
  
  Individual Portal: Participant, Not Subject
&lt;/h2&gt;

&lt;p&gt;The individual-facing experience uses a horizontal top nav (consumer app pattern) rather than the admin sidebar. Quick action cards are personalized "Message Sarah Johnson" not "Message Your Coordinator." Self-service appointment booking, document uploads, and vitals logging mean the individual contributes to their own record rather than just receiving it.&lt;/p&gt;

&lt;p&gt;This is not cosmetic. It reflects a different relationship with the platform. An individual who can see and interact with their own care data shows better care plan adherence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-Time Layer
&lt;/h2&gt;

&lt;p&gt;GraphQL Subscriptions via &lt;code&gt;graphql-ws&lt;/code&gt; push three event types without polling:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vitals alerts when a reading exceeds range thresholds&lt;/li&gt;
&lt;li&gt;IPP overdue notifications to coordinator dashboards&lt;/li&gt;
&lt;li&gt;Appointment status changes reflected across all relevant roles&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;RxJS manages the event streams for the notification feed on the client side.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Gets Built Wrong Most Often
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flat user models&lt;/strong&gt; hiding/showing nav items by role still shows users what they can't access. Separate navigation trees per role communicates purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Center-centric data storage&lt;/strong&gt; : case history that stays at the origin center when an individual transfers is a care quality failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual IPP status&lt;/strong&gt; : if a coordinator has to update "Overdue" manually, it won't get updated. Compute it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reporting as a separate module&lt;/strong&gt; : metrics that require navigation + parameter selection + generation won't be used for daily decisions. Surface KPIs in the dashboard directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Individual portal as read-only&lt;/strong&gt; : a portal with no write capability misses the therapeutic value of active participation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full architecture writeup, onboarding flow design, and role-specific feature breakdowns: &lt;a href="https://www.bitcot.com/build-idd-case-management-platform/" rel="noopener noreferrer"&gt;How to Build an IDD Case Management Platform&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>healthtech</category>
      <category>sandiago</category>
    </item>
    <item>
      <title>Why Bitcot Is One of San Diego's Most Versatile Tech Companies in 2026</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Fri, 12 Jun 2026 08:17:10 +0000</pubDate>
      <link>https://dev.to/alexhadley/why-bitcot-is-one-of-san-diegos-most-versatile-tech-companies-in-2026-4kcl</link>
      <guid>https://dev.to/alexhadley/why-bitcot-is-one-of-san-diegos-most-versatile-tech-companies-in-2026-4kcl</guid>
      <description>&lt;p&gt;&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%2Fjzfa0sp4kk6jth5hnqcj.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%2Fjzfa0sp4kk6jth5hnqcj.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
San Diego has quietly built a reputation as one of the most exciting tech hubs on the West Coast. Nestled between the Pacific Ocean and the desert, it might not have the same name recognition as Silicon Valley or Seattle, but the city's tech ecosystem is growing fast and companies like Bitcot are a big reason why.&lt;/p&gt;

&lt;p&gt;Founded over a decade ago and headquartered in San Diego, California, Bitcot has carved out a unique position in the software development world. Rather than specializing in just one narrow stack, they have assembled a genuinely broad technical practice one that spans everything from AI automation and &lt;a href="https://www.bitcot.com/mobile-app-development-services/" rel="noopener noreferrer"&gt;mobile app development&lt;/a&gt; to enterprise cloud infrastructure and WordPress solutions.&lt;/p&gt;

&lt;p&gt;This post breaks down exactly what technologies Bitcot works with, why they matter to US businesses, and what makes this company a compelling partner for startups, scaling companies, and enterprises alike.&lt;/p&gt;

&lt;h2&gt;
  
  
  A San Diego Company Built for the Modern Digital Landscape
&lt;/h2&gt;

&lt;p&gt;Before diving into the technology, it helps to understand what kind of company Bitcot actually is. They describe themselves as a product-led digital enablement partner which is a fancy way of saying they help businesses go from idea to launch, and then keep improving after that.&lt;/p&gt;

&lt;p&gt;With over 200 engineers on staff, 3,000+ completed projects, and clients ranging from funded startups to Fortune 500 companies, they have real operating experience across industries including healthcare, fintech, e-commerce, fitness, nonprofits, and logistics.&lt;/p&gt;

&lt;p&gt;What makes Bitcot stand out among San Diego's tech service providers is the sheer range of their technical capabilities. Let's walk through each category.&lt;/p&gt;

&lt;h2&gt;
  
  
  Web Development Technologies
&lt;/h2&gt;

&lt;p&gt;Bitcot's &lt;a href="https://www.bitcot.com/web-app-development-services/" rel="noopener noreferrer"&gt;web development&lt;/a&gt; practice covers both frontend and backend technologies across multiple programming languages and frameworks:&lt;/p&gt;

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

&lt;p&gt;PHP remains the backbone of the internet powering more than 75% of all websites. Bitcot's PHP team handles everything from custom web applications to complex backend logic and API integrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  WordPress &amp;amp; WooCommerce
&lt;/h3&gt;

&lt;p&gt;Their dedicated WordPress development service covers custom theme development, plugin creation, and WooCommerce store builds. For US businesses that need a scalable CMS without reinventing the wheel, this is a practical and cost-effective option.&lt;/p&gt;

&lt;h3&gt;
  
  
  React, Angular &amp;amp; Vue.js
&lt;/h3&gt;

&lt;p&gt;On the frontend, Bitcot works with all three of the major JavaScript frameworks. React powers interactive UIs, Angular fits large enterprise applications, and Vue.js offers a lightweight alternative for projects where startup speed matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node.js
&lt;/h3&gt;

&lt;p&gt;For backend JavaScript development, Bitcot uses Node.js extensively particularly for real-time applications, API servers, and microservices architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ruby on Rails
&lt;/h3&gt;

&lt;p&gt;When rapid prototyping or clean MVC architecture is a priority, their Ruby on Rails team brings proven experience in launching lean web applications quickly a popular choice for early-stage startups.&lt;/p&gt;

&lt;h3&gt;
  
  
  Java &amp;amp; .NET/C
&lt;/h3&gt;

&lt;p&gt;Enterprise-grade systems often demand the reliability and type-safety of Java or Microsoft's .NET ecosystem. Bitcot supports both, making them a viable partner for large-scale government, healthcare, or financial software projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shopify &amp;amp; Shopify App Development
&lt;/h3&gt;

&lt;p&gt;For e-commerce clients, Bitcot builds both standard Shopify storefronts and custom Shopify apps giving merchants more flexibility beyond what default themes offer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile App Development Stack
&lt;/h2&gt;

&lt;p&gt;Mobile is no longer optional for US businesses it is expected. Bitcot's mobile practice is one of the most comprehensive on the West Coast, covering:&lt;/p&gt;

&lt;h3&gt;
  
  
  iOS (Swift)
&lt;/h3&gt;

&lt;p&gt;Native iOS development using Apple's Swift language, targeting iPhones, iPads, Apple Watch, and Apple tvOS devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Android
&lt;/h3&gt;

&lt;p&gt;Native Android development for phones, tablets, and Google TV platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  React Native
&lt;/h3&gt;

&lt;p&gt;A cross-platform framework that lets teams build for both iOS and Android from a single codebase, reducing development time without sacrificing too much native feel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flutter
&lt;/h3&gt;

&lt;p&gt;Google's Flutter framework has become increasingly popular for polished cross-platform apps. Bitcot uses it for projects where consistent UI across platforms is critical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Expo
&lt;/h3&gt;

&lt;p&gt;Expo simplifies React Native development and is a good fit for projects that need to ship quickly without complex native configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Progressive Web Apps (PWA)
&lt;/h3&gt;

&lt;p&gt;PWAs blur the line between web and mobile they load in a browser but behave like an installed app. Bitcot builds PWAs for clients who want mobile reach without separate app store deployments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hybrid Apps
&lt;/h3&gt;

&lt;p&gt;For certain budgets or timelines, hybrid development using web technologies inside a native shell is still a viable path, and Bitcot supports it.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI, Automation &amp;amp; Generative AI
&lt;/h2&gt;

&lt;p&gt;This is arguably where Bitcot's current momentum is strongest. As businesses rush to incorporate AI into their operations, Bitcot has been building AI-native systems well ahead of the hype curve.&lt;/p&gt;

&lt;h3&gt;
  
  
  LangChain &amp;amp; LangGraph
&lt;/h3&gt;

&lt;p&gt;LangChain is the most widely adopted framework for building LLM-powered applications. Bitcot uses it for complex agent workflows, retrieval-augmented generation (RAG) systems, and multi-step AI chains. LangGraph extends this with stateful agent orchestration.&lt;/p&gt;

&lt;h3&gt;
  
  
  CrewAI &amp;amp; Phidata
&lt;/h3&gt;

&lt;p&gt;These frameworks support multi-agent systems where multiple AI models collaborate on tasks useful for complex research, content pipelines, or customer service automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  n8n, Botpress &amp;amp; Flowise
&lt;/h3&gt;

&lt;p&gt;For teams that want workflow automation without writing everything from scratch, these tools offer fast deployment. Bitcot integrates them into client workflows to automate repetitive tasks at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Bedrock
&lt;/h3&gt;

&lt;p&gt;Amazon's managed AI service gives access to foundation models from Anthropic, Meta, and others through a secure, enterprise-grade API. Bitcot uses it for clients who need AI in a cloud-native environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Copilot Studio &amp;amp; Power Automate
&lt;/h3&gt;

&lt;p&gt;For Microsoft-centric enterprises, these tools provide a familiar path to AI and automation within existing Microsoft 365 ecosystems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chatbot Development
&lt;/h3&gt;

&lt;p&gt;Bitcot builds custom AI chatbots for customer support, internal knowledge bases, lead generation, and healthcare intake workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  GenAI Integration Services
&lt;/h3&gt;

&lt;p&gt;Rather than just building standalone AI tools, Bitcot integrates generative AI capabilities into existing platforms and business workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud, DevOps &amp;amp; Infrastructure
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AWS (Cloud Computing &amp;amp; Serverless)
&lt;/h3&gt;

&lt;p&gt;Amazon Web Services remains the gold standard for scalable cloud infrastructure. Bitcot handles full AWS deployments from EC2 and RDS databases to Lambda serverless functions and S3 storage architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  DevOps Services
&lt;/h3&gt;

&lt;p&gt;Continuous integration, continuous deployment, &lt;a href="https://www.bitcot.com/enterprise-devops-transformation/" rel="noopener noreferrer"&gt;infrastructure&lt;/a&gt; as code, container orchestration Bitcot helps engineering teams build repeatable, automated delivery pipelines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud Application Development
&lt;/h3&gt;

&lt;p&gt;Building applications cloud-native from day one, designed to scale horizontally and take advantage of managed cloud services.&lt;/p&gt;

&lt;h3&gt;
  
  
  QA &amp;amp; Testing Services
&lt;/h3&gt;

&lt;p&gt;Quality assurance is embedded throughout their development process, not bolted on at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data, Analytics &amp;amp; Business Intelligence
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Big Data Analytics &amp;amp; BI
&lt;/h3&gt;

&lt;p&gt;Building data pipelines, dashboards, and reporting systems that turn raw data into actionable business intelligence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modern Data Stack
&lt;/h3&gt;

&lt;p&gt;Implementing contemporary data architectures using tools like dbt, Snowflake, Fivetran, and Looker to create centralized, reliable data warehouses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Predictive Analytics
&lt;/h3&gt;

&lt;p&gt;Using machine learning models to forecast trends, predict customer behavior, and support data-driven decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web Data Extraction &amp;amp; Scraping
&lt;/h3&gt;

&lt;p&gt;Automated data collection pipelines for businesses that need structured data from external sources.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrations &amp;amp; Third-Party Services
&lt;/h2&gt;

&lt;p&gt;No modern application lives in isolation. Bitcot has a dedicated integrations practice that connects systems together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Salesforce : CRM integration for sales teams&lt;/li&gt;
&lt;li&gt;NetSuite : ERP integration for finance and operations&lt;/li&gt;
&lt;li&gt;SugarCRM &amp;amp; SuiteCRM : open-source CRM deployments&lt;/li&gt;
&lt;li&gt;Twilio : SMS, voice, and IVR communications&lt;/li&gt;
&lt;li&gt;Google Calendar &amp;amp; Maps : scheduling and location features&lt;/li&gt;
&lt;li&gt;OAuth &amp;amp; OKTA : authentication and identity management&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.bitcot.com/integrations/payment-gateway-api-integration/" rel="noopener noreferrer"&gt;Payment Gateways&lt;/a&gt; : Stripe, Braintree, and others&lt;/li&gt;
&lt;li&gt;VGS (Very Good Security) : data vaulting for PCI-compliant applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Low Code, No Code &amp;amp; Rapid Prototyping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bubble Development
&lt;/h3&gt;

&lt;p&gt;Bubble is the leading no-code platform for web apps. Bitcot builds functional prototypes and even production-grade tools on Bubble for clients who need launch speed over customization depth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microsoft Power Platform
&lt;/h3&gt;

&lt;p&gt;Power Apps, Power Automate, Power BI &lt;a href="https://www.bitcot.com/power-platform-consulting-services/" rel="noopener noreferrer"&gt;Microsoft's&lt;/a&gt; suite for business automation and internal tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prebuilt Accelerators
&lt;/h3&gt;

&lt;p&gt;Bitcot has developed reusable platform components and solution accelerators that reduce time-to-launch for common use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identity, Security &amp;amp; CMS
&lt;/h2&gt;

&lt;p&gt;Rounding out their full-service offering, Bitcot also works in identity and access management (IAM) helping enterprises control who can access what across complex multi-system environments as well as headless CMS development using platforms like Contentful for content-driven websites and applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Industries Bitcot Serves in the USA
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Healthcare : &lt;a href="https://www.bitcot.com/healthcare/ehr-software-development/" rel="noopener noreferrer"&gt;EHR/EMR systems&lt;/a&gt;, telemedicine platforms, medical device software, RPM solutions&lt;/li&gt;
&lt;li&gt;FinTech : digital lending platforms, payment processing, compliance-driven applications&lt;/li&gt;
&lt;li&gt;E-Commerce &amp;amp; Retail marketplaces, Shopify/WooCommerce stores, subscription platforms&lt;/li&gt;
&lt;li&gt;Fitness &amp;amp; Wellness mobile apps, streaming platforms, on-demand service tools&lt;/li&gt;
&lt;li&gt;Nonprofits : donor management, volunteer coordination, community platforms&lt;/li&gt;
&lt;li&gt;Startups : MVPs, rapid prototypes, product-market fit discovery&lt;/li&gt;
&lt;li&gt;Enterprise : digital transformation, legacy modernization, multi-tenant &lt;a href="https://www.bitcot.com/saas-development-company/" rel="noopener noreferrer"&gt;SaaS&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Makes Bitcot a Strong Fit for US Businesses?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  They cover the full product lifecycle
&lt;/h3&gt;

&lt;p&gt;From initial product discovery and UX wireframing through development, QA, launch, and post-launch support Bitcot handles every phase. This is valuable because it avoids the handoff friction that comes with using separate agencies for design and development.&lt;/p&gt;

&lt;h3&gt;
  
  
  They have depth in healthcare and regulated industries
&lt;/h3&gt;

&lt;p&gt;Healthcare software has unusually strict requirements around data privacy (HIPAA), system integrations (HL7, FHIR), and clinical workflows. Bitcot's healthcare portfolio spanning EHR systems, telemedicine, remote patient monitoring, and AI agents for clinical use signals real domain knowledge, not just generic development experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  They are ahead of the AI curve
&lt;/h3&gt;

&lt;p&gt;Many agencies have only recently started adding AI services after ChatGPT made it mainstream. Bitcot's AI practice goes meaningfully deeper building multi-agent systems with LangGraph and CrewAI, integrating AWS Bedrock, and deploying automation workflows with tools like n8n and Flowise. That operational experience matters when choosing a partner for AI work.&lt;/p&gt;

&lt;h3&gt;
  
  
  They are based in San Diego but serve nationally
&lt;/h3&gt;

&lt;p&gt;Their San Diego base gives them natural proximity to Southern California's dense startup and enterprise ecosystem. But the team also works with clients across the US making them accessible regardless of where your business is headquartered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The tech industry has no shortage of development shops, but few combine the breadth, depth, and domain experience that Bitcot has assembled in San Diego. Whether you need a React-powered web app, a  mobile platform, an AI agent that automates your customer support queue, or a WooCommerce store with custom integrations they have teams for all of it.&lt;/p&gt;

&lt;p&gt;For US businesses evaluating technology partners in 2026, Bitcot is worth a serious look not as a generic "we do everything" agency, but as a company that has built genuine technical depth across the modern development stack over more than a decade of project delivery.&lt;/p&gt;

&lt;p&gt;You can learn more or schedule a project consultation at &lt;a href="https://www.bitcot.com/" rel="noopener noreferrer"&gt;bitcot.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>webdev</category>
      <category>automation</category>
      <category>ai</category>
    </item>
    <item>
      <title>Identity Verification Platform Development: Solving the Hard Engineering Problems</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Thu, 11 Jun 2026 11:34:26 +0000</pubDate>
      <link>https://dev.to/alexhadley/how-to-build-a-scalable-identity-verification-platform-engineering-lessons-from-real-kyc-projects-20f3</link>
      <guid>https://dev.to/alexhadley/how-to-build-a-scalable-identity-verification-platform-engineering-lessons-from-real-kyc-projects-20f3</guid>
      <description>&lt;p&gt;&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%2F6crhzapmoddngdjtpkdz.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%2F6crhzapmoddngdjtpkdz.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Identity Verification Platform Development: Solving the Hard Engineering Problems
&lt;/h1&gt;

&lt;p&gt;Building a KYC product sounds simple until you actually build one.&lt;/p&gt;

&lt;p&gt;Upload an ID. Scan a face. Approve the user. That's the pitch.&lt;br&gt;
The reality? Identity verification is one of the most technically demanding products in fintech and most teams don't realize it until something breaks in production.&lt;/p&gt;

&lt;p&gt;Here's what goes wrong, and how engineering teams handle it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Top 10 Identity Verification Platforms in the USA (2025)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;What They Do Best&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Jumio&lt;/td&gt;
&lt;td&gt;AI-driven ID checks with liveness detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Onfido&lt;/td&gt;
&lt;td&gt;Biometric + document verification for fintech&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Socure&lt;/td&gt;
&lt;td&gt;Graph-based identity scoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Persona&lt;/td&gt;
&lt;td&gt;Flexible, dev-friendly KYC flow builder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Stripe Identity&lt;/td&gt;
&lt;td&gt;Frictionless for Stripe-integrated products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Trulioo&lt;/td&gt;
&lt;td&gt;Wide global document coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Alloy&lt;/td&gt;
&lt;td&gt;Smart decision engine for financial onboarding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;ID.me&lt;/td&gt;
&lt;td&gt;Government and healthcare identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Veriff&lt;/td&gt;
&lt;td&gt;High accuracy across 190+ countries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Ekata (Mastercard)&lt;/td&gt;
&lt;td&gt;Phone, email, and address intelligence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Problem 1: OCR Gets It Wrong More Than You Think
&lt;/h2&gt;

&lt;p&gt;AI models misread identity documents regularly.&lt;/p&gt;

&lt;p&gt;Lighting conditions, camera quality, document wear, and non-English scripts all affect extraction accuracy. A model that performs well on US driver's licenses may completely fail on an international passport or a worn state ID.&lt;/p&gt;

&lt;p&gt;One wrong character on a date of birth creates a false rejection. That's a real user blocked and a conversion lost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;br&gt;
Run a two-stage OCR pipeline. The first model extracts data.The second scores how confident that extraction actually is.Anything below your confidence threshold routes to a human&lt;br&gt;
review queue automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 2: Slow Onboarding Destroys Conversion Rates
&lt;/h2&gt;

&lt;p&gt;Users uploading an ID on mobile will not wait through a 15-second loading screen. They close the app and move on.&lt;/p&gt;

&lt;p&gt;Most teams blame the vendor API when this happens. The real cause is almost always sequential architecture verification steps waiting on each other when they could run simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;br&gt;
Redesign your flow for parallel execution. While your OCR model processes the document, your liveness check should already be initializing. Push background tasks to async workers. Return a visible progress state to the user within 3 seconds then update them when processing completes.&lt;/p&gt;

&lt;p&gt;Speed perception matters just as much as actual speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 3: Scaling to Millions of Verifications
&lt;/h2&gt;

&lt;p&gt;A system that runs smoothly at 1,000 daily verifications behaves completely differently at 1 million. The failure almost never comes from your application server it comes from everything running behind it.&lt;/p&gt;

&lt;p&gt;Rate limits from third-party APIs and write contention on status update tables create bottlenecks that compound under load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to fix it:&lt;/strong&gt;&lt;br&gt;
Build queue-first from day one. Every incoming verification request&lt;br&gt;
enters a job queue immediately. Independent workers process jobs and write results back asynchronously. No single slow vendor can stall your entire pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineering Checklist Before You Ship
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Two-stage OCR with confidence scoring&lt;/li&gt;
&lt;li&gt;Auto-routing to human review below confidence threshold&lt;/li&gt;
&lt;li&gt;Parallel async verification steps&lt;/li&gt;
&lt;li&gt;Queue-based architecture for all verification requests&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building a Verification Platform?
&lt;/h2&gt;

&lt;p&gt;The engineering is solvable. It just takes the right architecture from the start.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bitcot.com" rel="noopener noreferrer"&gt;Talk to Bitcot → bitcot.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have you built a KYC or identity verification system? Share what broke first in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kyc</category>
      <category>softwareengineering</category>
      <category>fintech</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why iOS App Projects Fail in 2026 (And What Actually Fixes It)</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Wed, 10 Jun 2026 06:30:11 +0000</pubDate>
      <link>https://dev.to/alexhadley/why-ios-app-projects-fail-in-2026-and-what-actually-fixes-it-58e1</link>
      <guid>https://dev.to/alexhadley/why-ios-app-projects-fail-in-2026-and-what-actually-fixes-it-58e1</guid>
      <description>&lt;p&gt;&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%2Fbmzr06prmqj35ffsgvwr.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%2Fbmzr06prmqj35ffsgvwr.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most iOS app projects don't fail because the developers weren't good enough.&lt;br&gt;
They fail because the process had holes in it. The kind of holes that are invisible until a launch blows up or a user churns out in the first minute.&lt;br&gt;
I've seen this pattern across teams in San Francisco, Los Angeles, San Diego, and beyond and the problems are remarkably consistent no matter the company size.&lt;br&gt;
Here's what's actually going wrong in 2026, and what fixes it for real.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Process Gap Nobody Talks About: CI/CD and App Store Readiness
&lt;/h2&gt;

&lt;p&gt;App Store rejections don't usually happen because someone wrote bad code. They happen because the submission process wasn't part of the build process.&lt;br&gt;
Privacy manifests. Entitlements. Info.plist entries Apple now requires. These aren't hard to handle but they're easy to forget when they're done manually at the end of a sprint.&lt;br&gt;
Teams that stopped getting surprised by rejections did one thing: they automated submission checks into every build, not just release builds. If it's not valid when you're in development, it won't be valid when you ship.&lt;br&gt;
For iOS teams in &lt;strong&gt;Los Angeles&lt;/strong&gt; and &lt;strong&gt;San Francisco&lt;/strong&gt; working on tight release schedules, this alone can save days per sprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  SwiftUI in 2026: Commit or Keep Paying the Tax
&lt;/h2&gt;

&lt;p&gt;Half &lt;a href="https://www.bitcot.com/building-wellnesswidgets-an-ios-health-monitoring-app-with-healthkit-widgetkit-and-swiftui/" rel="noopener noreferrer"&gt;SwiftUI&lt;/a&gt;, half UIKit is a choice that makes sense for a moment and costs you for years.&lt;br&gt;
The interoperability works. But onboarding new developers onto a mixed codebase takes longer. Edge case bugs surface in ways that are hard to reproduce. And the cognitive load of context-switching between two UI paradigms inside a single app adds up across every ticket.&lt;br&gt;
By 2026, teams starting fresh should be full SwiftUI. Teams migrating legacy apps should have a written strategy for which screens move first not just "we'll get to it.&lt;br&gt;
The investment pays off faster than most teams expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy Compliance Is Not a Launch Task
&lt;/h2&gt;

&lt;p&gt;Apple's privacy requirements are not stable. ATT, required privacy manifests, stricter API access controls these change across OS updates and developer policy updates, and something that shipped cleanly six months ago may trigger a rejection today.&lt;br&gt;
The teams handling this well treat it the same way they treat security: as an ongoing discipline with a designated owner, not a checkbox someone runs through before a release.&lt;br&gt;
If you're building in San Diego or Sacramento for healthcare, fintech, or any regulated industry, this is doubly important. The cost of a rejected update in a production app serving real users is not just a delay it's a support crisis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test on the Phone Your User Actually Has
&lt;/h2&gt;

&lt;p&gt;The iPhone 16 Pro is a great device. It is not representative of your user base.&lt;br&gt;
Millions of active iOS users are on hardware from 3–5 years ago. If your app hasn't been profiled on an iPhone 12 or 13, you don't actually know how it performs for a significant portion of your audience.&lt;br&gt;
Open Instruments before the sprint ends, not after the build ships. Async image loading, lazy lists, background task management these aren't "nice to haves" in 2026. They're the baseline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Onboarding Flow Is Probably Too Long
&lt;/h2&gt;

&lt;p&gt;Users in the US, especially in high-competition markets like San Francisco and Los &lt;strong&gt;Angeles&lt;/strong&gt;, have seen enough apps to know when they're being asked for too much before they've seen any value.&lt;br&gt;
Permission requests before the feature needs them. Five screens before the first interaction. A form before the user knows why the app is worth their time.&lt;br&gt;
Cut it in half. Then test whether you actually need what you cut. Most teams find they don't.&lt;/p&gt;

&lt;h2&gt;
  
  
  QA Doesn't Scale Manually And Your Sprint Cadence Already Proved It
&lt;/h2&gt;

&lt;p&gt;If your QA process is mostly manual and your release cadence has increased over the past year, you already know this isn't working. The queue grows faster than the team can clear it.&lt;br&gt;
XCTest coverage built alongside features not added retroactively changes this. Automated regression on every PR means the bug is caught before it reaches the reviewer, not after it reaches the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working With a Team That's Already Solved This
&lt;/h2&gt;

&lt;p&gt;If you'd rather not build this process from scratch, &lt;a href="https://www.bitcot.com/ios-app-development-services/" rel="noopener noreferrer"&gt;Bitcot's iOS development team&lt;/a&gt; has done it across hundreds of projects.&lt;br&gt;
They're based in the US and work with startups and enterprises across California San Diego, Los Angeles, San Francisco, San Jose building custom iPhone and iPad apps using Swift, SwiftUI, and the latest Apple frameworks. Full lifecycle: discovery, design, development, App Store submission, and post-launch support.&lt;br&gt;
If you're looking to hire iOS developers or get a new project moving fast, &lt;a href="https://www.bitcot.com/ios-app-development-services/" rel="noopener noreferrer"&gt;start with their iOS services page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;iOS app development in 2026 rewards teams that treat process as a product. Automate your submission checks. Pick a UI framework and stick with it. Handle privacy as an ongoing concern. Test on older hardware. Trim your onboarding. Build test coverage as you go.&lt;br&gt;
Do those six things consistently and you'll outship most of the competition not because you're faster, but because you're not losing time to the same preventable problems every release cycle.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>mobile</category>
      <category>swift</category>
      <category>mobiledev</category>
    </item>
    <item>
      <title>Custom E-Commerce Development: Next.js &amp; BigCommerce Headless Platform</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Tue, 09 Jun 2026 13:24:07 +0000</pubDate>
      <link>https://dev.to/alexhadley/custom-e-commerce-development-nextjs-bigcommerce-headless-platform-2aik</link>
      <guid>https://dev.to/alexhadley/custom-e-commerce-development-nextjs-bigcommerce-headless-platform-2aik</guid>
      <description>&lt;p&gt;Bitcot’s engineering team developed a fully headless e-commerce storefront for a boutique brand, leveraging &lt;strong&gt;Next.js&lt;/strong&gt; and &lt;strong&gt;BigCommerce GraphQL API&lt;/strong&gt; to create a high-performance, scalable solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Integrations &amp;amp; Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js SSR frontend&lt;/strong&gt; for improved SEO and faster page rendering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BigCommerce GraphQL API&lt;/strong&gt; to manage products, pricing, and inventory in real-time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keycloak SSO&lt;/strong&gt; enabling seamless login for existing users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Reward Management System&lt;/strong&gt; with no-code product flows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin impersonation panel&lt;/strong&gt; built using Node.js Monarch system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sub-variant availability tracking&lt;/strong&gt; through BigCommerce Metafields&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Salesforce CRM integration&lt;/strong&gt; with bidirectional data synchronization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic reward redemption catalog&lt;/strong&gt; for personalized user experiences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Outcomes &amp;amp; Performance Metrics&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pages load &lt;strong&gt;40% faster&lt;/strong&gt; than previous implementation&lt;/li&gt;
&lt;li&gt;Achieved &lt;strong&gt;95+ Lighthouse scores&lt;/strong&gt; for performance, accessibility, and SEO&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero authentication failures&lt;/strong&gt; across 10,000+ SSO transactions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;40% higher login completion rates&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Maintained &lt;strong&gt;99.8% uptime&lt;/strong&gt; across five interconnected systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read more about the project here: Bitcot Next.js &amp;amp; BigCommerce Case Study &lt;br&gt;
&lt;a href="https://www.bitcot.com/nextjs-bigcommerce-ecommerce-platform/" rel="noopener noreferrer"&gt;https://www.bitcot.com/nextjs-bigcommerce-ecommerce-platform/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobileappchicago</category>
      <category>customsoftwaredevelopment</category>
      <category>mobileappdevelopment</category>
      <category>ecommercedevelopment</category>
    </item>
  </channel>
</rss>
