Skip to content

DZBuild-com/ownz

 
 

Repository files navigation

ownz

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.

License: AGPL-3.0 PRs Welcome Built with TypeScript Node PostgreSQL

Try it live → ownz.net runs a hosted version — the quickest way to see it in action. Prefer to run your own? Read on.


📸 Screenshots

The drag-and-drop editor with a live preview, and every content block at your fingertips:

Add a block

The ownz editor

✨ Features

  • 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.

🚀 Quick start (Docker)

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 32

Open .env and set at least:

  • OWNER_EMAIL — the email you'll log in with
  • OWNER_PASSWORD — a strong password for the owner account
  • SESSION_SECRET — the value you generated above

Then start everything:

docker compose up -d

Open 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.

🛠 Local development

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 dev

The 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 web

This is an npm-workspaces monorepo with three packages:

  • shared — types and validation shared between server and web
  • server — Node + Hono API, Drizzle ORM, Better-Auth
  • web — the React + Vite + Tailwind CSS v4 dashboard

⚙️ Configuration

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

🧩 How it works

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.

☁️ Hosted version

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.

🤝 Contributing

Contributions are welcome — bug reports, features, translations, and docs. See CONTRIBUTING.md to get started.

🔒 Security

Found a vulnerability? Please report it responsibly. See SECURITY.md for how to disclose privately.

📄 License

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

About

Free, open-source, self-hostable link-in-bio & portfolio page builder. A self-hosted Linktree / Carrd alternative — RTL-first, multilingual, static-fast.

Resources

License

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • TypeScript 98.8%
  • Other 1.2%