Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ representative at an online or offline event.
## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders at **logusivam26@gmail.com**. All complaints
will be reviewed and investigated promptly and fairly.
reported to the community leaders at **devbridgeenquirz@gmail.com**. All
complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
Expand Down
238 changes: 129 additions & 109 deletions apps/web/index.html
Original file line number Diff line number Diff line change
@@ -1,43 +1,48 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<!-- Primary SEO Meta Tags -->
<title>TokenForge — JWT Auth System Built From Scratch | No Auth0</title>
<meta name="description" content="Open-source JWT authentication system with refresh token rotation, OAuth2 (Google/GitHub), and RBAC. Built from scratch with Node.js, Express, Redis, and MongoDB. No Auth0. No Clerk." />
<meta name="keywords" content="JWT authentication, refresh token rotation, OAuth2, RBAC, Node.js auth, custom auth system, token forge, JWT RS256, token family tracking, rate limiting, csrf protection, express security" />
<meta name="robots" content="index, follow" />
<link rel="canonical" href="https://tokenforge.dev" />

<!-- Favicon & Icon Variants -->
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" />
<link rel="icon" type="image/png" sizes="64x64" href="/favicon-64.png" />
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96.png" />
<link rel="icon" type="image/png" sizes="128x128" href="/favicon-128.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192.png" />
<link rel="icon" type="image/png" sizes="256x256" href="/favicon-256.png" />
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png" />

<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://tokenforge.dev" />
<meta property="og:title" content="TokenForge — Forge Your Auth. Own Every Token." />
<meta property="og:description" content="JWT + Refresh Token Rotation + OAuth2 + RBAC. Full custom auth system. Zero third-party dependencies." />
<meta property="og:image" content="https://tokenforge.dev/og-image.png" />

<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://tokenforge.dev" />
<meta name="twitter:title" content="TokenForge — JWT Auth From Scratch" />
<meta name="twitter:description" content="Refresh token rotation · OAuth2 PKCE · RBAC · RS256. Built without Auth0." />
<meta name="twitter:image" content="https://tokenforge.dev/og-image.png" />

<!-- Structured Data (JSON-LD) -->
<script type="application/ld+json">

<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<!-- Primary SEO Meta Tags -->
<title>TokenForge — JWT Auth System Built From Scratch | No Auth0</title>
<meta name="description"
content="Open-source JWT authentication system with refresh token rotation, OAuth2 (Google/GitHub), and RBAC. Built from scratch with Node.js, Express, Redis, and MongoDB. No Auth0. No Clerk." />
<meta name="keywords"
content="JWT authentication, refresh token rotation, OAuth2, RBAC, Node.js auth, custom auth system, token forge, JWT RS256, token family tracking, rate limiting, csrf protection, express security" />
<meta name="robots" content="index, follow" />
<link rel="canonical" href="https://tokenforge-dev.vercel.app" />

<!-- Favicon & Icon Variants -->
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" />
<link rel="icon" type="image/png" sizes="64x64" href="/favicon-64.png" />
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96.png" />
<link rel="icon" type="image/png" sizes="128x128" href="/favicon-128.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192.png" />
<link rel="icon" type="image/png" sizes="256x256" href="/favicon-256.png" />
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png" />

<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://tokenforge-dev.vercel.app" />
<meta property="og:title" content="TokenForge — Forge Your Auth. Own Every Token." />
<meta property="og:description"
content="JWT + Refresh Token Rotation + OAuth2 + RBAC. Full custom auth system. Zero third-party dependencies." />
<meta property="og:image" content="https://tokenforge-dev.vercel.app/og-image.png" />

<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content="https://tokenforge-dev.vercel.app" />
<meta name="twitter:title" content="TokenForge — JWT Auth From Scratch" />
<meta name="twitter:description"
content="Refresh token rotation · OAuth2 PKCE · RBAC · RS256. Built without Auth0." />
<meta name="twitter:image" content="https://tokenforge-dev.vercel.app/og-image.png" />

<!-- Structured Data (JSON-LD) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
Expand All @@ -61,79 +66,94 @@
}
</script>

<!-- Preloader Animation Styles -->
<style>
#preloader {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #0A0A0F;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
z-index: 99999;
transition: opacity 0.5s ease, transform 0.5s ease;
}
.preloader-logo {
width: 120px;
height: 120px;
animation: pulseLogo 2s infinite ease-in-out;
border-radius: 24px;
box-shadow: 0 0 35px rgba(99, 102, 241, 0.25);
<!-- Preloader Animation Styles -->
<style>
#preloader {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #0A0A0F;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
z-index: 99999;
transition: opacity 0.5s ease, transform 0.5s ease;
}

.preloader-logo {
width: 120px;
height: 120px;
animation: pulseLogo 2s infinite ease-in-out;
border-radius: 24px;
box-shadow: 0 0 35px rgba(99, 102, 241, 0.25);
}

.preloader-spinner {
margin-top: 24px;
border: 3px solid rgba(99, 102, 241, 0.1);
border-top: 3px solid #6366f1;
border-radius: 50%;
width: 32px;
height: 32px;
animation: spinPreloader 1s linear infinite;
}

