diff --git a/nostr-followback/.gitignore b/nostr-followback/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/nostr-followback/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/nostr-followback/README.md b/nostr-followback/README.md
index 860cb41..1a83964 100644
--- a/nostr-followback/README.md
+++ b/nostr-followback/README.md
@@ -11,7 +11,4 @@ Let promote some reciprocity here! 😹
 -   Configure Vite for the miniapp to be loaded in the article's url as base.
 -   Save followbackers and not followbackers in lists to see details.
 -   Create an UI/UX that's worth looking at.
-
-## v2
-
 -   Upload a localStorage list of relays
diff --git a/nostr-followback/index.html b/nostr-followback/index.html
new file mode 100644
index 0000000..aa94403
--- /dev/null
+++ b/nostr-followback/index.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="UTF-8" />
+        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+        <title>Vite + Svelte + TS</title>
+    </head>
+    <body>
+        <div id="app"></div>
+        <script type="module" src="/src/main.ts"></script>
+    </body>
+</html>
diff --git a/nostr-followback/package.json b/nostr-followback/package.json
index 0fee7e0..1cccb3f 100644
--- a/nostr-followback/package.json
+++ b/nostr-followback/package.json
@@ -1,21 +1,24 @@
 {
-	"name": "test-nostr-reciprocal",
-	"version": "0.0.1",
-	"private": true,
-	"scripts": {
-		"dev": "vite dev",
-		"build": "vite build",
-		"preview": "vite preview"
-	},
-	"devDependencies": {
-		"@sveltejs/adapter-auto": "^3.0.0",
-		"@sveltejs/kit": "^2.0.0",
-		"@sveltejs/vite-plugin-svelte": "^3.0.0",
-		"svelte": "^4.2.7",
-		"vite": "^5.0.3"
-	},
-	"type": "module",
-	"dependencies": {
-		"@nostr-dev-kit/ndk": "^2.7.1"
-	}
+  "name": "nostr-followback",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview",
+    "check": "svelte-check --tsconfig ./tsconfig.json"
+  },
+  "devDependencies": {
+    "@sveltejs/vite-plugin-svelte": "^3.0.2",
+    "@tsconfig/svelte": "^5.0.2",
+    "svelte": "^4.2.12",
+    "svelte-check": "^3.6.7",
+    "tslib": "^2.6.2",
+    "typescript": "^5.2.2",
+    "vite": "^5.2.0"
+  },
+  "dependencies": {
+    "@nostr-dev-kit/ndk": "^2.8.1"
+  }
 }
diff --git a/nostr-followback/src/routes/+page.svelte b/nostr-followback/src/App.svelte
similarity index 84%
rename from nostr-followback/src/routes/+page.svelte
rename to nostr-followback/src/App.svelte
index f78e16e..e7014c7 100644
--- a/nostr-followback/src/routes/+page.svelte
+++ b/nostr-followback/src/App.svelte
@@ -1,15 +1,16 @@
-<script>
+<script lang="ts">
+    // @ts-nocheck
     // Import the package
     import NDK from "@nostr-dev-kit/ndk";
-    import { fetchUserProfile } from "$lib/fetchs";
-    import { relays } from "$lib/data/relays";
+    import { fetchUserProfile } from "./lib/fetchs";
+    import { relays } from "./lib/data/relays";
 
     // let npubToQuery = "npub1wujhdsytm3w6g0mpsqh8v7ezx83jcm64dlkwuqgm5v8lv0pds55ssudkw0";
     let npubToQuery = "";
     let querying = false;
     let userName = "";
     let userThumb = "";
-    let followsCount;
+    let followsCount = 0;
 
     let followBackCount = 0;
     let notFollowBackCount = 0;
@@ -128,18 +129,23 @@
         User: {userName} |  Follows: {followsCount}
         <br />
         {npubToQuery}
-        <br /><br />
-        Unknown: {unknownFollowBack} | Follow_Back: {followBackCount} | <strong>Not_Follow_Back</strong>:
+        <br />
+        <br />
+        Unknown: {unknownFollowBack} | Follow_Back: {followBackCount} |
+        <strong>Not_Follow_Back</strong>
+        :
         <span title="Actually Counted">{notFollowBackCount}</span>
-        / <span title="Actualy counted">{notFollowersBack.length}</span>
+        /
+        <span title="Actualy counted">{notFollowersBack.length}</span>
         <br />
         {#if progress < 100}
             <p>
                 Progress =
-                <strong>{progress}%</strong> - {totalCountOfContactsChecked} of {followsCount}
+                <strong>{progress}%</strong>
+                - {totalCountOfContactsChecked} of {followsCount}
                 <!-- - {totalCountOfContactsChecked} of {followBackCount +
-                    notFollowBackCount +
-                    unknownFollowBack} -->
+                  notFollowBackCount +
+                  unknownFollowBack} -->
             </p>
         {:else}
             <p><strong>Completed!</strong></p>
