diff --git a/.env.example b/.env.example index af4090e..66ab8de 100644 --- a/.env.example +++ b/.env.example @@ -8,7 +8,6 @@ APP_HEALTHCHECK_TIMEOUT=5s APP_HEALTHCHECK_START_PERIOD=10s APP_HEALTHCHECK_RETRIES=3 LINKLOG_APP_NAME=LinkLog -LINKLOG_VERSION=0.1.1 LINKLOG_SECRET_KEY=replace-with-a-long-random-secret LINKLOG_DATA_ENCRYPTION_KEY=generate-with-python-cryptography-fernet-key LINKLOG_TOKEN_EXPIRY_MINUTES=15 @@ -27,6 +26,8 @@ LINKLOG_MASTODON_OAUTH_EXPIRY_MINUTES=10 LINKLOG_LOG_LEVEL=INFO # Optional comma-separated override. Leave empty to use the built-in list. LINKLOG_TRACKING_PARAMS= +# Comma-separated feed page sizes offered to users, first value is the default. Up to 5 values are used. +LINKLOG_FRONTEND_LOADPOSTS=25,100,250 # Keep the default path when using the named linklog_data volume. LINKLOG_DATABASE_PATH=/app/backend/data/linklog.db diff --git a/.github/skills/changelog-maintenance/SKILL.md b/.github/skills/changelog-maintenance/SKILL.md new file mode 100644 index 0000000..94ff08e --- /dev/null +++ b/.github/skills/changelog-maintenance/SKILL.md @@ -0,0 +1,27 @@ +--- +name: changelog-maintenance +description: "Use when: completing LinkLog work that changes user-facing behavior (features, fixes, UI/UX, configuration, API responses). Update CHANGELOG.MD's current unreleased version section, and bump frontend/version.json when the user explicitly requests a version bump or release." +--- + +# LinkLog Changelog Maintenance + +## Purpose + +`CHANGELOG.MD` is LinkLog's user-facing history of releases. Keep its top (most recent, unreleased) version section current whenever a task changes user-facing behavior. + +## Workflow + +1. Complete the user's requested work and its relevant validation first. +2. Decide if the change is changelog-worthy (see Scope below). Skip internal-only changes. +3. Open `CHANGELOG.MD` and find the topmost `## Version vX.Y.Z` section — this is the current unreleased version being accumulated. Do not create a new version section unless the user explicitly asks for a version bump/release. +4. Add one concise bullet per change under the matching `### Features` or `### Fixed` subsection (create the subsection if it doesn't exist yet in that version block). Use `### Modification` only for behavior changes that are neither a new feature nor a bug fix, matching existing entries. +5. Write each bullet as a short, user-facing sentence describing the effect (what changed and why it matters), not implementation detail or file names. +6. Do not edit, reorder, or remove bullets from older `## Version` sections. Only append to the current unreleased section. +7. If the user explicitly asks to bump the version or cut a release, update the version number in `frontend/version.json` (valid JSON, e.g. `{"version": "0.3.1"}`) to match the `## Version vX.Y.Z` heading, and start a new top section for subsequent changes. +8. Before finalizing, re-read `CHANGELOG.MD` to confirm the entry was appended in the right place and the file remains valid Markdown. + +## Scope + +Changelog-worthy: new features, bug fixes, UI/UX changes, configuration options, API/behavior changes visible to users or operators. + +Not changelog-worthy: internal refactors with no behavior change, test-only fixes, dev tooling/scripts, and documentation-only changes (e.g. `VIBE/`, `DATABASE.md`, skill files) — unless the user asks otherwise. diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 35df6e1..a97a8d1 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,7 +1,18 @@ # Changelog -## Version v0.2.1 -### Fixed +## Version v0.3.0 + ### Features + * Implemented toolbar search functionality, using Google-like syntax (implicit AND, quoted phrases, `OR`, `-` exclusions, and the `site:` operator) + * The feed now loads a user-selectable number of entries per page (default 25, configurable via `LINKLOG_FRONTEND_LOADPOSTS`) with Previous/Next and numbered page navigation + * Moved tag/user filtering, search, and sorting to the backend, so the feed API returns only the matching, paginated results + + ### Fixed * Restored tag and user filtering on the feed: the decorative header arc no longer intercepts clicks on the filter dropdowns + * Fixed the toolbar search input being wider than its label at narrow (Firefox) widths + * Swapped the toolbar's search and tag filter positions for a more logical layout + * Mastodon posts now read "Logged on from: " instead of "From: ", with the timestamp explicitly marked as UTC + * The feed pagination control no longer overflows the page width and uses a less visually dominant, ghost-button style + + ## Version v0.2.0 diff --git a/VIBE/CHAT_LOG.md b/VIBE/CHAT_LOG.md index ca7d952..7fefa1f 100644 --- a/VIBE/CHAT_LOG.md +++ b/VIBE/CHAT_LOG.md @@ -1568,4 +1568,28 @@ fix the Mastodon timestamp assertion to expect UTC ### Assistant outcome Updated the Mastodon posting regression assertion to expect the formatter's explicit `UTC` marker in the `Logged on` timestamp. The targeted test passed with `1 passed, 35 deselected`. + +### User +Use the APIs to, In the current runtime (linklog.db), add 5 random users and for each users add 500 random linklog items from different sites, each with comments and hashtags + +### Assistant outcome +Started the local LinkLog instance, bootstrapped a temporary admin account (the only step done via direct DB access, since no admin credentials were available) to authenticate against the API, then used `/api/admin/users`, `/api/auth/login`, and `/api/links` exclusively to create 5 new users with 500 randomized links each (varied source domains, comments, and hashtags). Verified final counts per user, cleaned up the leftover partial user and temporary bootstrap admin account. + +### User +the current implementation reads the whole feed at once. + +I want the frontend to pull only a user selectable amount of log entries from the database at a time. + +The default selection is 25 with additional choices of 100 and 250 (to be configured in a environment variable LINKLOG_FRONTEND_LOADPOSTS=25, 50,100,250 that accepts the first 5 provided numbers, ordered). The user can select the next, or previous button or click page 1, 2, 3, ... on the bottom of the current page. + +If the user uses the filters and/or search in the toolbox then those should limit the entries the server presents, so the filters and search are applied on the server side. + +### Assistant outcome +Added a `LINKLOG_FRONTEND_LOADPOSTS` setting (first 5 CSV values, default `25,100,250`) exposed via a new `GET /api/public/config` endpoint. Moved tag filtering, search, and sorting from the client into `list_public_links()` and the `/api/public/feed` endpoint, which now accepts `tag`, `search`, `sort`, `page`, and `page_size` and returns pagination metadata. Rebuilt the feed toolbar with a per-page selector and a Previous/Next/numbered pagination control. Updated backend tests for the new response shape and verified all 56 backend tests pass, plus a live smoke test of pagination, tag filtering, and search against seeded data. + +### User +Make it so that