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.
翻譯準備中
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Link Guide is a modern, minimalistic URL shortener that transforms long links into concise, trackable URLs.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A modern, self-hosted URL shortener with advanced features including multiple redirect modes, password protection, custom pages, and Cloudflare Turnstile integration.檢視完整 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