Skip to content

Releases: toineenzo/YOURLS-Link-Front-Page

v2.3.9 — PHPUnit unit tests + usage-focused README

Choose a tag to compare

@toineenzo toineenzo released this 26 Apr 22:00

A test-infrastructure and documentation release. No functional plugin changes — runtime behavior is identical to v2.3.8.

What changed

  • PHPUnit unit-test suite added via YOURLS-test-suite-for-plugins. Covers helpers, hooks, defaults, and the vCard generator. Pinned to PHPUnit v10 with PSR-4 file naming and a repo-local phpunit.xml.
  • CI now runs PHPUnit on every push (alongside the existing Playwright e2e matrix), and uses runner-provided mysqladmin for DB readiness checks.
  • README rewritten to be usage-focused — quickstart, screenshots, configuration, and feature list lead. Dev / CI / contribution notes moved further down.

Install / upgrade

Same layout as v2.3.8 — the install zip wraps everything in a Link-Front-Page/ folder.

cd /path/to/yourls/user/plugins
unzip /path/to/YOURLS-Link-Front-Page-v2.3.9.zip

Settings persist across upgrades (stored in YOURLS options, not the plugin folder). After swapping files you may need to reactivate the plugin once via Manage Plugins → Activate.

Assets

Two zips, built and uploaded by the release-test workflow once the e2e + Sleeky matrix passes:

File Use for
YOURLS-Link-Front-Page-v2.3.9.zip Production installs (runtime files only)
YOURLS-Link-Front-Page-v2.3.9-debug.zip Reproducing CI runs / contributing (full repo snapshot)

Full changelog: v2.3.8…v2.3.9

v2.3.8 — Repackaged install zip + Sleeky-tested CI

Choose a tag to compare

@toineenzo toineenzo released this 26 Apr 20:34

A maintenance release focused on packaging and CI hygiene. No functional changes to the plugin itself.

⚠️ Heads-up — install folder renamed

To make installs match the zip's contents, the install directory is now user/plugins/Link-Front-Page/ instead of user/plugins/yourls-link-front-page/. If you are upgrading from v2.3.7 or earlier:

cd /path/to/yourls/user/plugins
rm -rf yourls-link-front-page         # old folder
unzip /path/to/YOURLS-Link-Front-Page-v2.3.8.zip

Settings persist (they live in YOURLS options, not the folder). After the swap you will need to reactivate the plugin once via Manage Plugins → Activate.

📦 New zip layout

Every release now ships two assets:

File What it is Use for
YOURLS-Link-Front-Page-v2.3.8.zip Install-ready. Contains only the runtime files (plugin.php, assets/, includes/, views/, uploads/ scaffold, README, LICENSE) wrapped in a Link-Front-Page/ folder. Production installs
YOURLS-Link-Front-Page-v2.3.8-debug.zip Full repo snapshot (test suite, Docker compose, GitHub Actions workflow), wrapped in the same Link-Front-Page/ folder. Reproducing CI runs locally, contributing

The CI workflow extracts the debug zip and mounts it as the plugin source for the Playwright e2e suite, so what we test is byte-for-byte what we ship.

🛠 CI / infra

  • Sleeky compatibility verified — the release-test workflow now runs the suite twice via a strategy matrix: once against vanilla YOURLS admin, once with Flynntes/Sleeky's Sleeky-backend theme installed and active.
  • The release-test workflow is triggered on every published release and uploads both zips as release assets via gh release upload --clobber.
  • actions/checkout@v6, actions/setup-node@v6, actions/upload-artifact@v7 — all on natively-Node-24 versions, no force-flag warning.
  • YOURLS test environment built on php:8.4-apache with YOURLS 1.10.2 + composer install. The upstream yourls:* images ship PHP 8.5 which reset connections on Ubuntu 24 runners.
  • Network plumbing pinned to IPv4 (127.0.0.1 everywhere) — GitHub-hosted runners' default localhost resolution preferred IPv6, which Docker port publishing does not cover.

⬇️ Installation

cd /path/to/yourls/user/plugins
unzip /path/to/YOURLS-Link-Front-Page-v2.3.8.zip

…or pull from git into a directory called Link-Front-Page:

git clone https://github.com/toineenzo/YOURLS-Link-Front-Page.git Link-Front-Page

Full changelog: v2.3.7…v2.3.8

v2.3.7 — Automated e2e test suite (Playwright + YOURLS Docker)

Choose a tag to compare

@toineenzo toineenzo released this 26 Apr 18:27

