new-term-radar
Daily radar for new AI terms: names of new models, products and repos, caught on X, Hugging Face, GitHub and sitemaps before keyword tools list them.
Self-hosted link shortening application
Translation pending
MarketingTypeScript · ShellGitHub @tonyliuzjOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Link Guide is a modern, minimalistic URL shortener that transforms long links into concise, trackable URLs.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A modern, self-hosted URL shortener with advanced features including multiple redirect modes, password protection, custom pages, and Cloudflare Turnstile integration.Read the full README ↗A modern, self-hosted URL shortener with advanced features including multiple redirect modes, password protection, custom pages, and Cloudflare Turnstile integration.
For automated installation on Linux servers:
curl -fsSL --retry 5 --retry-delay 5 --retry-all-errors https://github.com/tonyliuzj/link-guide/releases/latest/download/link-guide.sh -o link-guide.sh && chmod +x link-guide.sh && bash link-guide.sh
The download is retried automatically because the file is briefly unavailable while a new version is being published.
This will download and run the installer, which supports both systemd and Docker deployments. Choose Docker install (Compose) in the installer to run the published Docker image.
The installer shows a menu: Install, Update, Start, Stop, Restart, Status, Logs and Uninstall.
Run the installer again and choose Update. It pulls the latest code, then:
Local edits to package-lock.json are discarded during an update. Any other locally modified file is stashed (not lost); restore it afterwards with git stash pop.
Always download a fresh link-guide.sh with the command above before updating, so you run the newest installer. Existing databases are migrated automatically on the next start.
The Docker image is published to Docker Hub for linux/amd64 and linux/arm64:
tonyliuzj/link-guide:latest
tonyliuzj/link-guide:<commit-sha>
A new image is published after every push to main, once lint, type checking and tests pass.
docker run -d \
--name link-guide \
--restart unless-stopped \
-p 3000:3000 \
-v link-guide-data:/app/data \
-e SESSION_PASSWORD="$(openssl rand -base64 32)" \
-e AUTH_TRUST_HOST=true \
-e DATABASE_URL=/app/data/link-guide.sqlite \
tonyliuzj/link-guide:latest
Visit http://localhost:3000/setup after the container starts.
git clone https://github.com/tonyliuzj/link-guide.git
cd link-guide
cp example.env.local .env.local
Edit .env.local for Docker (see Environment variables for everything you can set, including SMTP):
SESSION_PASSWORD=replace-with-openssl-rand-base64-32
AUTH_TRUST_HOST=true
DATABASE_URL=/app/data/link-guide.sqlite
PORT=3000
Optional Compose settings go in .env:
HOST_PORT=3000
CONTAINER_PORT=3000
DOCKER_IMAGE=tonyliuzj/link-guide:latest
Start with the Docker Hub image:
docker compose pull
docker compose up -d --no-build
Or build locally from the checkout:
docker compose build
docker compose up -d --no-build
To update later, run docker compose pull && docker compose up -d --no-build again. The database lives in ./data, which is kept across updates.
Useful commands:
docker compose ps
docker compose logs -f
docker compose down
git clone https://github.com/tonyliuzj/link-guide.git
cd link-guide
npm install
Copy the example environment file and edit it:
cp example.env.local .env.local
Example .env.local:
SESSION_PASSWORD=your-random-32-character-secret-here
AUTH_TRUST_HOST=true
DATABASE_URL=./data/linkguide.db
PORT=3000
Generate a session secret with openssl rand -base64 32. All options are listed under Environment variables.
npm run build
Development mode:
npm run dev
Production mode:
npm start
http://localhost:3000/setup/)The app will create the database automatically if it doesn't exist.
| Variable | Required | Description |
|---|---|---|
SESSION_PASSWORD | Yes | Random secret used to sign sessions. Generate with openssl rand -base64 32. |
AUTH_TRUST_HOST | Recommended | Set to true behind reverse proxies, custom domains and production hosts. Host trust is on by default unless this is explicitly false. |
DATABASE_URL | No | SQLite file path. Default ./data/linkguide.db (the installer and Docker use link-guide.sqlite). |
PORT | No | Server port. Default 3000. |
APP_URL | No | Public base URL used in emailed links. Defaults to the site domain from settings. |
SMTP_HOST | For email | SMTP server. Email features turn on when SMTP_HOST and SMTP_FROM are both set. |
SMTP_FROM | For email | Sender address, for example LinkGuide <[email protected]>. |
SMTP_PORT | No | Default 587. |
SMTP_USER, SMTP_PASSWORD | No | Credentials, if your server requires login. |
SMTP_SECURE | No | true for implicit TLS, false for STARTTLS. Defaults to true only on port 465. |
If deploying behind nginx, add these headers to your proxy configuration:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Client IPs (used for rate limiting and click stats) are read from CF-Connecting-IP, X-Real-IP, or the last X-Forwarded-For entry, so run the app behind a proxy that sets one of them.
Set the SMTP variables above in .env.local to enable:
Under Settings → Email, admins can see whether SMTP is configured and send a test message to themselves. This is the quickest way to check your SMTP settings; when sending fails the message includes a hint if SMTP_SECURE looks wrong.
Under Settings → Backup & Restore, admins can download a snapshot of the whole database and restore one from a file. A restore replaces all current data in place, signs everyone out, and saves the previous contents next to the database as <database file>.pre-restore. Backups from older versions restore too; columns they lack take their defaults. Backups contain password hashes and Turnstile secret keys, so store them privately.
Settings also has Keep click statistics for (days); older click records are deleted automatically (0 keeps everything). Each link's edit page has an Export clicks (CSV) button.
Cloudflare Turnstile is configured per-domain in the dashboard (not in .env):
Site-wide Turnstile (guest link creation, login and signup) is configured under Settings.
Manage domains in Dashboard > Domains:
Admin users can manage users in Dashboard > Users:
Emails are case-insensitive. Demoting or deleting a user takes effect immediately, even for sessions that are already signed in.
Prevent specific short codes in Dashboard > Blacklist. Application routes such as login, signup, api, forgot-password, reset-password and verify-email are reserved by default.
X-Content-Type-Options, Referrer-Policy and X-Frame-Options.npm audit to check.LinkGuide uses SQLite with automatic initialization and migrations. The database and data/ directory are created automatically on first run.
address already in use when starting Docker: if the app was previously installed directly, the installer stops and disables its systemd service first (both modes use the same data/ folder, so nothing is lost) and retries if the old container is still releasing the port. If something else is using the port, the installer prints the process and its PID. Stop it or change HOST_PORT in .env.SMTP_SECURE and the port.npm run dev # start the dev server
npm test # unit and route tests (vitest, uses a temporary SQLite database)
npm run lint
npx tsc --noEmit
GitHub Actions runs lint, typecheck and tests before every Docker image publish, and on pull requests.
MIT