@keyframes pulseLogo {

0%,
100% {
transform: scale(0.95);
filter: drop-shadow(0 0 15px rgba(99, 102, 241, 0.2));
}
.preloader-spinner {
margin-top: 24px;
border: 3px solid rgba(99, 102, 241, 0.1);
border-top: 3px solid #6366f1;
border-radius: 50%;
width: 32px;
height: 32px;
animation: spinPreloader 1s linear infinite;

50% {
transform: scale(1.05);
filter: drop-shadow(0 0 35px rgba(99, 102, 241, 0.45));
}
@keyframes pulseLogo {
0%, 100% {
transform: scale(0.95);
filter: drop-shadow(0 0 15px rgba(99, 102, 241, 0.2));
}
50% {
transform: scale(1.05);
filter: drop-shadow(0 0 35px rgba(99, 102, 241, 0.45));
}
}

@keyframes spinPreloader {
0% {
transform: rotate(0deg);
}
@keyframes spinPreloader {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }

100% {
transform: rotate(360deg);
}
.preloader-fade-out {
opacity: 0 !important;
pointer-events: none !important;
}

.preloader-fade-out {
opacity: 0 !important;
pointer-events: none !important;
}
</style>
</head>

<body class="bg-[#0b0f19] text-[#f8fafc] min-h-screen font-sans">
<!-- Preloader Animation Screen -->
<div id="preloader">
<img class="preloader-logo" src="/logo-1024x1024.png" alt="TokenForge Logo" />
<div class="preloader-spinner"></div>
</div>

<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>

<!-- Preloader Dismissal script -->
<script>
window.addEventListener('load', function () {
const preloader = document.getElementById('preloader');
if (preloader) {
preloader.classList.add('preloader-fade-out');
setTimeout(() => {
preloader.style.display = 'none';
}, 500);
}
</style>
</head>
<body class="bg-[#0b0f19] text-[#f8fafc] min-h-screen font-sans">
<!-- Preloader Animation Screen -->
<div id="preloader">
<img class="preloader-logo" src="/logo-1024x1024.png" alt="TokenForge Logo" />
<div class="preloader-spinner"></div>
</div>

<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>

<!-- Preloader Dismissal script -->
<script>
window.addEventListener('load', function() {
const preloader = document.getElementById('preloader');
if (preloader) {
preloader.classList.add('preloader-fade-out');
setTimeout(() => {
preloader.style.display = 'none';
}, 500);
}
});
</script>
</body>
</html>
});
</script>
</body>

</html>
2 changes: 1 addition & 1 deletion apps/web/public/robots.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ Disallow: /profile
Disallow: /dashboard
Disallow: /oauth/

Sitemap: https://tokenforge.dev/sitemap.xml
Sitemap: https://tokenforge-dev.vercel.app/sitemap.xml
8 changes: 4 additions & 4 deletions apps/web/public/sitemap.xml
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://tokenforge.dev/</loc>
<loc>https://tokenforge-dev.vercel.app/</loc>
<lastmod>2026-07-22</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://tokenforge.dev/login</loc>
<loc>https://tokenforge-dev.vercel.app/login</loc>
<lastmod>2026-07-22</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://tokenforge.dev/register</loc>
<loc>https://tokenforge-dev.vercel.app/register</loc>
<lastmod>2026-07-22</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://tokenforge.dev/terms-of-service</loc>
<loc>https://tokenforge-dev.vercel.app/terms-of-service</loc>
<lastmod>2026-07-22</lastmod>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ Contact: mailto:devbridgeenquirz@gmail.com
Expires: 2027-12-31T23:59:59.000Z
Preferred-Languages: en
Canonical: https://tokenforge-dev.vercel.app/.well-known/security.txt
Policy: https://github.com/logusivam/tokenforge/blob/main/SECURITY.md
Policy: https://github.com/logusivam/tokenforge/blob/dev/SECURITY.md
6 changes: 5 additions & 1 deletion apps/web/vercel.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
"cleanUrls": true,
"rewrites": [
{
"source": "/((?!assets/|robots\\.txt|sitemap\\.xml|\\.well-known/|.*\\.(?:png|jpg|jpeg|gif|svg|ico|txt|js|css)$).*)",
"source": "/.well-known/security.txt",
"destination": "/well-known/security.txt"
},
{
"source": "/((?!assets/|robots\\.txt|sitemap\\.xml|well-known/|.*\\.(?:png|jpg|jpeg|gif|svg|ico|txt|js|css)$).*)",
"destination": "/index.html"
}
]
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"description": "JWT auth system with refresh token rotation, OAuth2 PKCE, and RBAC — built from scratch",
"author": "Loganathan <logusivam@github>",
"license": "MIT",
"homepage": "https://tokenforge.dev",
"homepage": "https://tokenforge-dev.vercel.app",
"repository": {
"type": "git",
"url": "https://github.com/logusivam/tokenforge.git"
Expand Down
6 changes: 5 additions & 1 deletion vercel.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
"cleanUrls": true,
"rewrites": [
{
"source": "/((?!assets/|robots\\.txt|sitemap\\.xml|\\.well-known/|.*\\.(?:png|jpg|jpeg|gif|svg|ico|txt|js|css)$).*)",
"source": "/.well-known/security.txt",
"destination": "/well-known/security.txt"
},
{
"source": "/((?!assets/|robots\\.txt|sitemap\\.xml|well-known/|.*\\.(?:png|jpg|jpeg|gif|svg|ico|txt|js|css)$).*)",
"destination": "/index.html"
}
]
Expand Down
Loading