v1.0.1 — Multi-groups, sections, file attachments & mobile polish
LinkPage v1.0.1 — Multi-groups, sections, file attachments & mobile polish
A big update focused on organization, access control, and mobile UX.
Highlights
- Multiple groups per link — assign a link to as many groups as needed via a checkbox multi-select in the link modal.
- Sections within groups — add, rename, reorder, and delete named section headings inside any group; cards render grouped by section in the public grid.
- File attachments — link cards can now point to an uploaded file (PDF, Office docs, archives, images, text) instead of a URL. 25 MB cap, safe-extension whitelist, and a URL/File toggle in the modal.
- Password-protected groups — gate sensitive groups with a password. Unlock state uses HMAC-signed cookies with a 30 s auto-relock; links also published in a public group stay visible.
- Hide links from the public page — keep a link in the admin without exposing it. Eye-toggle on every card, enforced by both /api/links and /r/:id.
- Custom group colors — pick any color via a "+" swatch that opens the native color picker.
- Pinned default group — choose which group the public page opens on (Settings → Public Access → Default Group).
- Custom browser-tab favicon — upload your own .ico / .png favicon from Settings → Branding.
- Long-press to bulk-select — press-and-hold (450 ms) any card on touch or mouse to enter selection mode, with iOS-style scale + ring feedback and a light haptic tap on supported devices. New Hide / Show buttons in the bulk toolbar.
Mobile UI
- Slide-over sidebar, full-width modal sheetsompact phone header on both the public andadmin pages.
- Admin top bar collapses theme / settings / overflow menu on phones, so the search barfinally has room to breathe.
Polish - Admin sidebar redesign: hover actions fade in over the count badge instead of truncating group names; active state is clearly distinct from hover; a vertical-bar cons under their group.
- Unified card meta strip — group tags, "Hidden", "Dead link", and click-count chips now share the same baseline and spacing.
- Collapsible Changelog block in the admin sidebar, with a link to the GitHub repo.
Security & fixes - Auth rate limiter now only counts failed verifications, so refreshing the admin page no longer locks you out of your own session. Brute-force protection is preser
- Multer file-filter errors return a JSON 400 instead of an HTML 500.
- Inline section input has a once-guard so th double-creating duplicate sections.
Schema
- New tables: link_groups, sections.
- New columns: groups.password_hash, links.is_hidden, links.file_path, links.file_name, link_groups.section_id.
- Idempotent migration on first startup copielues into link_groups — no manual stepsrequired.
New API endpoints
POST/DELETE /api/settings/favicon · POST /api/settings/pinned-group · POST /api/links/:id/visibility · POST
/api/groups/:id/unlock · POST /api/groups/:idsections · PUT/DELETE /api/sections/:id · POST /api/sections/reorder
Upgrading
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up
Your existing data is migrated automatically