- Bun installed (latest stable)
- Git
git clone https://github.com/germondai/links
cd links
bun install
cp links.config.example.ts links.config.ts
# edit links.config.ts with your info, then:
bun devOpen http://localhost:3000.
Run bun dev -- --hostname 0.0.0.0 to test from a phone on the same network.
bun run build # prebuild (icons + font) → next build (OG image) → postbuild (extract-og)
bun run icons # regenerate favicon + PWA icons without a full buildprebuild runs two scripts in sequence:
scripts/generate-icons.ts- downloadsprofile.avatarand resizes it to favicon sizes usingsharp(bundled with Next.js, no extra install)scripts/generate-font.ts- readsappearance.fontfrom your config and writessrc/lib/_font.tswith a singlenext/font/googlecall for that font; Next.js downloads and self-hosts the font at build time
We use Biome for linting and formatting - no ESLint, no Prettier.
bun run check:write # auto-fix everything
bun run check # check only (CI mode)Husky runs check:write + bun test automatically on every commit.
Follow Conventional Commits:
| Prefix | Use for |
|---|---|
feat: |
New feature |
fix: |
Bug fix |
docs: |
Documentation only |
chore: |
Maintenance / deps |
refactor: |
Code restructure, no behaviour change |
| Prefix | Use for |
|---|---|
feat/ |
New features |
fix/ |
Bug fixes |
docs/ |
Documentation |
chore/ |
Maintenance |
- Fork the repo
- Create a branch from
dev(notmain) - Make your changes
- Run
bun run check:write && bun test - Open a PR targeting the
devbranch - Fill in the PR template
- Add the key to the
FontNameunion insrc/types/config.ts - Add a
FONT_FAMILYentry insrc/lib/font-meta.ts- map the key to the CSS font-family string (e.g.Space_Grotesk → 'Space Grotesk') - If the font is not variable (i.e. requires explicit weights), add a
WEIGHTSentry inscripts/generate-font.ts - Rebuild -
scripts/generate-font.tspicks up the new font key automatically - Update the fonts table in
README.md
- Add the key to the
Themeunion insrc/types/config.ts - Add a
ThemeTokensentry insrc/lib/themes.ts(from, via, to, accent, beam, particle) - Add the accent + bg colors to the
ACCENTS/BG_COLORSmaps inscripts/generate-icons.ts ALL_THEMESinsrc/components/dev/DevPanel.tsxpicks it up automatically viaObject.keys(THEMES)- Update the themes table in
README.md
- Add the platform key to the
SocialPlatformunion insrc/types/config.ts - Add a
PROVIDER_SLUGSentry insrc/components/profile/SocialIcons.tsxif the platform has a brand icon on icons.germondai.com, otherwise add a lucide fallback toFALLBACK_ICONSandLABELS - Add to
ALL_PLATFORMSinsrc/components/dev/DevPanel.tsx - Update the platforms table in
README.md
All contributions are licensed under AGPL-3.0. Every new source file must include the SPDX header:
// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2025 germondai - https://github.com/germondai