LinkDen is a fully self-hosted, open-source link-in-bio platform built for Cloudflare's edge network. It gives you a drag-and-drop block builder, full theme control, analytics, Apple Wallet pass generation, and a contact inbox — all running on Cloudflare Workers + D1 with near-zero cold starts. Designed for privacy-conscious users who want full ownership of their profile page without giving their data to anyone else.
Own your presence. Host your own link page.
- Drag-and-drop builder — Visually arrange 7 block types (links, headers, embeds, social icons, forms, vCards, locations) with live preview.
- 7 built-in themes — Choose from curated presets with full color customization and social icon shape control per-theme.
- Analytics dashboard — Track page views and link clicks with privacy-first data collection.
- Connections inbox — Receive visitor contact form messages directly in the admin panel with read/unread management and optional CAPTCHA.
- Apple Wallet pass — Generate and distribute a digital business
card as a
.pkpassfile. - vCard export — Let visitors download your contact details as
a standard
.vcffile. - Location block — Embed an Apple Maps or Google Maps tile showing your physical address.
- Backup and restore — Export all settings, blocks, and data to JSON and re-import at any time (replace or merge modes).
- LinkStack import — Migrate your existing LinkStack profile directly into LinkDen with one click.
- Whitelabel ready — Fully allowed. Replace all LinkDen branding with your own logo, colors, and name. Consent banner included.
- 100+ social networks — Built-in branded icons and links for every major platform.
- Edge-cached — Served from Cloudflare's global network for near-zero-latency response times.
- Secure — Registration lock, XSS protection, CSRF safety, Cloudflare rate limiting, and secret masking baked in.
Full documentation is available in the docs site included in this
repo under apps/docs. Run it locally with bun dev:docs and open
http://localhost:3002.
Quick start:
- Clone the repository and install dependencies:
git clone https://github.com/MrDemonWolf/linkden.git cd linkden bun install - Copy the example environment file and fill in your values:
cp .env.example .env
- Generate and push the database schema:
bun db:generate bun db:push
- Start all apps:
bun dev
- Open
http://localhost:3001/admin/setupto create your admin account.
Once running, the following local URLs are available:
| Service | URL |
|---|---|
| Public page | http://localhost:3001 |
| Admin panel | http://localhost:3001/admin |
| API | http://localhost:3000 |
| Docs site | http://localhost:3002 |
The setup wizard at /admin/setup walks through account creation,
profile configuration, and theme selection. After setup, all content
is managed from the admin panel.
| Layer | Technology |
|---|---|
| Frontend | Next.js 16, React 19, Tailwind CSS v4, Radix UI |
| Backend | Hono, tRPC v11, Cloudflare Workers |
| Database | Drizzle ORM, Cloudflare D1 (SQLite) |
| Auth | Better Auth (email/password, 2FA, magic link) |
| Storage | Cloudflare R2 |
| Build system | Bun 1.3.10, Turborepo |
| Testing | Vitest, @testing-library/react |
| Deployment | Cloudflare Workers + Pages (primary), Docker (secondary) |
- Bun v1.3.10 or later
- Wrangler CLI for local Cloudflare Workers emulation
- A Cloudflare account (free tier works for local development)
- Install dependencies:
bun install
- Configure environment variables:
# apps/server/.env BETTER_AUTH_SECRET=your-secret-here # openssl rand -base64 32 BETTER_AUTH_URL=http://localhost:3000 CORS_ORIGIN=http://localhost:3001 # apps/web/.env NEXT_PUBLIC_SERVER_URL=http://localhost:3000
- Generate and push the database schema:
bun db:generate bun db:push
- Start all apps:
bun dev
bun dev— Start all apps (web :3001, server :3000, docs :3002)bun dev:web— Start the Next.js frontend onlybun dev:server— Start the Cloudflare Workers API onlybun dev:docs— Start the documentation site onlybun build— Build all apps and packagesbun check-types— TypeScript type checks across the monorepobun test— Run the test suite with Vitestbun test:watch— Run tests in watch modebun db:generate— Generate a Drizzle migration from schema changesbun db:push— Push the current schema to the local D1 databasebun db:reset— Wipe the local database state (.wrangler/state)bun reset:password— Reset the admin account password via CLIbun reset:factory— Factory-reset all data and settingsbun ship— Build and deploy to Cloudflare via Alchemy IaCbun destroy— Tear down all Cloudflare infrastructure
- Biome — Linting and formatting across all packages
- TypeScript — Strict mode enabled in every workspace
- Zod — Runtime validation on all API inputs and environment variables
- Drizzle ORM — Type-safe queries with no raw SQL exposure
linkden/
├── apps/
│ ├── web/ # Next.js frontend (public page + admin panel)
│ ├── server/ # Hono API on Cloudflare Workers
│ └── docs/ # Fumadocs documentation site
├── packages/
│ ├── api/ # tRPC router definitions
│ ├── auth/ # Better Auth configuration
│ ├── config/ # Shared TypeScript configuration
│ ├── db/ # Drizzle ORM schema, migrations, D1 client
│ ├── email/ # React Email templates
│ ├── env/ # Shared environment variable validation
│ ├── infra/ # Alchemy IaC for Cloudflare deployment
│ ├── ui/ # UI component library (Radix + CVA + Tailwind)
│ └── validators/ # Shared Zod validation schemas
├── scripts/ # CLI utilities (reset-password, factory-reset)
├── docs/ # Compliance reports (GDPR, ISO 27001)
└── package.json # Root workspace config (Bun + Turborepo)
MIT — fork it, run it, make it your own. Whitelabeling is fully allowed.
Have a question or found a bug?
Made with love by MrDemonWolf, Inc.