<?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: Ahmed Sulaiman</title>
    <description>The latest articles on DEV Community by Ahmed Sulaiman (@ahmed_sulaiman).</description>
    <link>https://dev.to/ahmed_sulaiman</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F300177%2Ff76eb74f-2df3-4eff-9e37-7b4066b6add6.jpg</url>
      <title>DEV Community: Ahmed Sulaiman</title>
      <link>https://dev.to/ahmed_sulaiman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ahmed_sulaiman"/>
    <language>en</language>
    <item>
      <title>Cookie-based login for Chrome extensions with Supabase</title>
      <dc:creator>Ahmed Sulaiman</dc:creator>
      <pubDate>Wed, 18 Jun 2025 16:59:09 +0000</pubDate>
      <link>https://dev.to/ahmed_sulaiman/cookie-based-login-for-chrome-extensions-with-supabase-am3</link>
      <guid>https://dev.to/ahmed_sulaiman/cookie-based-login-for-chrome-extensions-with-supabase-am3</guid>
      <description>&lt;p&gt;I recently built a &lt;a href="https://chromewebstore.google.com/detail/katalog-save-any-article/mlpfbidnlphmjfnmjgokpaenpklafiij" rel="noopener noreferrer"&gt;Chrome extension&lt;/a&gt; for &lt;a href="https://usekatalog.com/" rel="noopener noreferrer"&gt;Katalog&lt;/a&gt;, the audio-first read-it-later app. It's similar to Pocket, but focused on listening to the articles you save. When users find an interesting piece of content, they can save it with the extension. Katalog then parses it and generates optimised audio narration.&lt;/p&gt;

&lt;p&gt;I needed the extension to recognize users who were already logged into the web app, without making them log in again. I also wanted to avoid duplicating the authentication flow or storing tokens in multiple places. Here's how I approached it, what worked, and what I'd do differently next time.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why I chose cookie-based auth
&lt;/h2&gt;

&lt;p&gt;I tried a few different approaches before settling on cookie-based authentication. At first, I considered integrating the Supabase SDK directly into the extension, or building a custom login flow inside the extension. Both options felt too heavy and required me to manage tokens separately from the web app.&lt;/p&gt;

&lt;p&gt;Instead, I realized I could just check for the presence of the Supabase auth cookies that are set when a user logs into the web app. If those cookies exist, the extension can assume the user is authenticated. This way, I could reuse the existing login flow and avoid building extra UI or logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Architecture overview
&lt;/h2&gt;

&lt;p&gt;Here’s a simple diagram of how things fit together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-------------------+         +-------------------+         +-------------------+
|                   |         |                   |         |                   |
|   Chrome          |  &amp;lt;----&amp;gt; |   Web App         | &amp;lt;-----&amp;gt; |   Supabase        |
|   Extension       |         |   (React, Magic   |         |   (Auth, DB)      |
|                   |         |    Link Auth)     |         |                   |
+-------------------+         +-------------------+         +-------------------+
        |                              ^
        |                              |
        |   (Checks for Supabase       |
        |    cookies on web app        |
        |    domain)                   |
        +------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The extension checks for Supabase cookies on the web app’s domain.&lt;/li&gt;
&lt;li&gt;If authenticated, it calls a web app endpoint (e.g., &lt;code&gt;/api/parse-article&lt;/code&gt;) to perform actions.&lt;/li&gt;
&lt;li&gt;The web app handles authentication and talks to Supabase.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Setting up Supabase auth in the web app
&lt;/h2&gt;

&lt;p&gt;I use Supabase's Magic Link authentication in the web app that I built with React Router v7 (framework mode). The web app also uses server-side rendering, so I handle authentication with middleware that intercepts requests and checks for Supabase cookies in the headers.&lt;/p&gt;

&lt;p&gt;You can set up Supabase authentication for SSR with &lt;a href="https://supabase.com/docs/guides/auth/server-side" rel="noopener noreferrer"&gt;this guide&lt;/a&gt;. The important part is that Supabase sets its own cookies when a user logs in. You don't need to do anything special in the extension to create or manage these cookies.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Chrome extension: cookie detection
&lt;/h2&gt;

