A free, open-source, self-hostable link-in-bio & portfolio page builder. One page for all your links, projects, gallery, and embedded video and audio — RTL-first, with full Arabic, French, and English support, served as fast, self-contained static HTML.
ownz is a self-hosted alternative to Linktree, Carrd, and Bio.link. You own the data, the domain, and the page.
Try it live → ownz.net runs a hosted version — the quickest way to see it in action. Prefer to run your own? Read on.
The drag-and-drop editor with a live preview, and every content block at your fingertips:
- Link-in-bio & portfolio in one page — links, project cards, a gallery, and rich embeds, all on a single shareable URL.
- RTL-first & multilingual — first-class Arabic, French, and English, with right-to-left layouts done properly rather than bolted on.
- Rich media — embed video and audio, show off a gallery, and highlight your best projects.
- Render-on-save static output — your page is compiled to self-contained static HTML, so it loads fast and stays up under traffic.
- Single-tenant & private by default — one owner per install, no public signup, no third-party trackers.
- Self-hosted fonts — no external CDN calls, better privacy, and consistent typography offline.
- Storage limits you control — cap uploads with a single env var, or leave it unlimited.
- Optional branding footer — keep or hide the small "Made with ownz" link.
- Modern, boring-in-a-good-way stack — TypeScript end to end, PostgreSQL, and a React dashboard.
The fastest way to run ownz is with Docker Compose, which brings up PostgreSQL and the app together.
# 1. Clone the repo
git clone https://github.com/ownz-network/ownz.git
cd ownz
# 2. Create your env file
cp .env.example .env
# 3. Generate a session secret and paste it into .env
openssl rand -base64 32Open .env and set at least:
OWNER_EMAIL— the email you'll log in withOWNER_PASSWORD— a strong password for the owner accountSESSION_SECRET— the value you generated above
Then start everything:
docker compose up -dOpen http://localhost:3000, log in with your OWNER_EMAIL / OWNER_PASSWORD, and start building your page. The owner account is provisioned automatically on first boot from your .env.
Requires Node.js 20+ and a reachable PostgreSQL instance (set DATABASE_URL in .env).
# Install workspace dependencies (shared / server / web)
npm install
# Push the Drizzle schema to your database
npm run db:push
# Start the server + dashboard in dev mode from the repo root
npm run devThe API server runs on PORT (default 3000). The Vite dashboard dev server runs separately with hot-module reload:
# In the web workspace
npm run dev --workspace webThis is an npm-workspaces monorepo with three packages:
shared— types and validation shared between server and webserver— Node + Hono API, Drizzle ORM, Better-Authweb— the React + Vite + Tailwind CSS v4 dashboard
Every setting is an environment variable. Copy .env.example to .env and adjust.
| Variable | Description | Default |
|---|---|---|
DATABASE_URL |
PostgreSQL connection string. | postgres://ownz:ownz@localhost:5432/ownz |
SESSION_SECRET |
Random string (32+ chars) used to sign sessions. | none — required |
APP_URL |
Public URL the install is served from. | http://localhost:3000 |
OWNER_EMAIL |
Email for the single owner account, provisioned on first boot. | none — required |
OWNER_PASSWORD |
Password for the owner account, provisioned on first boot. | none — required |
OWNER_NAME |
Display name for the owner. | Owner |
PORT |
Port the server listens on. | 3000 |
STORAGE_LIMIT_MB |
Upload storage cap in megabytes. 0 means unlimited. |
0 |
SHOW_BRANDING |
Show the small "Made with ownz" footer link (true/false). |
true |
ownz is single-tenant: one install serves exactly one owner and one portfolio page. There is no public signup — the owner's credentials come from .env and are provisioned the first time the app boots.
The dashboard is a React editor that talks to a Hono API backed by PostgreSQL through Drizzle ORM, with authentication handled by Better-Auth. Every time you save, the page is rendered to static, self-contained HTML — no per-request database hits on the public page, so it stays fast and cheap to serve, even under a spike of traffic. Fonts are self-hosted and there are no third-party trackers, so visitors aren't leaked to anyone.
Don't want to self-host? Try the managed version at ownz.net — it's the easiest way to try ownz and the quickest path to a live page. Same builder, none of the ops.
Contributions are welcome — bug reports, features, translations, and docs. See CONTRIBUTING.md to get started.
Found a vulnerability? Please report it responsibly. See SECURITY.md for how to disclose privately.
ownz is licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later). See LICENSE for the full text. If you run a modified version as a network service, the AGPL requires you to make your source available to its users.
Keywords: link-in-bio, linktree alternative, open source portfolio builder, self-hosted bio page, carrd alternative, bio.link alternative, personal landing page, RTL portfolio, Arabic link in bio, static site portfolio, TypeScript, Hono, Drizzle ORM, PostgreSQL, React, Tailwind CSS.
Topics: link-in-bio · linktree-alternative · portfolio · self-hosted · open-source · rtl · typescript · hono · drizzle · postgresql · react · tailwindcss

