diff --git a/src/app/auth/onboarding/step-1.tsx b/src/app/auth/onboarding/step-1.tsx
index 4f9fba2f..7267cdb3 100644
--- a/src/app/auth/onboarding/step-1.tsx
+++ b/src/app/auth/onboarding/step-1.tsx
@@ -47,7 +47,8 @@ export function OnboardStep1Screen() {
       const event = await publish({ content: '', kind: 3, tags: tags });
       await updateAccount('follows', follows);
 
-      const notes = await fetchNotes();
+      // prefetch notes with current follows
+      const notes = await fetchNotes(follows);
 
       // redirect to next step
       if (event && notes) {
@@ -103,7 +104,7 @@ export function OnboardStep1Screen() {
             {loading ? (
               <>
                 <span className="w-5" />
-                <span>Creating...</span>
+                <span>It might take a bit, please patient...</span>
                 <LoaderIcon className="h-5 w-5 animate-spin text-white" />
               </>
             ) : (
diff --git a/src/libs/ndk/instance.ts b/src/libs/ndk/instance.ts
index 7d406c45..9404215c 100644
--- a/src/libs/ndk/instance.ts
+++ b/src/libs/ndk/instance.ts
@@ -2,7 +2,7 @@
 import NDK from '@nostr-dev-kit/ndk';
 import { ndkAdapter } from '@nostr-fetch/adapter-ndk';
 import { NostrFetcher } from 'nostr-fetch';
-import { useEffect, useState } from 'react';
+import { useEffect, useMemo, useState } from 'react';
 
 import TauriAdapter from '@libs/ndk/cache';
 import { getExplicitRelayUrls } from '@libs/storage';
@@ -10,13 +10,14 @@ import { getExplicitRelayUrls } from '@libs/storage';
 import { FULL_RELAYS } from '@stores/constants';
 
 export const NDKInstance = () => {
+  const cacheAdapter = useMemo(() => new TauriAdapter(), []);
+
   const [ndk, setNDK] = useState<NDK | undefined>(undefined);
   const [relayUrls, setRelayUrls] = useState<string[]>([]);
   const [fetcher, setFetcher] = useState<NostrFetcher>(undefined);
-  const [cacheAdapter] = useState(new TauriAdapter());
 
   useEffect(() => {
-    loadNdk();
+    if (!ndk) loadNdk();
 
     return () => {
       cacheAdapter.save();
diff --git a/src/libs/storage.tsx b/src/libs/storage.tsx
index 2f907b0c..2784e800 100644
--- a/src/libs/storage.tsx
+++ b/src/libs/storage.tsx
@@ -34,10 +34,10 @@ export async function getActiveAccount() {
   if (result.length > 0) {
     result[0]['follows'] = result[0].follows
       ? JSON.parse(result[0].follows as unknown as string)
-      : [];
+      : null;
     result[0]['network'] = result[0].network
       ? JSON.parse(result[0].network as unknown as string)
-      : [];
+      : null;
     return result[0];
   } else {
     return null;
diff --git a/src/shared/avatarUploader.tsx b/src/shared/avatarUploader.tsx
index a815ca86..6e73b825 100644
--- a/src/shared/avatarUploader.tsx
+++ b/src/shared/avatarUploader.tsx
@@ -9,14 +9,12 @@ export function AvatarUploader({ setPicture }: { setPicture: any }) {
   const [loading, setLoading] = useState(false);
 
   const uploadAvatar = async () => {
+    setLoading(true);
     const image = await upload(null);
     if (image.url) {
-      // update parent state
       setPicture(image.url);
-
-      // disable loader
-      setLoading(false);
     }
+    setLoading(false);
   };
 
   return (
diff --git a/src/shared/bannerUploader.tsx b/src/shared/bannerUploader.tsx
index 0a54403e..2a048381 100644
--- a/src/shared/bannerUploader.tsx
+++ b/src/shared/bannerUploader.tsx
@@ -9,14 +9,12 @@ export function BannerUploader({ setBanner }: { setBanner: any }) {
   const [loading, setLoading] = useState(false);
 
   const uploadBanner = async () => {
+    setLoading(true);
     const image = await upload(null);
     if (image.url) {
-      // update parent state
       setBanner(image);
-
-      // disable loader
-      setLoading(false);
     }
+    setLoading(false);
   };
 
   return (
diff --git a/src/utils/hooks/useNostr.tsx b/src/utils/hooks/useNostr.tsx
index a24c915c..faef06b0 100644
--- a/src/utils/hooks/useNostr.tsx
+++ b/src/utils/hooks/useNostr.tsx
@@ -18,22 +18,25 @@ import { nHoursAgo } from '@utils/date';
 export function useNostr() {
   const { ndk, relayUrls, fetcher } = useNDK();
 
-  async function fetchNetwork() {
+  async function fetchNetwork(prevFollow?: string[]) {
     const account = await getActiveAccount();
-    const follows = new Set<string>();
+    const follows = new Set<string>(prevFollow || []);
     const lruNetwork = new LRUCache<string, string, void>({ max: 300 });
 
     let network: string[];
 
     // fetch user's follows
-    const user = ndk.getUser({ hexpubkey: account.pubkey });
-    const list = await user.follows();
-    list.forEach((item: NDKUser) => {
-      follows.add(nip19.decode(item.npub).data as string);
-    });
+    if (!prevFollow) {
+      const user = ndk.getUser({ hexpubkey: account.pubkey });
+      const list = await user.follows();
+      list.forEach((item: NDKUser) => {
+        follows.add(nip19.decode(item.npub).data as string);
+      });
+    }
 
     // fetch network
     if (!account.network) {
+      console.log('fetching network...', follows.size);
       const events = await fetcher.fetchAllEvents(
         relayUrls,
         { kinds: [3], authors: [...follows] },
@@ -59,9 +62,9 @@ export function useNostr() {
     return [...new Set([...follows, ...network])];
   }
 
-  const fetchNotes = async () => {
+  const fetchNotes = async (prevFollow?: string[]) => {
     try {
-      const network = (await fetchNetwork()) as string[];
+      const network = (await fetchNetwork(prevFollow)) as string[];
 
       const totalNotes = await countTotalNotes();
       const lastLogin = await getLastLogin();
diff --git a/src/utils/types.d.ts b/src/utils/types.d.ts
index da977d63..23767001 100644
--- a/src/utils/types.d.ts
+++ b/src/utils/types.d.ts
@@ -20,8 +20,8 @@ export interface Account extends NDKUserProfile {
   id: number;
   npub: string;
   pubkey: string;
-  follows: string[];
-  network: string[];
+  follows: null | string[];
+  network: null | string[];
   is_active: number;
   privkey?: string; // deprecated
 }