&lt;p&gt;The core of the authentication check happens in the background script. Here’s the function I use to check for the presence of Supabase’s auth cookies:&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;// background.ts&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;hasAuthCookies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&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="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cookies&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;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAll&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;domain&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;authCookies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;// These env vars are set to the standard Supabase cookie names&lt;/span&gt;
    &lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_KATALOG_AUTH_TOKEN_COOKIE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
    &lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_KATALOG_AUTH_TOKEN_CODE_VERIFIER_COOKIE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;authCookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I rely on environment variables for the cookie names, but these are just the defaults from Supabase. You can inspect these cookies in the browser's storage after logging in. Since I'm using &lt;a href="https://vite-plugin-web-extension.aklinker1.io/" rel="noopener noreferrer"&gt;Vite Web Extension plugin&lt;/a&gt;, I store these variables in a &lt;code&gt;.env&lt;/code&gt; file. Vite automatically loads any environment variables prefixed with &lt;code&gt;VITE_&lt;/code&gt;, making them available through &lt;code&gt;import.meta.env&lt;/code&gt; in your code.&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;# .env&lt;/span&gt;
&lt;span class="nv"&gt;VITE_KATALOG_AUTH_TOKEN_COOKIE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sb-access-token
&lt;span class="nv"&gt;VITE_KATALOG_AUTH_TOKEN_CODE_VERIFIER_COOKIE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sb-refresh-token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Manifest and permissions
&lt;/h2&gt;

&lt;p&gt;Here’s the relevant part of my &lt;code&gt;manifest.json&lt;/code&gt; for Chrome:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"manifest_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Katalog - Save any article to listen later"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.0.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"activeTab"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tabs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cookies"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"host_permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"http://*/*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://*/*"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"background"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"service_worker"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/background.ts"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content_scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"matches"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;all_urls&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"js"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/content.ts"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;⚠️ An important note&lt;/strong&gt;: I ran into issues when I tried to restrict &lt;code&gt;host_permissions&lt;/code&gt; to just my web app’s domain. Chrome wouldn’t return the cookies I needed. Only after allowing access to all domains did it work. This feels like a bug in Chrome’s extension API. I couldn’t find any alternatives. However, as long as you describe the intent for using such broad &lt;code&gt;host_permissions&lt;/code&gt; clearly when submitting the extension, I haven’t had any issues with publishing updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The login flow
&lt;/h2&gt;

&lt;p&gt;When a user clicks the extension icon, the extension checks for the auth cookies. If they’re missing, it opens the login page in a new tab. I added a query parameter so the login page can show a message specific to extension users.&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;// background.ts&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;hasAuth&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="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;windows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_KATALOG_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login?browser-extension=true&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;focused&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="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;normal&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&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%2Fudjgnowj09ksqe6glgp1.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%2Fudjgnowj09ksqe6glgp1.png" alt="The login page of Katalog has an additional banner that indicates the user is trying to sign in from the Chrome extension" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Right now, there’s no way for the extension to know immediately when the user finishes logging in. You have to click the extension icon again after logging in to save the current URL. I’d like to improve this in the future, maybe by using browser messaging or a custom event.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Content script and UX
&lt;/h2&gt;

&lt;p&gt;When the extension is used on a page, it injects a content script that displays a floating element. This shows the progress as the article is being parsed and saved. I kept this UI minimal on purpose—no extra popups or login prompts.&lt;/p&gt;

&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%2Fxjuznm9d7psujp9fbii9.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%2Fxjuznm9d7psujp9fbii9.png" alt="The floating UI that's being injected by the extension to indicate progress as Katalog parses the article" width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Server-Side: CORS and Credentials
&lt;/h2&gt;

&lt;p&gt;On the server side (web app), I had to make sure that credentials are allowed in CORS headers. Here’s a snippet from my Express server setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// server.js&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access-Control-Allow-Credentials&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="s2"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// ...other headers&lt;/span&gt;
  &lt;span class="nf"&gt;next&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;This is important so that the extension can make authenticated requests to the web app’s API endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Security and limitations
&lt;/h2&gt;