@@ -159,19 +165,19 @@
             {/each}
         </ul>
         <!-- <br />
-        <strong>They don't follow you ({notFollowersBack.length}):</strong>
-        <br />
+      <strong>They don't follow you ({notFollowersBack.length}):</strong>
+      <br />
 
-        <ul>
-            {#each notFollowersBack as item, i (item)}
-                <li>
-                    #{i + 1} - <a href="https://nostr.band/{item}" target="_blank noreferrer noopener">Nostr.Band</a>
-                    / <a href="https://primal.net/p/{item}" target="_blank noreferrer noopener">Primal</a>
-                    :
-                    {item}
-                </li>
-            {/each}
-        </ul> -->
+      <ul>
+          {#each notFollowersBack as item, i (item)}
+              <li>
+                  #{i + 1} - <a href="https://nostr.band/{item}" target="_blank noreferrer noopener">Nostr.Band</a>
+                  / <a href="https://primal.net/p/{item}" target="_blank noreferrer noopener">Primal</a>
+                  :
+                  {item}
+              </li>
+          {/each}
+      </ul> -->
     </div>
 {:else if !querying}
     <p>Let's find out who does not follow you back in Nostr!</p>
diff --git a/nostr-followback/src/app.css b/nostr-followback/src/app.css
new file mode 100644
index 0000000..617f5e9
--- /dev/null
+++ b/nostr-followback/src/app.css
@@ -0,0 +1,79 @@
+:root {
+  font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
+  line-height: 1.5;
+  font-weight: 400;
+
+  color-scheme: light dark;
+  color: rgba(255, 255, 255, 0.87);
+  background-color: #242424;
+
+  font-synthesis: none;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+a {
+  font-weight: 500;
+  color: #646cff;
+  text-decoration: inherit;
+}
+a:hover {
+  color: #535bf2;
+}
+
+body {
+  margin: 0;
+  display: flex;
+  place-items: center;
+  min-width: 320px;
+  min-height: 100vh;
+}
+
+h1 {
+  font-size: 3.2em;
+  line-height: 1.1;
+}
+
+.card {
+  padding: 2em;
+}
+
+#app {
+  max-width: 1280px;
+  margin: 0 auto;
+  padding: 2rem;
+  text-align: center;
+}
+
+button {
+  border-radius: 8px;
+  border: 1px solid transparent;
+  padding: 0.6em 1.2em;
+  font-size: 1em;
+  font-weight: 500;
+  font-family: inherit;
+  background-color: #1a1a1a;
+  cursor: pointer;
+  transition: border-color 0.25s;
+}
+button:hover {
+  border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+  outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+  :root {
+    color: #213547;
+    background-color: #ffffff;
+  }
+  a:hover {
+    color: #747bff;
+  }
+  button {
+    background-color: #f9f9f9;
+  }
+}
diff --git a/nostr-followback/src/app.html b/nostr-followback/src/app.html
deleted file mode 100644
index 77a5ff5..0000000
--- a/nostr-followback/src/app.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!doctype html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8" />
-		<link rel="icon" href="%sveltekit.assets%/favicon.png" />
-		<meta name="viewport" content="width=device-width, initial-scale=1" />
-		%sveltekit.head%
-	</head>
-	<body data-sveltekit-preload-data="hover">
-		<div style="display: contents">%sveltekit.body%</div>
-	</body>
-</html>
diff --git a/nostr-followback/src/main.ts b/nostr-followback/src/main.ts
new file mode 100644
index 0000000..4d67e2a
--- /dev/null
+++ b/nostr-followback/src/main.ts
@@ -0,0 +1,8 @@
+import './app.css'
+import App from './App.svelte'
+
+const app = new App({
+  target: document.getElementById('app')!,
+})
+
+export default app
diff --git a/nostr-followback/src/routes/testuser/+page.svelte b/nostr-followback/src/routes/testuser/+page.svelte
deleted file mode 100644
index 4184ffd..0000000
--- a/nostr-followback/src/routes/testuser/+page.svelte
+++ /dev/null
@@ -1,56 +0,0 @@
-<script>
-    import NDK from "@nostr-dev-kit/ndk";
-    import { fetchUserProfile } from "$lib/fetchs.js";
-    import { relays } from "$lib/data/relays";
-
-    let npubToQuery = "npub1fyjqppvxj9z8km5c9hmyfvvnrqj8qxcz82av3dse57v3lftvhz3q98p6ma";
-    let userName;
-    let userThumb;
-    let followsCount;
-    let listOfFollows = [];
-    async function init() {
-        try {
-            const ndk = new NDK({
-                explicitRelayUrls: relays,
-            });
-            await ndk.connect();
-
-            const user = await fetchUserProfile(npubToQuery, ndk);
-            userName = user.profile.name;
-            userThumb = user.profile.image;
-
-            if (userName) {
-                const follows = await user.follows();
-                followsCount = follows.size;
-                if (follows.size) {
-                    follows.forEach((contact) => {
-                        listOfFollows.push(contact.npub);
-                        listOfFollows = listOfFollows;
-                    });
-                }
-            }
-        } catch (error) {
-            console.error("Error fetching data:", error);
-        }
-    }
-
-    init();
-</script>
-
-<h3>This npub follows:</h3>
-{#if userThumb}
-    <a target="_blank noreferrer noopener" href="https://primal.net/p/{npubToQuery}"
-        ><img src={userThumb} width="50" style="border-radius:100%;" alt="user-thumb" /></a
-    >
-    User: <a target="_blank noreferrer noopener" href="https://primal.net/p/{npubToQuery}">{userName}</a> |  Follows: {followsCount}
-{:else}
-    <div class="loader">Loading data for... {npubToQuery}</div>
-{/if}
-
-<br /><br />
-
-<ul>
-    {#each listOfFollows as item}
-        <li>{item}</li>
-    {/each}
-</ul>
diff --git a/nostr-followback/src/vite-env.d.ts b/nostr-followback/src/vite-env.d.ts
new file mode 100644
index 0000000..4078e74
--- /dev/null
+++ b/nostr-followback/src/vite-env.d.ts
@@ -0,0 +1,2 @@
+/// <reference types="svelte" />
+/// <reference types="vite/client" />
diff --git a/nostr-followback/static/favicon.png b/nostr-followback/static/favicon.png
deleted file mode 100644
index 825b9e6..0000000
Binary files a/nostr-followback/static/favicon.png and /dev/null differ
diff --git a/nostr-followback/svelte.config.js b/nostr-followback/svelte.config.js
index 348fa32..b0683fd 100644
--- a/nostr-followback/svelte.config.js
+++ b/nostr-followback/svelte.config.js
@@ -1,13 +1,7 @@
-import adapter from '@sveltejs/adapter-auto';
+import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
 
-/** @type {import('@sveltejs/kit').Config} */
-const config = {
-	kit: {
-		// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
-		// If your environment is not supported or you settled on a specific environment, switch out the adapter.
-		// See https://kit.svelte.dev/docs/adapters for more information about adapters.
-		adapter: adapter()
-	}
-};
-
-export default config;
+export default {
+  // Consult https://svelte.dev/docs#compile-time-svelte-preprocess
+  // for more information about preprocessors
+  preprocess: vitePreprocess(),
+}
diff --git a/nostr-followback/tsconfig.json b/nostr-followback/tsconfig.json
new file mode 100644
index 0000000..5fb548f
--- /dev/null
+++ b/nostr-followback/tsconfig.json
@@ -0,0 +1,20 @@
+{
+  "extends": "@tsconfig/svelte/tsconfig.json",
+  "compilerOptions": {
+    "target": "ESNext",
+    "useDefineForClassFields": true,
+    "module": "ESNext",
+    "resolveJsonModule": true,
+    /**
+     * Typecheck JS in `.svelte` and `.js` files by default.
+     * Disable checkJs if you'd like to use dynamic types in JS.
+     * Note that setting allowJs false does not prevent the use
+     * of JS in `.svelte` files.
+     */
+    "allowJs": true,
+    "checkJs": true,
+    "isolatedModules": true
+  },
+  "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
+  "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/nostr-followback/tsconfig.node.json b/nostr-followback/tsconfig.node.json
new file mode 100644
index 0000000..d02c37d
--- /dev/null
+++ b/nostr-followback/tsconfig.node.json
@@ -0,0 +1,10 @@
+{
+  "compilerOptions": {
+    "composite": true,
+    "skipLibCheck": true,
+    "module": "ESNext",
+    "moduleResolution": "bundler",
+    "strict": true
+  },
+  "include": ["vite.config.ts"]
+}
diff --git a/nostr-followback/vite.config.js b/nostr-followback/vite.config.js
deleted file mode 100644
index bbf8c7d..0000000
--- a/nostr-followback/vite.config.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { sveltekit } from '@sveltejs/kit/vite';
-import { defineConfig } from 'vite';
-
-export default defineConfig({
-	plugins: [sveltekit()]
-});
diff --git a/nostr-followback/vite.config.ts b/nostr-followback/vite.config.ts
new file mode 100644
index 0000000..bf776bd
--- /dev/null
+++ b/nostr-followback/vite.config.ts
@@ -0,0 +1,7 @@
+import { defineConfig } from "vite";
+import { svelte } from "@sveltejs/vite-plugin-svelte";
+
+// https://vitejs.dev/config/
+export default defineConfig({
+    plugins: [svelte()],
+});