├── app ├── robots.txt ├── favicon.ico ├── api │ ├── auth │ │ ├── [...nextauth] │ │ │ └── route.ts │ │ ├── change-password │ │ │ └── route.ts │ │ └── register │ │ │ └── route.ts │ ├── devices │ │ ├── [deviceId] │ │ │ ├── qr │ │ │ │ └── route.ts │ │ │ ├── config │ │ │ │ └── route.ts │ │ │ └── route.ts │ │ └── route.ts │ └── admin │ │ ├── invite-codes │ │ ├── [codeId] │ │ │ ├── usage │ │ │ │ └── route.ts │ │ │ └── route.ts │ │ └── route.ts │ │ └── users │ │ └── route.ts ├── (unauthenticated) │ ├── (marketing) │ │ ├── (pages) │ │ │ ├── about │ │ │ │ └── page.tsx │ │ │ ├── contact │ │ │ │ └── page.tsx │ │ │ ├── pricing │ │ │ │ └── page.tsx │ │ │ ├── features │ │ │ │ └── page.tsx │ │ │ └── layout.tsx │ │ ├── _components │ │ │ ├── header-wrapper.tsx │ │ │ ├── sections │ │ │ │ ├── section-wrapper.tsx │ │ │ │ ├── cta-section.tsx │ │ │ │ ├── social-proof-section.tsx │ │ │ │ ├── companies-section.tsx │ │ │ │ ├── faq-section.tsx │ │ │ │ ├── features-section.tsx │ │ │ │ └── video-section.tsx │ │ │ ├── site-banner.tsx │ │ │ ├── scroll-indicator.tsx │ │ │ ├── sticky-cta.tsx │ │ │ └── footer.tsx │ │ ├── layout.tsx │ │ └── page.tsx │ └── confirmation │ │ └── page.tsx ├── (authenticated) │ └── dashboard │ │ ├── layout.tsx │ │ ├── (pages) │ │ └── devices │ │ │ └── new │ │ │ └── page.tsx │ │ └── _components │ │ ├── app-sidebar.tsx │ │ ├── team-switcher.tsx │ │ └── nav-user.tsx ├── not-found.tsx ├── layout.tsx └── page.tsx ├── postcss.config.mjs ├── supabase └── .gitignore ├── db ├── migrations │ ├── 0002_add_last_login.sql │ ├── 0003_add_invite_code_active_status.sql │ ├── meta │ │ └── _journal.json │ ├── 0000_giant_butterfly.sql │ └── 0001_multi_use_invites.sql ├── index.ts ├── seed │ ├── index.ts │ └── data │ │ └── customers.ts ├── schema.ts └── migrate-to-multi-use.js ├── lib ├── utils.ts ├── language-context.tsx └── wireguard.ts ├── auth.ts ├── drizzle.config.ts ├── components ├── ui │ ├── skeleton.tsx │ ├── sonner.tsx │ ├── label.tsx │ ├── separator.tsx │ ├── textarea.tsx │ ├── collapsible.tsx │ ├── input.tsx │ ├── avatar.tsx │ ├── badge.tsx │ ├── card.tsx │ ├── tooltip.tsx │ ├── button.tsx │ ├── breadcrumb.tsx │ ├── table.tsx │ ├── dialog.tsx │ ├── alert-dialog.tsx │ └── sheet.tsx └── utility │ ├── tailwind-indicator.tsx │ └── markdown.tsx ├── .github ├── config.yml ├── ISSUE_TEMPLATE │ ├── feature_request.md │ ├── feature_request.yml │ ├── bug_report.md │ └── bug_report.yml └── PULL_REQUEST_TEMPLATE.md ├── env.example ├── components.json ├── types └── next-auth.d.ts ├── Dockerfile ├── .repo_ignore ├── SECURITY.md ├── eslint.config.mjs ├── hooks ├── use-mobile.ts └── use-local-storage.ts ├── tsconfig.json ├── .gitignore ├── .env.example ├── middleware.ts ├── docker-compose.yml ├── prettier.config.cjs ├── CHANGELOG.md ├── license ├── next.config.ts ├── ADMIN_GUIDE.md ├── TROUBLESHOOTING.md ├── ROADMAP.md ├── CONTRIBUTING.md ├── auth.config.ts ├── package.json ├── CLAUDE.md └── CODE_OF_CONDUCT.md /app/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arashvakil/LeiaGuard/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | plugins: ["@tailwindcss/postcss"], 3 | }; 4 | 5 | export default config; 6 | -------------------------------------------------------------------------------- /supabase/.gitignore: -------------------------------------------------------------------------------- 1 | # Supabase 2 | .branches 3 | .temp 4 | 5 | # dotenvx 6 | .env.keys 7 | .env.local 8 | .env.*.local 9 | -------------------------------------------------------------------------------- /app/api/auth/[...nextauth]/route.ts: -------------------------------------------------------------------------------- 1 | import { handlers } from "../../../../auth"; 2 | 3 | export const { GET, POST } = handlers; -------------------------------------------------------------------------------- /db/migrations/0002_add_last_login.sql: -------------------------------------------------------------------------------- 1 | -- Add last login tracking to users table 2 | ALTER TABLE users ADD COLUMN last_login_at TEXT; -------------------------------------------------------------------------------- /app/(unauthenticated)/(marketing)/(pages)/about/page.tsx: -------------------------------------------------------------------------------- 1 | export default function AboutPage() { 2 | return ( 3 |
12 | Thank you for upgrading to Pro. Your account has been activated. 13 |
14 | 17 |14 | Oops! The page you're looking for doesn't exist. It might have been 15 | moved or deleted. 16 |
17 | 18 |{children}
32 | ), 33 | ul: ({ children }) => ( 34 |
44 | {children}
45 |
46 | )
47 | }
48 | return (
49 |
50 | {children}
51 |
52 | )
53 | },
54 | blockquote: ({ children }) => (
55 | 56 | {children} 57 |58 | ), 59 | a: ({ href, children }) => ( 60 | 66 | {children} 67 | 68 | ), 69 | img: ({ src, alt }) => ( 70 |
29 | {t.marketing.heroDescription} 30 |
31 |83 | {t.marketing.needInvitationCode} 84 |
85 |90 | {t.marketing.privateVPNService} 91 |
92 |83 |85 |"{testimonial.content}"
84 |
38 | Trusted technologies that power thousands of production applications 39 |
40 |26 | Like LeiaGuard? 27 |
28 |29 | Star us on GitHub! 30 |
31 |87 | Like LeiaGuard? 88 |
89 |90 | Star us on GitHub! 91 |
92 |104 | Secure WireGuard Management, open-source 105 |
106 |{feature.description}
134 |
60 | {`$ git clone github.com/YOUR_ORG/LeiaGuard
61 | $ cd LeiaGuard
62 | $ npm install
63 | $ cp .env.example .env.local
64 | $ npm run dev
65 |
66 | ✓ Ready in 3s
67 | ○ Compiling / ...
68 | ✓ Compiled successfully
69 | ✓ Ready at http://localhost:3000`}
70 |
71 | 97 | From clone to deploy in minutes 98 |
99 |