&lt;p&gt;There are a few things to keep in mind with this approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The extension can only access cookies that aren’t &lt;code&gt;HttpOnly&lt;/code&gt;. Supabase’s cookies are accessible in this way, but if you use a different auth provider, check their cookie settings.&lt;/li&gt;
&lt;li&gt;By allowing access to all domains in &lt;code&gt;host_permissions&lt;/code&gt;, you’re giving the extension broad access. This is something to be aware of, and you might want to review the permissions model if you’re building something more sensitive.&lt;/li&gt;
&lt;li&gt;There’s no real-time notification to the extension when the user logs in. The user has to click the extension again after logging in.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  10. What I’d improve next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I’d like to add a way for the extension to know when the user has finished logging in, maybe by using browser messaging or a custom callback.&lt;/li&gt;
&lt;li&gt;I’d also like to tighten up the permissions if Chrome’s API allows it in the future.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  11. Conclusion
&lt;/h2&gt;

&lt;p&gt;This approach let me keep the &lt;a href="https://chromewebstore.google.com/detail/katalog-save-any-article/mlpfbidnlphmjfnmjgokpaenpklafiij" rel="noopener noreferrer"&gt;extension&lt;/a&gt; simple and avoid duplicating authentication logic. I didn’t have to build a separate login UI or manage tokens in two places. If you’re already using Supabase (or any provider that uses cookies for auth), this is a lightweight way to add authentication to your extension.&lt;/p&gt;

&lt;p&gt;Would you use cookie-based authentication for Chrome extensions? I'd love to hear your thoughts and feedback 🙌&lt;/p&gt;

</description>
      <category>extensions</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>ux</category>
    </item>
    <item>
      <title>13 places to find Beautiful Free Illustrations</title>
      <dc:creator>Ahmed Sulaiman</dc:creator>
      <pubDate>Wed, 08 Jan 2020 10:31:31 +0000</pubDate>
      <link>https://dev.to/ahmed_sulaiman/13-places-to-find-beautiful-free-illustrations-580e</link>
      <guid>https://dev.to/ahmed_sulaiman/13-places-to-find-beautiful-free-illustrations-580e</guid>
      <description>&lt;p&gt;I believe, engineers can make a beautiful design.&lt;/p&gt;

&lt;p&gt;I’m an iOS\macOS developer by the background and also make all the designs in my company. Mostly I focus on the product design: defending users’ needs, finding the best solutions, initial prototyping, UX flow, screens. It’s all about making usable products and experiences.&lt;/p&gt;

&lt;p&gt;Sometimes, I need to work with marketing design: banners for Christmas, gifs for Black Friday deals, illustration for our open-sources projects (like &lt;a href="https://github.com/LisaDziuba/Awesome-Design-Tools" rel="noopener noreferrer"&gt;Awesome Design Tools&lt;/a&gt;) or new visuals to test on our marketing landing page… Oh, wow! That’s a lot of work. Luckily, I can grab some free SVG images &amp;amp; illustrations from very kind and talented people in our community. Then make custom changes and use them.&lt;/p&gt;

&lt;p&gt;Thanks to all those designers, who allow engineers like me to overcome the struggle with creating custom illustrations.&lt;/p&gt;

&lt;p&gt;I’m sure, readers of dev.to will find these illustrations sites very useful for the day-to-day work:&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.opendoodles.com/" rel="noopener noreferrer"&gt;Open Doodles&lt;/a&gt;, &lt;a href="https://www.humaaans.com/" rel="noopener noreferrer"&gt;Humaaans&lt;/a&gt; and &lt;a href="https://www.buttsss.com/" rel="noopener noreferrer"&gt;Buttsss&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
It’s amazing free illustrations by Pablo Stanley. Let’s talk more about them.&lt;/p&gt;

&lt;p&gt;Open Doodles is a set of hand-drawn vector illustrations. You can download the source files or play with the generator to create your own. While Humaaans is a library to mix-&amp;amp;-match illustrations of people. And you can also customize their positions, clothing, colors, and hairstyle. &lt;/p&gt;

