diff --git a/apps/web/check_output.txt b/apps/web/check_output.txt
new file mode 100644
index 0000000..50621d6
Binary files /dev/null and b/apps/web/check_output.txt differ
diff --git a/apps/web/package.json b/apps/web/package.json
index 3601215..4214999 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -18,8 +18,15 @@
"@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/kit": "^2.50.2",
"@sveltejs/vite-plugin-svelte": "^6.2.4",
+ "@tailwindcss/vite": "^4.3.0",
+ "autoprefixer": "^10.5.0",
+ "clsx": "^2.1.1",
+ "lucide-svelte": "^1.0.1",
+ "postcss": "^8.5.14",
"svelte": "^5.51.0",
"svelte-check": "^4.4.2",
+ "tailwind-merge": "^3.6.0",
+ "tailwindcss": "^4.3.0",
"typescript": "^5.9.3",
"vite": "^7.3.1"
}
diff --git a/apps/web/src/app.css b/apps/web/src/app.css
index 772a760..1ed60f4 100644
--- a/apps/web/src/app.css
+++ b/apps/web/src/app.css
@@ -1,70 +1,144 @@
-@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
-
-/* light theme — default */
-:root {
- /* Primary */
- --primary: #6366f1;
- --primary-light: #818cf8;
- --primary-dark: #4f46e5;
- --accent: #8b5cf6;
-
- /* Background */
- --bg-primary: #f8fafc;
- --bg-secondary: #f1f5f9;
- --bg-card: #ffffff;
- --bg-elevated: #e2e8f0;
-
- /* Text */
- --text-primary: #0f172a;
- --text-secondary: #475569;
- --text-muted: #94a3b8;
-
- /* Border */
- --border: #e2e8f0;
-
- /* Spacing */
- --radius: 12px;
- --radius-lg: 16px;
- --radius-xl: 24px;
-
- --theme-transition: background-color 0.3s ease, color 0.3s ease, border-color 0.3s ease;
+@import "tailwindcss";
+
+@theme {
+ --color-primary: #7C3AED;
+ --color-secondary: #06B6D4;
+ --color-accent-pink: #EC4899;
+ --color-accent-blue: #3B82F6;
+ --color-dark-950: #030712;
+ --color-dark-900: #0B1020;
+
+ --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
+ --font-display: "Space Grotesk", sans-serif;
+
+ --radius-xl: 1.5rem;
+ --radius-2xl: 2rem;
+ --radius-3xl: 3rem;
}
-/* dark theme */
-html.dark {
- --bg-primary: #0f0f1a;
- --bg-secondary: #1a1a2e;
- --bg-card: #16213e;
- --bg-elevated: #1e293b;
+@layer base {
+ :root {
+ --bg-main: #f8fafc;
+ --bg-secondary: #ffffff;
+ --text-main: #0f172a;
+ --text-muted: #64748b;
+ --border-main: #e2e8f0;
+ --glass-bg: rgba(255, 255, 255, 0.7);
+ --glass-border: rgba(255, 255, 255, 0.5);
+ --primary-glow: rgba(124, 58, 237, 0.2);
+ }
- --text-primary: #f8fafc;
- --text-secondary: #94a3b8;
- --text-muted: #64748b;
+ .dark {
+ --bg-main: #030712;
+ --bg-secondary: #0B1020;
+ --text-main: #f8fafc;
+ --text-muted: #94a3b8;
+ --border-main: #1f2937;
+ --glass-bg: rgba(3, 7, 18, 0.6);
+ --glass-border: rgba(255, 255, 255, 0.08);
+ --primary-glow: rgba(124, 58, 237, 0.3);
+ }
- --border: #334155;
+ body {
+ @apply bg-(--bg-main) text-(--text-main) transition-colors duration-500 antialiased font-sans overflow-x-hidden;
+ }
}
-* {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
+@utility glass {
+ backdrop-filter: blur(20px) saturate(180%);
+ background-color: var(--glass-bg);
+ border: 1px solid var(--glass-border);
}
-body {
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- background-color: var(--bg-primary);
- color: var(--text-primary);
- transition: var(--theme-transition);
- -webkit-font-smoothing: antialiased;
- min-height: 100vh;
+@utility glass-morphic {
+ @apply glass shadow-[0_8px_32px_0_rgba(31,38,135,0.07)];
}
-a {
- color: var(--primary);
- text-decoration: none;
- transition: color 0.2s;
+@utility text-gradient {
+ @apply bg-clip-text text-transparent bg-linear-to-r from-primary via-secondary to-accent-pink;
}
-a:hover {
- color: var(--primary-dark);
+@layer components {
+ .mesh-bg {
+ @apply absolute inset-0 -z-20 opacity-40;
+ background-image:
+ radial-gradient(at 0% 0%, rgba(124, 58, 237, 0.15) 0px, transparent 50%),
+ radial-gradient(at 100% 0%, rgba(6, 182, 212, 0.15) 0px, transparent 50%),
+ radial-gradient(at 100% 100%, rgba(236, 72, 153, 0.15) 0px, transparent 50%),
+ radial-gradient(at 0% 100%, rgba(59, 130, 246, 0.15) 0px, transparent 50%);
+ filter: blur(100px);
+ animation: mesh 20s ease infinite;
+ }
+
+ .card-cinematic {
+ @apply glass-morphic rounded-3xl p-8 transition-all duration-700 hover:-translate-y-2 hover:shadow-2xl hover:shadow-primary/20 relative overflow-hidden;
+ }
+
+ .btn-premium-primary {
+ @apply relative inline-flex items-center justify-center rounded-2xl font-black uppercase tracking-widest text-white transition-all duration-500 overflow-hidden;
+ background: linear-gradient(135deg, var(--color-primary), var(--color-accent-pink));
+ box-shadow: 0 4px 15px rgba(124, 58, 237, 0.4);
+ }
+ .btn-premium-primary:hover {
+ transform: translateY(-2px) scale(1.02);
+ box-shadow: 0 8px 25px rgba(124, 58, 237, 0.6);
+ }
+
+ .btn-premium-secondary {
+ @apply relative inline-flex items-center justify-center rounded-2xl font-black uppercase tracking-widest transition-all duration-500 overflow-hidden;
+ background: rgba(255, 255, 255, 0.05);
+ border: 1px solid rgba(124, 58, 237, 0.3);
+ color: var(--color-primary);
+ backdrop-filter: blur(10px);
+ }
+ .btn-premium-secondary:hover {
+ transform: translateY(-2px) scale(1.02);
+ background: rgba(124, 58, 237, 0.1);
+ border-color: rgba(124, 58, 237, 0.6);
+ }
}
+
+@layer utilities {
+ .animate-mesh {
+ animation: mesh 20s ease infinite;
+ }
+
+ .animate-float {
+ animation: float 6s ease-in-out infinite;
+ }
+
+ .animate-pulse-glow {
+ animation: pulse-glow 4s ease-in-out infinite;
+ }
+}
+
+@keyframes mesh {
+ 0%, 100% { background-position: 0% 50%; transform: scale(1); }
+ 50% { background-position: 100% 50%; transform: scale(1.1); }
+}
+
+@keyframes float {
+ 0%, 100% { transform: translateY(0) rotate(0deg); }
+ 50% { transform: translateY(-20px) rotate(2deg); }
+}
+
+@keyframes pulse-glow {
+ 0%, 100% { box-shadow: 0 0 20px rgba(124, 58, 237, 0.2); }
+ 50% { box-shadow: 0 0 40px rgba(124, 58, 237, 0.4); }
+}
+
+/* Custom Scrollbar */
+::-webkit-scrollbar {
+ width: 6px;
+}
+::-webkit-scrollbar-track {
+ @apply bg-transparent;
+}
+::-webkit-scrollbar-thumb {
+ @apply bg-primary/30 rounded-full hover:bg-primary/50 transition-colors;
+}
+
+/* Fluid Typography Helpers */
+.text-fluid-h1 { font-size: clamp(2.5rem, 8vw, 6rem); }
+.text-fluid-h2 { font-size: clamp(2rem, 5vw, 4rem); }
+.text-fluid-p { font-size: clamp(1rem, 2vw, 1.25rem); }
diff --git a/apps/web/src/app.d.ts b/apps/web/src/app.d.ts
index da08e6d..169339f 100644
--- a/apps/web/src/app.d.ts
+++ b/apps/web/src/app.d.ts
@@ -3,7 +3,12 @@
declare global {
namespace App {
// interface Error {}
- // interface Locals {}
+ interface Locals {
+ user?: {
+ id: string;
+ username: string;
+ }
+ }
// interface PageData {}
// interface PageState {}
// interface Platform {}
diff --git a/apps/web/src/hooks.server.ts b/apps/web/src/hooks.server.ts
new file mode 100644
index 0000000..c46b375
--- /dev/null
+++ b/apps/web/src/hooks.server.ts
@@ -0,0 +1,26 @@
+import type { Handle } from '@sveltejs/kit';
+
+export const handle: Handle = async ({ event, resolve }) => {
+ const token = event.cookies.get('token');
+
+ if (token) {
+ try {
+ // Call backend to verify token and get user info
+ const res = await event.fetch('http://localhost:3000/api/profiles/me');
+
+ if (res.ok) {
+ event.locals.user = await res.json();
+ } else {
+ event.cookies.delete('token', { path: '/' });
+ event.locals.user = undefined;
+ }
+ } catch (err) {
+ console.error('Auth verification failed:', err);
+ // Optional: fallback to mock for UI development if backend is not running
+ // event.locals.user = { id: 'mock-id', username: 'dev-user' };
+ }
+ }
+
+ const response = await resolve(event);
+ return response;
+};
diff --git a/apps/web/src/lib/api.ts b/apps/web/src/lib/api.ts
new file mode 100644
index 0000000..0b19c0a
--- /dev/null
+++ b/apps/web/src/lib/api.ts
@@ -0,0 +1,25 @@
+const BASE_URL = 'http://localhost:3000';
+
+export async function fetchWithAuth(path: string, options: RequestInit = {}) {
+ // In SvelteKit, we should handle cookies properly
+ // For client-side calls, the browser sends the cookie automatically
+ const res = await fetch(`${BASE_URL}${path}`, {
+ ...options,
+ headers: {
+ 'Content-Type': 'application/json',
+ ...options.headers,
+ },
+ });
+
+ if (!res.ok) {
+ throw new Error(`API Error: ${res.statusText}`);
+ }
+
+ return res.json();
+}
+
+export const api = {
+ getMe: () => fetchWithAuth('/api/profiles/me'),
+ getCards: () => fetchWithAuth('/api/cards'),
+ getProfiles: (username: string) => fetchWithAuth(`/api/u/${username}`),
+};
diff --git a/apps/web/src/lib/components/BrandIcon.svelte b/apps/web/src/lib/components/BrandIcon.svelte
new file mode 100644
index 0000000..eaccab4
--- /dev/null
+++ b/apps/web/src/lib/components/BrandIcon.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/apps/web/src/lib/components/Features.svelte b/apps/web/src/lib/components/Features.svelte
new file mode 100644
index 0000000..fdc6241
--- /dev/null
+++ b/apps/web/src/lib/components/Features.svelte
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+ Features
+
+
+ Designed for the
+ Modern Developer
+
+
+ Everything you need to showcase your digital presence with zero friction and maximum impact.
+
+
+
+
+ {#each features as feature, i}
+ {@const Icon = feature.icon}
+
+
+
+ {/each}
+
+
+
+
+
diff --git a/apps/web/src/lib/components/Footer.svelte b/apps/web/src/lib/components/Footer.svelte
new file mode 100644
index 0000000..908e46e
--- /dev/null
+++ b/apps/web/src/lib/components/Footer.svelte
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+ The ultimate developer identity platform. One tap to connect on every platform you care about. Open source and privacy-first.
+
+
+
+
+
+
+
+
+
+
+
+
+ © {new Date().getFullYear()} DevCard Platform. Built with for developers.
+
+
+
+ All Systems Operational
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/Hero.svelte b/apps/web/src/lib/components/Hero.svelte
new file mode 100644
index 0000000..bcbe7e4
--- /dev/null
+++ b/apps/web/src/lib/components/Hero.svelte
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#if isMounted}
+
+
+
+ The AI Identity Revolution
+
+
+
+
+ DevCard AI.
+ Intelligent
+ Identity.
+
+
+
+ Aggregate your entire professional existence. Use AI to generate recruiter-ready bios, extract technical skills from code, and optimize your visibility for the future of work.
+
+
+
+
+
+
+
+
+
+
+ 95%
+ Hiring Match
+
+
+
+
+
+
+
+ AI
+ Optimization
+
+
+
+ {/if}
+
+
+
+
+ {#if isMounted}
+
+
+
+
+
+
+
+
+
AI
+
+
Identity Score
+
98.4
+
+
+
+
+
+
+
+
+
John Developer
+
+
+
+
+
+
+
+
+
+
Smart Bio Generated
+
+
+
+
+
+
+
+
+
+
+
Skills Extracted (12)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/if}
+
+
+
+
+
+
diff --git a/apps/web/src/lib/components/Navbar.svelte b/apps/web/src/lib/components/Navbar.svelte
new file mode 100644
index 0000000..5eb3a75
--- /dev/null
+++ b/apps/web/src/lib/components/Navbar.svelte
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+ {#if isMobileMenuOpen}
+
+ {/if}
+
+
+
diff --git a/apps/web/src/routes/+layout.server.ts b/apps/web/src/routes/+layout.server.ts
new file mode 100644
index 0000000..a4329a6
--- /dev/null
+++ b/apps/web/src/routes/+layout.server.ts
@@ -0,0 +1,7 @@
+import type { LayoutServerLoad } from './$types';
+
+export const load: LayoutServerLoad = ({ locals }) => {
+ return {
+ user: locals.user
+ };
+};
diff --git a/apps/web/src/routes/+layout.svelte b/apps/web/src/routes/+layout.svelte
index ac6dd12..c3d7275 100644
--- a/apps/web/src/routes/+layout.svelte
+++ b/apps/web/src/routes/+layout.svelte
@@ -1,11 +1,18 @@
-
+
-{@render children()}
+
+
+
+
+ {@render children()}
+
+
diff --git a/apps/web/src/routes/+page.svelte b/apps/web/src/routes/+page.svelte
index 363a491..52c5855 100644
--- a/apps/web/src/routes/+page.svelte
+++ b/apps/web/src/routes/+page.svelte
@@ -1,314 +1,146 @@
-
- DevCard — One Tap. Every Profile. Every Platform.
+ DevCard — Premium Developer Identity Platform
-
-
-
- {theme === 'light' ? '🌙' : '☀️'}
-
- ⚡
- DevCard
- One Tap. Every Profile. Every Platform.
-
- Stop sharing LinkedIn, GitHub, and Twitter one by one.
- DevCard puts every profile in one shareable QR code.
-
-
-
-
-
-
-
🔗
-
One Card, All Profiles
-
- GitHub, LinkedIn, Twitter/X, Devfolio, GitLab, LeetCode, and 10+ more —
- all in one card.
-
-
-
-
⚡
-
Hybrid Follow Engine
-
- Follow on GitHub silently via API. Connect on LinkedIn with one tap in
- WebView. No app switching.
-
-
-
-
💳
-
Context Cards
-
- Share your "Professional" card at conferences and "Hackathon" card at
- hack events. Same profiles, different contexts.
-
-
-
-
📱
-
QR + AirDrop
-
- Generate a QR code or share via AirDrop-style link. Works even if the
- receiver doesn't have the app.
-
-
-
-
🔒
-
Privacy First
-
- No data monetization. No tracking. Apache 2.0 licensed. You own your
- data.
-
-
-
-
🌍
-
Open Source
-
- Community-driven development. Contribute, self-host, or extend with your
- own platforms.
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ Process
+
+
+ Stop the manual
+ Search & Connect dance.
+
+
+ DevCard streamlines professional networking by bridging the gap between physical interaction and digital connection.
+
+
+
+
+
+
+
+
+
+ 01
+
Connect Your Profiles
+
+
+ Link your GitHub, LinkedIn, Twitter, and 15+ other platforms in seconds. Our API handles the synchronization so your data is always up-to-date.
+
+
+
+
+
+
+
+
+ 02
+
Generate Your Card
+
+
+ Customize your card with professional, dark mode, or hackathon-focused layouts. Choose which profiles to share based on the context of your meeting.
+
+
+
+
+
+
+
+
+ 03
+
One Tap to Follow
+
+
+ Show your QR code. Your peer scans it and connects with you on everything instantly. No typing, no typos, no friction.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ready to upgrade your developer networking?
+
+ Join the community of developers who are streamlining their social presence with DevCard.
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/routes/analytics/+page.svelte b/apps/web/src/routes/analytics/+page.svelte
new file mode 100644
index 0000000..db585ee
--- /dev/null
+++ b/apps/web/src/routes/analytics/+page.svelte
@@ -0,0 +1,74 @@
+
+
+
+ Analytics — DevCard AI
+
+
+
+
+
+
+
+
+
+
+ Identity Analytics
+
+
+ Track your
+ Digital Influence.
+
+
+ Deep insights into how your identity is performing across the global developer ecosystem.
+
+
+
+
+ {#each stats as stat, i}
+
+
+
+
+
{stat.label}
+
{stat.value}
+
+ {/each}
+
+
+
+
+
+
+
+
Interactive Charts Loading...
+
+ Connect your production accounts to unlock real-time time-series data and audience demographic analysis.
+
+
+
+ Unlock Premium Insights
+
+
+
+
+
+
+
diff --git a/apps/web/src/routes/dashboard/+page.server.ts b/apps/web/src/routes/dashboard/+page.server.ts
new file mode 100644
index 0000000..9e48e43
--- /dev/null
+++ b/apps/web/src/routes/dashboard/+page.server.ts
@@ -0,0 +1,24 @@
+import type { PageServerLoad } from './$types';
+import { redirect } from '@sveltejs/kit';
+
+export const load: PageServerLoad = async ({ locals, fetch }) => {
+ if (!locals.user) {
+ throw redirect(303, '/login');
+ }
+
+ try {
+ // We call the backend directly from the server
+ const response = await fetch('http://localhost:3000/api/cards');
+ if (response.ok) {
+ const cards = await response.json();
+ return { cards };
+ }
+ } catch (err) {
+ console.error('Failed to fetch cards from backend:', err);
+ }
+
+ // Fallback to empty list or mocks if backend is down
+ return {
+ cards: []
+ };
+};
diff --git a/apps/web/src/routes/dashboard/+page.svelte b/apps/web/src/routes/dashboard/+page.svelte
new file mode 100644
index 0000000..e20abc0
--- /dev/null
+++ b/apps/web/src/routes/dashboard/+page.svelte
@@ -0,0 +1,272 @@
+
+
+
+ Dashboard — DevCard
+
+
+
+
+
+
+
+
+
+ DevCard
+
+
+
+ activeTab = 'cards'}
+ class="w-full flex items-center gap-4 p-3 rounded-2xl transition-all {activeTab === 'cards' ? 'bg-primary text-white shadow-lg shadow-primary/20' : 'text-(--text-muted) hover:bg-primary/10 hover:text-primary'}"
+ >
+
+ My Cards
+
+ activeTab = 'analytics'}
+ class="w-full flex items-center gap-4 p-3 rounded-2xl transition-all {activeTab === 'analytics' ? 'bg-primary text-white shadow-lg shadow-primary/20' : 'text-(--text-muted) hover:bg-primary/10 hover:text-primary'}"
+ >
+
+ Analytics
+
+ activeTab = 'settings'}
+ class="w-full flex items-center gap-4 p-3 rounded-2xl transition-all {activeTab === 'settings' ? 'bg-primary text-white shadow-lg shadow-primary/20' : 'text-(--text-muted) hover:bg-primary/10 hover:text-primary'}"
+ >
+
+ Settings
+
+
+
+
+
+
+
+
+
+
{data.user?.username || 'Guest'}
+
Free Plan
+
+
+
+
+
+
+
+
+
+ {#if isMounted}
+
+
+
+
+ {#each stats as stat, i}
+ {@const Icon = stat.icon}
+
+
+
+
+
+
{stat.label}
+
{stat.value}
+
+
+ {/each}
+
+
+
+ {#if activeTab === 'cards'}
+ {#if myCards.length === 0}
+
+
+
+
+
No Cards Yet
+
Create your first developer card to start sharing your professional presence.
+
isCreateModalOpen = true}
+ class="btn-premium-primary px-8 py-3"
+ >
+ Get Started
+
+
+ {:else}
+
+ {#each myCards as card, i}
+
+
+
+
+
+
+
+
{card.title}
+
{card.isDefault ? 'Primary' : 'Secondary'}
+
+
+
+
+
+
+
+
+ {#each card.links || [] as link}
+
+
+
+ {/each}
+
+
+
+
+
+
+
+
+ {card.views || 0}
+ Views
+
+
+
Updated {card.lastUpdated || 'recently'}
+
+
+
+
+ {/each}
+
+
+
isCreateModalOpen = true}
+ class="card-premium border-dashed border-2 border-primary/20 flex flex-col items-center justify-center gap-4 text-(--text-muted) hover:border-primary/40 hover:text-primary transition-all group"
+ >
+
+ Create New Profile
+
+
+ {/if}
+ {/if}
+ {/if}
+
+
+
+
+{#if isCreateModalOpen}
+
+
+
isCreateModalOpen = false}
+ class="absolute top-6 right-6 p-2 rounded-full hover:bg-primary/10 transition-colors"
+ >
+
+
+
+
Create New Card
+
Personalize your card identity and share your links.
+
+
+
+ Card Title
+
+
+
+
+ Create Card
+
+
+
+
+{/if}
+
+
diff --git a/apps/web/src/routes/features/[slug]/+page.svelte b/apps/web/src/routes/features/[slug]/+page.svelte
new file mode 100644
index 0000000..42d5802
--- /dev/null
+++ b/apps/web/src/routes/features/[slug]/+page.svelte
@@ -0,0 +1,179 @@
+
+
+
+ {feature.title} — DevCard Features
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to All Features
+
+
+
+
+
+ {#if isMounted}
+
+ Core Capability
+
+
+
+ {feature.title}
+
+
+
+ "{feature.tagline}"
+
+
+
+ {feature.description}
+
+
+
+ {/if}
+
+
+
+
+ {#if isMounted}
+
+ {/if}
+
+
+
+
+
+ {#each feature.stats as stat, i}
+
+
{stat.label}
+
{stat.value}
+
+ {/each}
+
+
+
+
+
+
How it actually Works .
+ {#each feature.highlights as highlight}
+
+
+
+
+
+
{highlight.title}
+
{highlight.text}
+
+
+ {/each}
+
+
+
+
+
+
+
+
Enterprise Ready
+
+
+ "DevCard provides the level of polish and performance expected by modern engineering teams. It's not just a tool; it's your professional handshake."
+
+
+
+
+
Product Team
+
DevCard Lead Architects
+
+
+
+
+
+
+
+
+
+
+
+
Ready to use {feature.title} ?
+
+ Join the elite circle of developers who care about their identity as much as their code.
+
+
+ Create Your Free Card
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/routes/features/[slug]/+page.ts b/apps/web/src/routes/features/[slug]/+page.ts
new file mode 100644
index 0000000..2a916bb
--- /dev/null
+++ b/apps/web/src/routes/features/[slug]/+page.ts
@@ -0,0 +1,165 @@
+import { error } from '@sveltejs/kit';
+import type { PageLoad } from './$types';
+import {
+ Layers, Zap, CreditCard, Share2, Lock, Globe,
+ Code, Shield, Zap as Fast, Smartphone, Users
+} from 'lucide-svelte';
+
+const featureData = {
+ 'one-card': {
+ title: "One Card, All Profiles",
+ tagline: "The single source of truth for your digital identity.",
+ description: "Aggregation is at the heart of DevCard. We connect to the APIs of major platforms to ensure your metrics, contributions, and social links are always in sync.",
+ icon: Layers,
+ color: "from-blue-500 to-indigo-600",
+ stats: [
+ { label: "Integrations", value: "20+" },
+ { label: "Sync Speed", value: "Real-time" },
+ { label: "Accuracy", value: "100%" }
+ ],
+ highlights: [
+ {
+ title: "Deep API Integration",
+ text: "We don't just link; we fetch data. Your GitHub contribution graph and Twitter bio are imported directly.",
+ icon: Code
+ },
+ {
+ title: "Auto-Discovery",
+ text: "Add one link, and our engine finds your other profiles based on verified metadata.",
+ icon: Fast
+ }
+ ]
+ },
+ 'hybrid-engine': {
+ title: "Hybrid Follow Engine",
+ tagline: "The faster way to grow your professional network.",
+ description: "Networking shouldn't be manual. Our Hybrid Engine allows you to follow someone on multiple platforms simultaneously with a single secure handshake.",
+ icon: Zap,
+ color: "from-orange-400 to-red-500",
+ stats: [
+ { label: "Time Saved", value: "90%" },
+ { label: "Success Rate", value: "99.9%" },
+ { label: "Handshake", value: "Secure" }
+ ],
+ highlights: [
+ {
+ title: "Silent Handshake",
+ text: "Exchange data without scanning. Using near-field proximity logic for instant detection.",
+ icon: Smartphone
+ },
+ {
+ title: "Multi-Platform Push",
+ text: "Follow on GitHub, LinkedIn, and Twitter in one click. No more searching for usernames.",
+ icon: Users
+ }
+ ]
+ },
+ 'context-cards': {
+ title: "Context Cards",
+ tagline: "Tailor your identity to the audience.",
+ description: "You are more than one thing. DevCard lets you create different versions of your profile for different contexts—hackathons, conferences, or job interviews.",
+ icon: CreditCard,
+ color: "from-purple-500 to-pink-600",
+ stats: [
+ { label: "Templates", value: "12+" },
+ { label: "Custom Slots", value: "Unlimited" },
+ { label: "Switch Speed", value: "Instant" }
+ ],
+ highlights: [
+ {
+ title: "Professional Persona",
+ text: "Hide the memes, show the enterprise experience. Perfect for high-stakes interviews.",
+ icon: Shield
+ },
+ {
+ title: "Hacker Identity",
+ text: "Showcase your PRs, repo stars, and hackathon wins for developer-focused meetups.",
+ icon: Code
+ }
+ ]
+ },
+ 'instant-sharing': {
+ title: "Instant Sharing",
+ tagline: "Frictionless connection, everywhere.",
+ description: "Share your card via QR code, NFC tags, or a short 'magic' URL. Your peers don't even need the app to connect with you.",
+ icon: Share2,
+ color: "from-green-400 to-emerald-600",
+ stats: [
+ { label: "NFC Ready", value: "Yes" },
+ { label: "QR Format", value: "SVG/PNG" },
+ { label: "Offline", value: "Supported" }
+ ],
+ highlights: [
+ {
+ title: "Zero-App Requirement",
+ text: "Anyone with a browser can view your card. They don't need to sign up to save your contact info.",
+ icon: Globe
+ },
+ {
+ title: "NFC Card Support",
+ text: "Program your physical business card or phone sticker to point to your DevCard instantly.",
+ icon: Smartphone
+ }
+ ]
+ },
+ 'privacy-first': {
+ title: "Privacy-First Architecture",
+ tagline: "Your data is your property.",
+ description: "DevCard is built on the principle of data sovereignty. We never sell your info, and we use zero trackers.",
+ icon: Lock,
+ color: "from-rose-500 to-orange-600",
+ stats: [
+ { label: "Trackers", value: "Zero" },
+ { label: "Ads", value: "None" },
+ { label: "Encryption", value: "E2E" }
+ ],
+ highlights: [
+ {
+ title: "Open Source Audit",
+ text: "Our source code is transparent. Anyone can verify how we handle user data.",
+ icon: Code
+ },
+ {
+ title: "Zero Monetization",
+ text: "We don't sell your data. Our model is based on premium features, not user tracking.",
+ icon: Globe
+ }
+ ]
+ },
+ 'developer-focused': {
+ title: "Built for Developers",
+ tagline: "High performance, zero bloat.",
+ description: "Written in Svelte 5 and optimized for speed. DevCard is built by developers, for developers, with a focus on DX and performance.",
+ icon: Globe,
+ color: "from-cyan-400 to-blue-600",
+ stats: [
+ { label: "Lighthouse", value: "100/100" },
+ { label: "Bundle Size", value: "Minimal" },
+ { label: "API Access", value: "Public" }
+ ],
+ highlights: [
+ {
+ title: "Extensible Schema",
+ text: "Add custom platforms or integrations via our open API. Build your own themes and layouts.",
+ icon: Code
+ },
+ {
+ title: "Community Driven",
+ text: "Fully open source under Apache 2.0. Suggest features, fix bugs, and grow the platform.",
+ icon: Users
+ }
+ ]
+ }
+};
+
+export const load: PageLoad = ({ params }) => {
+ const feature = featureData[params.slug as keyof typeof featureData];
+
+ if (!feature) {
+ throw error(404, 'Feature not found');
+ }
+
+ return {
+ feature
+ };
+};
diff --git a/apps/web/src/routes/login/+page.svelte b/apps/web/src/routes/login/+page.svelte
new file mode 100644
index 0000000..bd71f69
--- /dev/null
+++ b/apps/web/src/routes/login/+page.svelte
@@ -0,0 +1,119 @@
+
+
+
+ Login — DevCard
+
+
+
+
+
+
+ {#if isMounted}
+
+
+
+
+ D
+
+ DevCard
+
+
Welcome Back
+
Continue your journey in the developer ecosystem.
+
+
+
+
+
+ {#if error}
+
+ {/if}
+
+
+
handleOAuth('github')}
+ disabled={isLoading}
+ class="w-full flex items-center justify-center gap-4 bg-[#24292e] hover:bg-[#2f363d] text-white py-4 rounded-2xl font-bold transition-all duration-300 hover:shadow-xl hover:-translate-y-1 active:scale-95 disabled:opacity-50 disabled:cursor-not-allowed"
+ >
+ {#if isLoading}
+
+ {:else}
+
+ {/if}
+ {isLoading ? 'Connecting...' : 'Continue with GitHub'}
+
+
+
handleOAuth('google')}
+ disabled={isLoading}
+ class="w-full flex items-center justify-center gap-4 bg-white hover:bg-gray-50 text-black py-4 rounded-2xl font-bold transition-all duration-300 hover:shadow-xl hover:-translate-y-1 active:scale-95 border border-gray-200 disabled:opacity-50 disabled:cursor-not-allowed"
+ >
+ {#if isLoading}
+
+ {:else}
+
+ {/if}
+ {isLoading ? 'Connecting...' : 'Continue with Google'}
+
+
+
+
+
+
+
+
+ We only request public profile access. Your private data and repositories remain completely secure and untouched.
+
+
+
+
+
+ Don't have an account?
+ Create one for free
+
+
+ {/if}
+
diff --git a/apps/web/src/routes/signup/+page.svelte b/apps/web/src/routes/signup/+page.svelte
new file mode 100644
index 0000000..768492f
--- /dev/null
+++ b/apps/web/src/routes/signup/+page.svelte
@@ -0,0 +1,125 @@
+
+
+
+ Sign Up — DevCard
+
+
+
+
+
+
+ {#if isMounted}
+
+
+
+
+ D
+
+ DevCard
+
+
Claim Your Identity
+
Join 5,000+ developers sharing their best work.
+
+
+
+
+
+ {#if error}
+
+ {/if}
+
+
+
handleOAuth('github')}
+ disabled={isLoading}
+ class="w-full flex items-center justify-center gap-4 bg-[#24292e] hover:bg-[#2f363d] text-white py-4 rounded-2xl font-bold transition-all duration-300 hover:shadow-xl hover:-translate-y-1 active:scale-95 disabled:opacity-50 disabled:cursor-not-allowed"
+ >
+ {#if isLoading}
+
+ {:else}
+
+ {/if}
+ {isLoading ? 'Connecting...' : 'Sign up with GitHub'}
+
+
+
handleOAuth('google')}
+ disabled={isLoading}
+ class="w-full flex items-center justify-center gap-4 bg-white hover:bg-gray-50 text-black py-4 rounded-2xl font-bold transition-all duration-300 hover:shadow-xl hover:-translate-y-1 active:scale-95 border border-gray-200 disabled:opacity-50 disabled:cursor-not-allowed"
+ >
+ {#if isLoading}
+
+ {:else}
+
+ {/if}
+ {isLoading ? 'Connecting...' : 'Sign up with Google'}
+
+
+
+
+
+
+
+
+
+
+
Instant QR Generation
+
+
+
+
+
+
Public Shareable Profile
+
+
+
+
+
+ Already have an account?
+ Log in here
+
+
+ {/if}
+
diff --git a/apps/web/src/routes/studio/+page.svelte b/apps/web/src/routes/studio/+page.svelte
new file mode 100644
index 0000000..a17bef9
--- /dev/null
+++ b/apps/web/src/routes/studio/+page.svelte
@@ -0,0 +1,216 @@
+
+
+
+ AI Studio — DevCard AI
+
+
+
+
+
+
+
+
+
+
+ AI Enhancement Studio
+
+
+ Optimize your
+ Digital DNA.
+
+
+ Use state-of-the-art AI to analyze your project history, extract expertise, and build an unbeatable professional narrative.
+
+
+
+
+
+
+
+
+
+ Connected Sources
+
+
+
+
+
+ GitHub
+
+
Active
+
+
+
+
+ LinkedIn
+
+
Connect
+
+
+
+
+
+
AI Intelligence
+
+ Our models are trained on 10M+ successful developer profiles and hiring patterns.
+
+
+
+
+ Bio Optimization
+
+
+
+ Skill Gap Analysis
+
+
+
+ Recruiter Visibility
+
+
+
+
+
+
+
+
+ {#if !isProcessing && progress === 0}
+
+
+
+
Ready for AI Analysis?
+
+ We'll scan your public contributions and platforms to build your intelligent identity. This takes about 30 seconds.
+
+
+ Start Analysis
+
+
+ {:else if isProcessing}
+
+
+
+
+
+ {Math.round(progress)}%
+
+
+
{currentStep}
+
AI Neural Link Active
+
+ {:else}
+
+
+
Analysis Complete.
+
+
+ Re-analyze
+
+
+
+
+
+
+
Smart Bio
+
+ "A high-impact Full Stack Engineer with a focus on cinematic user experiences. Proven track record in Svelte architectures and AI-driven frontend ecosystems. Top 1% contributor in open-source identity tooling."
+
+
+
+
Skill Extraction
+
+ {#each ['SvelteKit', 'TypeScript', 'Tailwind', 'AI/ML', 'Fastify', 'Prisma', 'PostgreSQL', 'UI/UX'] as skill}
+ {skill}
+ {/each}
+
+
+
+
+
+
+
Optimization Report
+
+
+
+ Profile SEO: Excellent
+
+
+
+ Project Linking: Needs Update
+
+
+
+ Recruiter Impact: High
+
+
+
+
+
+ Apply Enhancements
+
+
+
+
+ {/if}
+
+
+
+
+
+
+
+
+
diff --git a/apps/web/src/routes/themes/+page.svelte b/apps/web/src/routes/themes/+page.svelte
new file mode 100644
index 0000000..b3e93c4
--- /dev/null
+++ b/apps/web/src/routes/themes/+page.svelte
@@ -0,0 +1,83 @@
+
+
+
+ Marketplace — DevCard AI
+
+
+
+
+
+
+
+
+
+
+ Theme Marketplace
+
+
+ Personalize your
+ Digital Presence.
+
+
+ Choose from a curated collection of premium themes designed to make your identity stand out.
+
+
+
+
+ {#each themes as theme, i}
+
+
+
{theme.name}
+
+ {theme.description}
+
+
+ {theme.price}
+
+
+
+
+
+ {/each}
+
+
+
+
+
+
+
Want something unique?
+
+ Our AI can generate a custom theme based on your brand colors and personality.
+
+
+
+ Generate AI Theme
+
+
+
+
+
+
+
diff --git a/apps/web/src/routes/u/[username]/+page.svelte b/apps/web/src/routes/u/[username]/+page.svelte
index f7750ec..ea44507 100644
--- a/apps/web/src/routes/u/[username]/+page.svelte
+++ b/apps/web/src/routes/u/[username]/+page.svelte
@@ -1,9 +1,15 @@
{#if profile}
{profile.displayName} — DevCard
-
-
{:else}
User Not Found — DevCard
{/if}
-{#if error || !profile}
-
-
-
😕
-
User Not Found
-
This DevCard doesn't exist or has been removed.
-
← Back to DevCard
-
-
-{:else}
-
-
-
-