Getting Started
joe-links is a self-hosted "go links" service. It turns short, memorable slugs like go/slack or go/wiki into instant redirects to any URL.
Quick Start (Docker Compose)
The fastest way to run joe-links is with Docker Compose using the published image. No need to clone the repository.
- Create a project directory and add two files:
mkdir joe-links && cd joe-links
- Create a
docker-compose.yml:
services:
app:
image: ghcr.io/joestump/joe-links:latest
ports:
- "8080:8080"
env_file: .env
volumes:
- joe-data:/data
restart: unless-stopped
volumes:
joe-data:
- Create a
.envfile with your configuration:
# Database — SQLite (simplest, no extra services needed)
JOE_DB_DRIVER=sqlite3
JOE_DB_DSN=/data/joe-links.db
# OIDC Authentication (required — see provider examples below)
JOE_OIDC_ISSUER=
JOE_OIDC_CLIENT_ID=
JOE_OIDC_CLIENT_SECRET=
JOE_OIDC_REDIRECT_URL=https://go.example.com/auth/callback
# Admin — this email gets the admin role on first login
JOE_ADMIN_EMAIL=you@example.com
- Fill in the OIDC fields (see OIDC Setup below), then start the service:
docker compose up -d
- Visit
http://localhost:8080and sign in.
Add a Postgres service to your docker-compose.yml and update .env:
services:
app:
image: ghcr.io/joestump/joe-links:latest
ports:
- "8080:8080"
env_file: .env
volumes:
- joe-data:/data
depends_on:
- postgres
restart: unless-stopped
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: joe_links
POSTGRES_USER: joe
POSTGRES_PASSWORD: changeme
volumes:
- pg-data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
joe-data:
pg-data:
JOE_DB_DRIVER=postgres
JOE_DB_DSN=postgres://joe:changeme@postgres:5432/joe_links?sslmode=disable
OIDC Setup
joe-links requires an OpenID Connect provider for authentication. Below are examples for common providers.
Pocket ID
Pocket ID is a lightweight, self-hosted OIDC provider — perfect for homelabs that don't need a full-blown identity platform.
- In the Pocket ID admin UI, create a new OIDC Client.
- Set the callback URL to
https://your-domain.com/auth/callback. - Note the client ID and client secret.
- Set these environment variables:
JOE_OIDC_ISSUER=https://pocket-id.your-domain.com
JOE_OIDC_CLIENT_ID=your-pocket-id-client-id
JOE_OIDC_CLIENT_SECRET=your-pocket-id-client-secret
JOE_OIDC_REDIRECT_URL=https://your-domain.com/auth/callback
JOE_ADMIN_EMAIL=you@example.com
Google
- Go to the Google Cloud Console.
- Create a new OAuth 2.0 Client ID (Web application type).
- Add
https://your-domain.com/auth/callbackas an authorized redirect URI. - Set these environment variables:
JOE_OIDC_ISSUER=https://accounts.google.com
JOE_OIDC_CLIENT_ID=your-client-id.apps.googleusercontent.com
JOE_OIDC_CLIENT_SECRET=your-client-secret
JOE_OIDC_REDIRECT_URL=https://your-domain.com/auth/callback
JOE_ADMIN_EMAIL=you@example.com
Authentik
- In the Authentik admin UI, create a new OAuth2/OpenID Provider.
- Set the redirect URI to
https://your-domain.com/auth/callback. - Note the client ID and client secret from the provider settings.
- Set these environment variables:
JOE_OIDC_ISSUER=https://authentik.your-domain.com/application/o/joe-links/
JOE_OIDC_CLIENT_ID=your-authentik-client-id
JOE_OIDC_CLIENT_SECRET=your-authentik-client-secret
JOE_OIDC_REDIRECT_URL=https://your-domain.com/auth/callback
JOE_ADMIN_EMAIL=admin@your-domain.com
Any OpenID Connect provider works (Okta, Keycloak, Dex, etc.). You just need the issuer URL, client ID, and client secret. joe-links uses OIDC Discovery (/.well-known/openid-configuration) to find endpoints automatically.
Creating Your First Link
- Sign in at your joe-links instance.
- Click New Link from the dashboard.
- Enter a slug (e.g.,
slack) and the destination URL (e.g.,https://myteam.slack.com). - Click Create.
Now anyone on your network can visit http://go/slack and be redirected to Slack.
Browser Search Engine Shortcut
Set up a go keyword in your browser so you can type go/anything directly in the address bar.
Chrome / Chromium
- Open Settings > Search engine > Manage search engines and site search.
- Click Add under "Site search".
- Fill in:
- Search engine: joe-links
- Shortcut:
go - URL with %s in place of query:
http://your-server/%s
- Click Save.
Now type go/slack in Chrome's address bar and hit Enter.
Firefox
- Navigate to your joe-links instance (e.g.,
http://go/). - Right-click the address bar and select Add "joe-links".
- Go to Settings > Search > Search Shortcuts and set the keyword to
go.
Safari
Safari does not support custom search keywords natively. Use a DNS alias so that http://go/slug resolves directly to your joe-links server.
DNS Setup
For the go/ shortcut to work across your network, create a DNS entry that maps go to your joe-links server:
- Internal DNS / Pi-hole: Add an A record for
gopointing to your server's IP. /etc/hosts(single machine): Add192.168.1.100 go(replace with your server IP).- Split DNS: If your organization uses split-horizon DNS, add the
gorecord to the internal zone.