&lt;p&gt;Buttsss is the most daring collection of butt illustrations. Just have fun and use them on your pitch deck, presentations or marketing campaigns.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F3200%2F0%2A-2hK7ho2mc8Xrirh" 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%2Fmiro.medium.com%2Fmax%2F3200%2F0%2A-2hK7ho2mc8Xrirh" alt="Open Doodles screen" width="1600" height="883"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://lukaszadam.com/illustrations/" rel="noopener noreferrer"&gt;LukaszAdam Illustrations&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
It’s a weekly updated collection of vector art illustrations and icons. Made with love by a very kind and talented independent web designer, Lukasz Adam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://undraw.co/" rel="noopener noreferrer"&gt;unDraw&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
I’m sure you heard about unDraw, a constantly updated collection of svg images made by Katerina Limpitsouni. You can find the images that fit your needs and download them in one click. On-the-fly color image generation is also available.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F3200%2F0%2AvmmqorSngMXtyO1-" 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%2Fmiro.medium.com%2Fmax%2F3200%2F0%2AvmmqorSngMXtyO1-" alt="unDraw screen" width="1600" height="883"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://iradesign.io/" rel="noopener noreferrer"&gt;IRA Design&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
It will help you to create amazing illustrations, using hand-drawn sketch components. You can mix &amp;amp;match five available color gradients, customize different components (like characters, objects, and backgrounds) and download everything for free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.drawkit.io/" rel="noopener noreferrer"&gt;DrawKit&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
A cool collection of svg illustrations ever. All of them are made in two different styles, bright color &amp;amp; simple sketch. Free to use on your website, app, or project.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F3200%2F0%2AiFVnYxj-eCDbFpwW" 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%2Fmiro.medium.com%2Fmax%2F3200%2F0%2AiFVnYxj-eCDbFpwW" alt="DrawKit screen" width="1600" height="881"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.freepik.com/" rel="noopener noreferrer"&gt;Freepik&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
A search engine that helps to locate high-quality photos, vectors, icons, illustrations and PSD files for their creative projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://icons8.com/ouch/" rel="noopener noreferrer"&gt;Ouch&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
This site helps creators who don’t draw overcome the lack of quality graphics. Just take a look at these unique illustrations in 20 different styles made by top Dribbble artists.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F3200%2F0%2A4ucz0UCte06OC3H4" 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%2Fmiro.medium.com%2Fmax%2F3200%2F0%2A4ucz0UCte06OC3H4" alt="Ouch screen" width="1600" height="883"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://pngtree.com/illustration-design/" rel="noopener noreferrer"&gt;Pngtree&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
The largest png free resource platform. It has a million graphics resources made in different styles, like images, backgrounds, text effects and illustrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.wannapik.com/" rel="noopener noreferrer"&gt;Wannapik&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
A huge collection of free illustrations, vector images, photos, and animations for any use. Just take a look!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://illlustrations.co/" rel="noopener noreferrer"&gt;Open source illustrations kit&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
This project was a #100daysChallenge for Vijay Verma, who was designing cool illustrations since 2016. Then Vijay decided to share it with all the design community!&lt;br&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%2Fub2p3qdjqqh0iln5e8ox.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%2Fub2p3qdjqqh0iln5e8ox.png" alt="Open source illustrations scren" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://absurd.design/" rel="noopener noreferrer"&gt;Absurd Design&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
A series of illustrations that paradoxically combine absurdity and a deep sense of childishness and naivety. The main idea is to give people a chance to think and spark their creative imagination and artistic vision. I am sure, it’ll be interesting to use on your website or app :)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F3200%2F0%2A4pVEG0BOlnTZE1b_" 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%2Fmiro.medium.com%2Fmax%2F3200%2F0%2A4pVEG0BOlnTZE1b_" alt="Absurd Design screen" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final words&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s be good citizens on the tech community and make the wise use of prepared illustrations. So when you work with free illustration, follow these simple rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make the illustration consistent with your brand voice.&lt;/li&gt;
&lt;li&gt;Be open to check for inspiration in other designers’ work. Sites like Dribbble, Awwwards, or Mobbin can be very helpful.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be brave. Combine illustrations, stock photos, frames (here you can find dozens of free stock photos). Sometimes it can give fast and good results:&lt;br&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%2Fvy3de7yyddkm9zf2cp8p.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%2Fvy3de7yyddkm9zf2cp8p.png" alt="Visual example" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check for copyright. While most of the free illustration sites are copyright-free, it’s better to double-check.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Give the original author credit somewhere on your site. You can leave a link, put image source or just a mention in Twitter designers, who helped you:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1206670211862188033-636" src="https://platform.twitter.com/embed/Tweet.html?id=1206670211862188033"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1206670211862188033-636');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1206670211862188033&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Thanks for reading and let’s support this great movement of open design.&lt;/p&gt;

