2025-03-04 17:53:05 +01:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" />
< meta name = "referrer" content = "no-referrer" />
2026-03-24 16:03:31 +07:00
< link rel = "icon" type = "image/png" sizes = "16x16" href = "/favicon.ico?variant=nsfw" />
< link rel = "shortcut icon" type = "image/png" sizes = "16x16" href = "/favicon.ico?variant=nsfw" />
2026-03-12 18:24:58 +08:00
< meta name = "viewport" content = "width=device-width, initial-scale=1" />
2025-03-04 17:53:05 +01:00
< meta name = "theme-color" content = "#000000" />
2026-03-01 14:26:29 +08:00
< meta name = "description" content = "5chan is a free, open-source, decentralized imageboard built on the Bitsocial protocol. No servers, no admins — all content is shared peer-to-peer via IPFS." />
2026-03-09 17:01:35 +08:00
< meta name = "author" content = "bitsocialnet" />
2026-03-01 14:26:29 +08:00
< link rel = "canonical" href = "https://5chan.app/" />
2025-03-04 17:53:05 +01:00
< link rel = "apple-touch-icon" href = "/apple-touch-icon.png" />
< link rel = "manifest" href = "/manifest.json" />
2026-03-01 14:26:29 +08:00
<!-- OpenGraph -->
< meta property = "og:type" content = "website" />
< meta property = "og:site_name" content = "5chan" />
< meta property = "og:title" content = "5chan — Decentralized Imageboard" />
< meta property = "og:description" content = "Free, open-source, serverless imageboard built on the Bitsocial protocol. No servers, no admins — peer-to-peer via IPFS." />
< meta property = "og:url" content = "https://5chan.app/" />
< meta property = "og:image" content = "https://5chan.app/manifest-icon-512x512.png" />
<!-- Twitter Card -->
< meta name = "twitter:card" content = "summary" />
< meta name = "twitter:title" content = "5chan — Decentralized Imageboard" />
< meta name = "twitter:description" content = "Free, open-source, serverless imageboard built on the Bitsocial protocol. Peer-to-peer via IPFS." />
< meta name = "twitter:image" content = "https://5chan.app/manifest-icon-512x512.png" />
<!-- Structured Data -->
< script type = "application/ld+json" >
{
"@context" : "https://schema.org" ,
"@type" : "WebApplication" ,
"name" : "5chan" ,
2026-03-01 19:05:59 +08:00
"url" : "https://5chan.app/" ,
2026-03-01 14:26:29 +08:00
"description" : "Free, open-source, decentralized imageboard built on the Bitsocial protocol. No servers, no admins — all content is shared peer-to-peer via IPFS." ,
"applicationCategory" : "SocialNetworkingApplication" ,
"operatingSystem" : "Any" ,
"offers" : { "@type" : "Offer" , "price" : "0" , "priceCurrency" : "USD" },
"author" : {
"@type" : "Organization" ,
2026-03-09 17:01:35 +08:00
"name" : "bitsocialnet" ,
"url" : "https://github.com/bitsocialnet"
2026-03-01 14:26:29 +08:00
},
2026-04-16 13:36:40 +07:00
"license" : "https://www.gnu.org/licenses/gpl-3.0-standalone.html" ,
2026-03-01 14:26:29 +08:00
"sourceOrganization" : {
"@type" : "Organization" ,
2026-03-09 17:01:35 +08:00
"name" : "bitsocialnet" ,
"url" : "https://github.com/bitsocialnet"
2026-03-01 14:26:29 +08:00
},
"isAccessibleForFree" : true ,
2026-03-09 17:01:35 +08:00
"codeRepository" : "https://github.com/bitsocialnet/5chan"
2026-03-01 14:26:29 +08:00
}
</ script >
< title > 5chan — Decentralized Imageboard</ title >
2026-03-01 18:58:18 +08:00
<!-- React Grab: toolbar-only activation; keyboard shortcut disabled to avoid copy/paste conflicts (dev only) -->
2025-12-27 17:41:19 +01:00
< script type = "module" >
if ( import . meta . env . DEV ) {
2026-03-01 18:58:18 +08:00
import ( "react-grab/core" ). then (( m ) => m . init ({ activationShortcut : () => false }));
2025-12-27 17:41:19 +01:00
}
</ script >
2025-11-07 12:18:42 +01:00
< script >
// Redirect non-hash URLs to hash URLs on initial load
2026-01-30 13:12:02 +08:00
// Skip redirect for file:// protocol (Electron) or if pathname ends with index.html
if (
window . location . protocol !== 'file:' &&
window . location . pathname &&
window . location . pathname !== '/' &&
! window . location . pathname . endsWith ( '/index.html' ) &&
! window . location . hash
) {
2025-11-07 12:18:42 +01:00
window . location . replace ( '/#' + window . location . pathname + window . location . search );
}
</ script >
2025-03-04 17:53:05 +01:00
</ head >
< body >
< noscript > You need to enable JavaScript to run this app.</ noscript >
< div id = "root" ></ div >
< script type = "module" src = "/src/index.tsx" ></ script >
</ body >
</ html >