A maintenance release that introduces an automated end-to-end test suite. No user-facing changes — the plugin behaviour is identical to v2.3.6.

🧪 What's new

CI test workflow

A new GitHub Actions workflow at .github/workflows/release-test.yml runs on every published release (and on relevant pull requests). It:

  1. Spins up a YOURLS Docker container (yourls:latest) with MariaDB 11 alongside.
  2. Mounts the plugin source at /var/www/html/user/plugins/yourls-link-front-page.
  3. Runs the YOURLS installer, logs in as admin, activates Link Front Page.
  4. Drives the admin and the public page with Playwright (Chromium, headless).
  5. Uploads the HTML report, traces and Docker logs as artifacts on failure.

Coverage

Six spec files exercise the surfaces most likely to regress:

Spec Covers
01-yourls-base YOURLS still works with the plugin active — admin link table, plugins page, shortlink redirect (catches the v2.3.1 TypeError-style regression)
02-plugin-admin Plugin settings page loads, all four tabs (Links / Image grid / General / Appearance) switch without JS errors
03-links Custom URL link with favicon-button image + description, YOURLS shortlink picked from the picker with an uploaded image, and a category with title + description + image
04-image-grid Bulk-upload of 6 tiles, half pointing at custom URLs and half at YOURLS shortlinks, each title-visibility mode (always / hover / never) tested on both source types — including a real hover() to verify the CSS transition fades the overlay in
05-settings General tab persists site_title + site_description; Appearance tab persists background_color and surfaces it as the --lfp-bg CSS variable
06-about-footer About-me toggle + photo + text, Personal contact card with vCard download + inline rendering, Business vCard download without inline, and the Footer customisation (login link off, Powered-by override, custom HTML)

Failure detection

Every spec runs through a fixture that fails the test if it sees:

  • An HTTP 5xx on any non-image response.
  • An uncaught JavaScript error in the page.
  • A PHP error pattern in the rendered HTML — Fatal error, Parse error, Uncaught Error/TypeError/ValueError/ArgumentCountError, or Stack trace:.
  • A Warning / Notice that mentions yourls-link-front-page (i.e. caused by this plugin specifically — upstream YOURLS noise is intentionally ignored).

So the suite verifies both the plugin works and the plugin doesn't break YOURLS.

⬇️ Installation

cd /path/to/yourls/user/plugins
rm -rf yourls-link-front-page
unzip /path/to/YOURLS-Link-Front-Page-2.3.7.zip

…or git pull. No database changes, no settings migration.

Full changelog: v2.3.6…v2.3.7

v2.3.6 — Light theme by default; vanilla YOURLS readability fix

Choose a tag to compare

@toineenzo toineenzo released this 26 Apr 01:57

A small but important readability fix for anyone running the plugin on a vanilla YOURLS install (no Sleeky-backend).

🐛 Fix

Settings page was unreadable without Sleeky