</description>
      <category>design</category>
      <category>ux</category>
      <category>ios</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The ultimate guide for mobile developers, who want to design</title>
      <dc:creator>Ahmed Sulaiman</dc:creator>
      <pubDate>Thu, 26 Dec 2019 14:08:50 +0000</pubDate>
      <link>https://dev.to/ahmed_sulaiman/the-ultimate-guide-for-mobile-developers-who-want-to-design-2f4m</link>
      <guid>https://dev.to/ahmed_sulaiman/the-ultimate-guide-for-mobile-developers-who-want-to-design-2f4m</guid>
      <description>&lt;p&gt;As a startup founder, one of the most common questions I'm asked is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How can you do both design and development, as well as business tasks?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm an iOS &amp;amp; macOS developer first, having been coding since I was 13 y.o. However, currently, I'm doing all the design tasks for my startup — &lt;a href="https://flawlessapp.io/" rel="noopener noreferrer"&gt;Flawless App&lt;/a&gt;. It's a tool for iOS developers to compare original designs with the real app in Xcode's iOS simulator. So I do UX research, website mockups, onboarding screens, ads, emails, presentations, and many other design-related things. 😱&lt;/p&gt;

&lt;p&gt;A long time ago, we did have two brilliant designers working with us but unfortunately, it didn't work out for many reasons. Therefore, I decided to learn the basics of UX design back then. I didn't expect to become a UX and UI magician or usability research expert overnight. Rather I wanted to develop the essential skill-set for creating designs fast and efficiently enough to make users happy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;So, can a developer learn UX and UI design?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well yes, we can learn anything we want. To help you get started, I will share some resources that helped me at the beginning of my journey: books, case studies, and tutorials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get the taste of design thinking
&lt;/h2&gt;

&lt;p&gt;Everything in the world around us is designed by somebody. You sit on a chair, that somebody designed. You work on the laptop, where every corner has a reason to be that specific shape. You read Medium, which has a UI that was crafted by a team of designers. Every element of the real or virtual world was designed to make you carry out a specific action.&lt;/p&gt;

&lt;p&gt;My dive into design started with the following classical articles and books. They will teach you to focus on design as a method of solving problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📕 Dieter Rams: 10 principles for good design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wasn't even born when Dieter Rams, German iconic industrial designer, wrote this. It's a manifesto of design mission for any product or service.&lt;/p&gt;

&lt;p&gt;Read every line carefully. Does your design meet those principles? Dieter Rams is 85 now and he is the man, who designed Braun coffeemaker, shaver, stereo, calculator, speakers, alarm clock, Oral-B toothbrush and many more.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Design should not dominate things, should not dominate people. It should help people. That's its role.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;– Dieter Rams&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;📕 "The Design of Everyday Things" by Don Norman.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's so popular, that you can even find &lt;a href="https://academy.realm.io/posts/tryswift-rachel-bobbins-design-everyday-swift/" rel="noopener noreferrer"&gt;Swift talk about clean code and API design articles&lt;/a&gt; based on ideas from this book!&lt;/p&gt;

&lt;p&gt;The book covers design methodologies, basic psychological concepts, and usability. Norman deals mostly with the design of physical objects. He explores what makes the use of buildings, appliances, and technology easy or complicated. Norman shows the basic patterns, which are very well applied to the virtual touch screen of today's UIs.&lt;/p&gt;

&lt;p&gt;Originally the book was published in 1988. If you decide to read the first edition, you'll find a lot of ancient tech stuff there (I loved it!). Back then, Norman predicted the success of iPads, tablet devices, and smartphones. You can also find updated versions, as Norman constantly adds to it. Alternatively, check out this brief &lt;a href="https://www.udacity.com/course/intro-to-the-design-of-everyday-things--design101" rel="noopener noreferrer"&gt;Udacity course&lt;/a&gt;, "Intro to the Design of Everyday Things with Norman".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Good design is actually a lot harder to notice than poor design, in part because good designs fit our needs so well that the design is invisible.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;― Donald A. Norman, The Design of Everyday Things&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;📕 "100 Things Every Designer Needs to Know About People" by Susan Weinschenk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a light overview read of neuroscience and behavioral psychology from a designer's perspective. The book is divided into short chapters about how people see, read, remember, think, feel and form mental models. I found many new insights there! It's relatively fresh (2011), well-written and contains practical advice on using these 100 principles in your designs. However, reserve the time for research after reading the book.&lt;/p&gt;

