Releases: Tomasneto404/linkPage
Release list
v1.0.3 — File editor, audit log, stock icons & more
LinkPage v1.0.3 — a big release focused on power-user editing, observability, and polish.
Highlights
- In-place file editor — edit attached text files (HTML, XML, JSON, TXT, CSV, MD, SVG) right in the admin: expand view, line numbers, language-aware syntax highlighting, a Ctrl/Cmd+F find bar, and Ctrl/Cmd+S to save. Changes go live on the public page immediately.
- Stock icon picker + colours — choose from a built-in line-icon set and a colour instead of uploading an image. File links get a coloured file-type icon, and links with no icon fall back to the Settings favicon.
- Admin audit log — every admin change and every link click is recorded with the entity's name, time, IP and device. Live auto-refresh, search & type filters, and CSV/JSON export, under Settings → Security → View Log.
- Subsections — sections can now contain one level of subsections. Add and drag-reorder them in the sidebar; the public page renders the nesting, and you can drop a link straight into a subsection.
Admin
- Redesigned link cards — a cleaner, premium card: icon + title header, description, tags, and a footer with views + date; action buttons reveal smoothly on hover.
- Smarter bulk editing — shift-click to select ranges, Select all, Esc to deselect, and move the selection into a specific section/subsection. Drag a link card onto any group, section, or subsection in the sidebar to move it.
- Icon library: export / import / bulk delete — export the whole library as a single file and import it elsewhere (idempotent, de-duped by content); multi-select to delete in bulk. The Settings favicon now appears in the library for reuse.
- In-app update checker — Settings → About shows the current build, the latest GitHub release, and its notes; a pulsing dot on the Changelog pill flags when an update is available.
Public page
- Multi-keyword search — pin keywords as chips (press Enter), combined with AND, matching link names, URLs, groups, sections and subsections.
- Copy link button — one-click copy on every card with a toast confirmation.
- Per-group unlock behaviour — password-protected groups can auto-lock after 30 s (kiosk-safe) or stay unlocked for the whole browser session.
- Default link icon falls back to the Settings favicon when nothing else is available.
Backend
- Versioned database migrations — transactional, version-tracked migrations run on every startup and log what changed, so upgrading from any past version is safe and automatic.
- Faster saves — favicon fetching no longer blocks saving a link; it loads in the background (with an overall time budget) and appears live via Server-Sent Events. TLS verification is skipped for intranet hosts, with a smarter fallback walk.
- Full export / import of links, groups, sections and subsections (idempotent re-import).
New API endpoints
/api/audit (+ /export), /api/icons/export, /api/icons/import, /api/icons/bulk-delete, /api/links/:id/file (GET/PUT), /api/favicon-preview, /api/version, /api/events (SSE).
🐳 Docker users: docker compose pull && docker compose up -d (or rebuild from source). The database schema migrates automatically on startup.
v1.0.2 — Icon library, live updates & smarter favicons
Highlights
- In-app update checker — Settings → About → "Check for updates" polls GitHub Releases (cached 6 h) and shows the current build, latest available, and release notes in a popup. A pulsing dot on the sidebar Changelog pill also
flags new versions. - Reusable icon library — every uploaded icon is added to a shared, searchable library; pick from it when creating/editing a link, manage and delete unused icons, optionally auto-save fetched favicons.
- Live updates on the public page — Server-Sent Events stream fade-refreshes opened tabs within ~250 ms of any admin mutation (debounced, transition-aware, reconnect on drop).
- Smarter favicon fetching — three-tier strategy (HTML
<link rel="icon">→/favicon.ico→ Google) so intranet URLs resolve correctly. Live preview in the link form uses the same fetcher. - Drag-to-reorder sections within a group (admin sidebar → public page).
- Remember last viewed group on the public page; the admin-configured default only applies to brand-new visitors.
- HTML / XML / JSON attachments + raised attachment cap from 25 MB to 100 MB.
- Logo links to the public page from both admin and public headers.
Stability & infrastructure
- Versioned database migrations — transactional, idempotent, version-tracked. Any past version upgrades cleanly with a clear log line on startup.
- Settings modal caps at viewport height and scrolls internally — close button stays reachable on small screens.
- Fix: icon bleeding between consecutive link edits — uploading an icon for link A no longer reappears on link B if you edit it right after.
New API endpoints
GET /api/events— public Server-Sent Events stream for live updatesGET /api/version— current vs latest GitHub release (admin)GET /api/favicon-preview— server-side favicon fetch used by the live preview (admin)GET/POST /api/icons,DELETE /api/icons/:id— icon libraryPOST /api/settings/save-favicons— toggle library auto-save
Configuration
- New env var
RELEASES_REPO(defaultTomasneto404/linkPage) — point the update checker at a fork or private mirror.
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