The settings UI was hard-coded to a dark surface (#1f2937 backgrounds, light text) so dark-on-dark inputs lined up cleanly with Sleeky-backend's dark theme. On a vanilla YOURLS admin (white page), the same dark inputs and dark cards looked broken — barely-legible label text bleeding into the page background, dark input boxes you couldn't see your typing in.

Fix: invert the default. The token block at the top of admin.css now holds the light palette (#fff backgrounds, #111827 text), which is what vanilla YOURLS needs. A new .lfp-theme-dark scope re-applies the dark palette only when admin.js spots Sleeky-backend's <meta name="sleeky_theme" content="dark"> on the admin page and tags <html> with that class.

Result

Setup Theme
Vanilla YOURLS Light (matches white admin)
Sleeky-backend with dark Dark
Sleeky-backend with light Light
No Sleeky but browser in dark mode Light (matches what YOURLS itself is rendering)

The surface now always tracks whatever YOURLS chrome is actually being shown around the plugin page, instead of assuming dark-on-dark.

⬇️ Installation

cd /path/to/yourls/user/plugins
rm -rf yourls-link-front-page
unzip /path/to/YOURLS-Link-Front-Page-2.3.6.zip

…or git pull. No database changes.

Full changelog: v2.3.5…v2.3.6

v2.3.5 — Custom URL link layout fixes & object-fit on uncropped images

Choose a tag to compare

@toineenzo toineenzo released this 26 Apr 01:37

A small patch on top of v2.3.4. Four user-visible fixes around the new custom-URL link items, the rounded-vs-square logo / About-me photo, and the footer link target.

🐛 Fixes

Custom URL link without a title rendered broken

When you added a custom-URL link and left the Custom title field empty, the card on the public page fell apart — empty title slot, an underlined URL bleeding into the card body, the chevron arrow on its own line. Cause: the title fallback was the raw URL, and Parsedown auto-linked https://... into a nested <a> inside the outer link card, which browsers handle poorly.

Both resolve paths (URL source and YOURLS shortlink source) now derive a clean hostname (without www.) as the fallback title, so Parsedown sees google.com instead of https://www.google.com and leaves it as plain text. The card layout stays intact.

Custom-title hint copy is now source-specific

Instead of the generic (optional — falls back to YOURLS link title or the URL) line, each link item shows the right hint for its source:

  • Custom URL items: (optional — falls back to the destination domain)
  • YOURLS shortlink items: (optional — falls back to the YOURLS link title)

JS swaps the hint in renderItem() based on item.source.

Logo / About-me photo cropped even with circular mask off

object-fit: cover was hard-coded on both images, so a portrait photo got its top and bottom shaved off even when the circular mask was disabled. Two new CSS variables — --lfp-logo-fit and --lfp-photo-fit — resolve to:

  • cover when the Round toggle is on (centered crop into the circle, the obvious behaviour)
  • contain when it's off (full image visible inside the rounded square, no cropping)

Footer "Powered by" anchor ignored the new-tab toggle

The Login link, link cards, and image-grid tiles all respect General → Open all links from the homepage in a new tab. The Powered-by anchor next to it didn't. It does now — picks up the same $link_target_attr / $link_rel_attr the other links use.

⬇️ Installation

cd /path/to/yourls/user/plugins
rm -rf yourls-link-front-page
unzip /path/to/YOURLS-Link-Front-Page-2.3.5.zip

…or git pull. No database changes.

Full changelog: v2.3.4…v2.3.5

v2.3.4 — Inline contact info & favicon button on link items

Choose a tag to compare

@toineenzo toineenzo released this 26 Apr 01:19

A small patch on top of v2.3.3 with two admin-side conveniences requested by the user.

✨ New

Inline contact info on the public page

Each contact tab (Personal and Business) now has a second toggle: "Also show these details inline on the public page".

When enabled, the About-me block renders a styled <dl class="lfp-contact-info"> card next to the existing VCF download button(s) showing:

  • Name (heading)
  • Phone — clickable tel: link
  • Email — clickable mailto: link
  • Website — opens in a new tab
  • Address — preserves line breaks

The toggle is independent from the existing Save contact download toggle, so you can:

  • Show inline only (no download button)
  • Download only (no inline card)
  • Both (most common)

Favicon button on link items

A small globe icon button now sits to the left of the × clear button on every link item's image input — same circular 24×24 style, accent-blue hover instead of danger-red.

Click it and the image URL field is filled with the destination's favicon via https://www.google.com/s2/favicons?sz=128&domain=<domain> — same lookup as the JS faviconFor() helper used by + Add link. Works for both source types:

  • YOURLS shortlink items → uses the keyword's destination URL
  • Custom URL items → uses the URL field

Categories don't have a destination, so the favicon button removes itself from category rows. enhanceFileInputs() relocates both buttons (favicon then clear, rightmost) into the .lfp-fileinput row so they sit at the right edge of the file picker.

⬇️ Installation

cd /path/to/yourls/user/plugins
rm -rf yourls-link-front-page
unzip /path/to/YOURLS-Link-Front-Page-2.3.4.zip

…or git pull. No database changes — new keys (show_inline per contact card) default to false via array_merge on first read.

Full changelog: v2.3.3…v2.3.4

v2.3.3 — Custom URL links + 404 picker, terminology cleanup

Choose a tag to compare

@toineenzo toineenzo released this 26 Apr 01:05

A patch release that adds custom-URL items to the Links tab, fixes a couple of UX paper cuts, and aligns terminology across the settings page.

✨ New

Custom URL links

The Links toolbar now shows two add buttons:

  • + Add YOURLS shortlink — the existing flow. Opens the picker, pre-fills the favicon, item is bound to a YOURLS keyword and rides through yourls_link() so click stats keep incrementing.
  • + Add custom URL — creates an item that points directly at any URL you type. Useful for things you don't want to (or can't) shorten through YOURLS first. The editor expands immediately with the URL field focused.

Each link item now carries a source field (keyword | url) that drives storage and rendering. Existing items from earlier 2.x versions don't have one — they're transparently migrated to keyword on first read.

In the editor:

  • Shortlink items show their keyword plus a Change… button that re-opens the picker.
  • URL items show a Destination URL input.

Default source = YOURLS shortlink for new media-grid + social items

Adding a new image-grid tile or social-media button now starts with the YOURLS shortlink picker instead of a free-form URL. Most additions point at an existing shortlink so this saves the toggle.

🐛 Fixes

Quick-add favicon

The + quick-add button in the YOURLS link table (/admin/index.php) now seeds the new link with the same Google s2/favicons image the manual + Add link flow uses. Pulled both call sites onto a shared lfp_favicon_for_url() helper so they can't drift.

Terminology

Every user-facing YOURLS keyword label now reads YOURLS shortlink — image-grid dialog, social-row source select, internal comments. Matches the picker dialog title.

⬇️ Installation

cd /path/to/yourls/user/plugins
rm -rf yourls-link-front-page
unzip /path/to/YOURLS-Link-Front-Page-2.3.3.zip

…or git pull. No database changes — legacy items migrate transparently.

Full changelog: v2.3.2…v2.3.3

v2.3.2 — Favicons, image effects, About-me box & more polish

Choose a tag to compare

@toineenzo toineenzo released this 26 Apr 00:39

A polish patch on top of v2.3.1. Lots of small quality-of-life wins for the admin and a couple of new visual options for the public page.

No data migration needed; all new keys default sensibly via array_merge on first read.

✨ New

Favicons as default link image

Adding a link via + Add link now prefills the image with the favicon of the destination URL (Google's s2/favicons endpoint at sz=128). You can replace it with your own upload or paste a different URL at any time.

Always-visible Clear image button

Every image input across the settings — link items, category banners, site logo, browser favicon, About-me photo, background image — now has a red Clear image button next to the upload widget. One click empties the URL field, the file input and the thumb preview.

Open-in-new-tab toggle

New General → Open all links from the homepage in a new tab checkbox (default on). Frontend renders link cards and image-grid tiles with target=\"_blank\" rel=\"noopener noreferrer\" when enabled.

About-me section in a card box

The About-me block on the public page is now wrapped in the same card-style container the category boxes use — soft background, border, blur, rounded corners.

Per-image sizing & shape

The site logo and About-me photo each get their own controls in Appearance:

  • Site logo size (CSS length, default 96px)
  • Round site logo toggle (circular mask vs general border-radius)
  • Round About-me photo toggle
  • The existing About photo size field stays

Both images render through new --lfp-logo-radius / --lfp-photo-radius CSS variables that resolve to 999px when round, otherwise to the general border-radius value.

Separate browser favicon

New Browser favicon field in General with URL or upload. The frontend's <link rel=\"icon\"> uses the favicon when set and falls back to the Logo / avatar when empty.

Background image effects

Five new sliders in Appearance → Background image:

Field Range Effect
Blur CSS length Gaussian blur on the image only — text stays sharp
Brightness % 0–300 <100 darker, >100 brighter
Saturation % 0–300 0 = grayscale, 100 = original
Overlay color color Tint over the image
Overlay opacity % 0–100 0 = no tint

Implemented via two fixed pseudo-elements (body.has-lfp-bg::before for the picture + filter chain, ::after for the overlay color/alpha) so the filters only affect the picture and not the text content above it.

Tab order

The settings page tab strip is now Links → Image grid → General → Appearance so the three content tabs flow naturally before the design panel.

Live font preview always visible

The Live preview card now sits outside the source-specific blocks and updates for every font source: System (free-text font-family stack), Google Fonts (loads from fonts.googleapis.com on demand) and Custom upload (creates a temporary blob-URL @font-face from the file you just picked, or uses the saved font_custom_url).

⬇️ Installation

cd /path/to/yourls/user/plugins
rm -rf yourls-link-front-page
unzip /path/to/YOURLS-Link-Front-Page-2.3.2.zip

…or git pull if you cloned the repo. No database changes.

Full changelog: v2.3.1…v2.3.2

v2.3.1 — Hotfix: 500 on shortlink hits with the plugin enabled

Choose a tag to compare

@toineenzo toineenzo released this 26 Apr 00:10

A small but important hotfix on top of v2.3. Anyone running v2.x should upgrade — every shortlink visit was 500'ing as soon as the plugin was active.

🐛 Fix

TypeError on every shortlink visit

Visiting any short URL (https://your-yourls/<keyword>) returned an HTTP 500 with this PHP fatal in the error log:

Uncaught TypeError: lfp_handle_pre_load_template():
  Argument #1 ($request) must be of type string, array given,
  called in includes/functions-plugins.php on line 222
  and defined in user/plugins/yourls-link-front-page/plugin.php

YOURLS' yourls_do_action() always pushes its single payload onto an internal $args array before dispatching, so action callbacks receive a one-element array (['site']), not the bare scalar ('site'). Our lfp_handle_pre_load_template() and lfp_handle_loader_failed() were typed string $request and PHP 8.4 fatal'd on the type mismatch.

The bug was latent in the codebase since v1.0.1 (where the two extra hooks were added) and only became fatal because PHP 8.4 enforces argument types on internal callbacks more strictly than 8.0/8.1 did. v2.3.0 didn't change those handlers — the live site just happened to be on a PHP version that had only warned before.

How it's fixed

  • Both signatures are now mixed $request so PHP doesn't complain about the array.
  • A new lfp_unwrap_action_arg() helper peels the scalar back out of YOURLS' wrapper array (is_array($arg) ? $arg[0] ?? '' : (string) $arg) so the rest of the routing code keeps a plain string.

✅ Verified

URL Status
/ (homepage) 200 + X-LFP-Rendered: 1
/<keyword> (any shortlink) 301 redirect — works again
/login (configurable) 302 → /admin/
/contact.vcf?type=... 200 with vCard 3.0 (or 404 if no contact configured)

⬇️ Installation

cd /path/to/yourls/user/plugins
rm -rf yourls-link-front-page
unzip /path/to/YOURLS-Link-Front-Page-2.3.1.zip

…or git pull if you cloned the repo. No database changes.

Full changelog: v2.3.0…v2.3.1

v2.3.0 — Markdown / HTML, vCard contact cards & repo polish

Choose a tag to compare

@toineenzo toineenzo released this 25 Apr 23:53

A fairly chunky minor release. The settings page now speaks Markdown and HTML in every text field, the About-me block can attach a downloadable vCard for Personal and Business contacts, and the GitHub repo is freshly polished with a proper README, description and topics.

No data migration needed — drop in the new build (or git pull) and reload the admin.

✨ New

Markdown + HTML across every text field

Bundled Parsedown 1.7.4 (single-file, MIT) so you can drop **bold**, [link](url), lists, code spans, headings or raw HTML into:

  • Site title and tagline
  • Link titles and descriptions
  • Category titles and descriptions
  • About-me text
  • Image grid overlay titles

Two helpers — lfp_render_inline() for one-line surfaces, lfp_render_text() for multi-line — keep block elements out of inline contexts. The browser tab <title> and og:* meta tags strip back to plain text via strip_tags() so a <strong> doesn't leak into the tab.

The Custom footer HTML field already accepted raw HTML — that hasn't changed.

Contact cards & vCard download

The About-me block in the General tab gains a card with two inner tabs:

  • Personal — name, phone, email, website, address.
  • Business — same shape; the name doubles as the company in the generated vCard.

Each tab has an "Enable" toggle. When enabled, the public landing page shows a pill "Save personal contact" / "Save business contact" button. Clicking it hits a new endpoint, /contact.vcf?type=personal|business, which serves a vCard 3.0 file with proper RFC-6350 escaping and a Content-Disposition filename.

The phone / email / website fields can also be wired up as social-button platforms via the matching icons (Phone, Email, Website) added back in v1.1.

Footer link to GitHub

The plugin-page footer's Link Front Page vX.Y.Z label now links to https://github.com/toineenzo/YOURLS-Link-Front-Page in a new tab.

🐛 Fixes

  • Image-tile dialog wasn't toggling URL / keyword fields after the v2.2.1 rename. el.dataset.lfpIgBlock was missed by the bulk replace because dataset keys don't include the dashes. Now reads el.dataset.lfpImgridBlock.

📚 Repo polish

  • README rewritten with badges, demo link, full feature breakdown, file structure, storage shape and bundled-license attribution.
  • Repository description bumped to "Linktree-style homepage for YOURLS — link list, image grid, social buttons, contact cards, full design controls. PHP 8.4 compatible, no external runtime dependencies."
  • Homepage set to https://toine.click.
  • Topics: yourls, yourls-plugin, linktree, linktree-alternative, link-in-bio, url-shortener, self-hosted, php, php8, bio-link, vcard.

⬇️ Installation

cd /path/to/yourls/user/plugins
rm -rf yourls-link-front-page
unzip /path/to/YOURLS-Link-Front-Page-2.3.0.zip

…or git pull if you cloned the repo. No database changes.

Full changelog: v2.2.1…v2.3.0