&lt;p&gt;📕 Last but not least is &lt;strong&gt;"Don't Make Me Think" by Steve Krug&lt;/strong&gt;&lt;br&gt;
It is an easy read with a focus on a common-sense approach to web usability. Some of the stuff may be obvious or also found published around different UX blogs (the book was republished &amp;amp; updated in 2013). But if you are a total newbie, you will enjoy it. You can read it in over a weekend or two, as Krug's writing style is really enjoyable!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Don't make me think. Make things obvious and self-evident, or at least self-explanatory. People scan; they don't read. People choose the first reasonable option. People muddle through things rather than figure them out.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;― Steve Krug's Laws of Usability&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Do you wish to learn more on how to hack a user's brain with a product design? Then I strongly recommend you read these articles too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.uxmatters.com/mt/archives/2016/05/mental-models-and-user-experience.php" rel="noopener noreferrer"&gt;Mental Models and User Experience&lt;/a&gt; (2016). It's a great overview of mental models, why they are important for design and how we used to construct them. There are some links to "Design of Everyday Things" by Don Norman. So I would suggest you to read Norman's book first.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/thrive-global/how-technology-hijacks-peoples-minds-from-a-magician-and-google-s-design-ethicist-56d62ef5edf3?#.s2j7kulfp" rel="noopener noreferrer"&gt;How Technology Hijacks People's Minds - from a Magician and Google's Design Ethicist&lt;/a&gt; (2016). I loved this cool article on how technology affects our daily life, what psychological principles are behind it and how we can fix it with good design. Beside interesting insights, this article proves how it is important to take every detail of your design seriously!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/swlh/a-behavioral-approach-to-product-design-166d22628970#.enkb1pxi4" rel="noopener noreferrer"&gt;A behavioral approach to product design: Four steps to designing products with impact&lt;/a&gt; (2015). Step by step overview of behavior design principles with real-world examples. Also, you can find a lot of practical techniques how to achieve specific behavioral tasks with the design in this article.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://uxpamagazine.org/ask-less-get-more/" rel="noopener noreferrer"&gt;Ask Less, Get More: The Behavioral Science of Limiting User Behavior&lt;/a&gt; (2016). I enjoyed this article a lot! It's a comprehensive study on how limits in your product can drive more users to do a specific action, complete a specific task or encourage a specific behavior. You can also find plenty of real-world examples there.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/@jaf_designer/why-product-thinking-is-the-next-big-thing-in-ux-design-ee7de959f3fe" rel="noopener noreferrer"&gt;Why Product Thinking is the next big thing in UX Design&lt;/a&gt; (2015). Importance of product thinking and why it's so crucial to constantly talk to your users in order to understand their true needs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/swlh/the-future-of-design-is-emotional-5789ccde17aa" rel="noopener noreferrer"&gt;Design for Humanity&lt;/a&gt; (2016). The article describes the emotional aspect of design decisions. And why we need to see the design through the emotional prism as well (instead of focusing on a practical part only).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.toptal.com/designers/ux/mobile-ux-design-best-practices" rel="noopener noreferrer"&gt;Mobile UX Design - Best Practices, Constraints, and Working with Developers&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The design process starts with a good understanding of people and their needs. Overall, this was just a small collection of excellent resources, which you can use to understand the design before drawing your first UI. I will come back to you in a few weeks with the next part of this guide. Thanks for reading and happy learning!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;There's no learning without trying lots of ideas and failing lots of times.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;– Jonathan Ive&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Special thanks to our friends &amp;amp; great designers, &lt;a href="https://twitter.com/AlexDeardream" rel="noopener noreferrer"&gt;Alex Kukharenko&lt;/a&gt; and &lt;a href="https://www.facebook.com/anton.diatlov" rel="noopener noreferrer"&gt;Anton Diatlov&lt;/a&gt;, for giving useful advice on our guide.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>ux</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
