Skip to content

Add grid and compact list controls across article feeds - #81

Merged
abhi1693 merged 2 commits into
masterfrom
feat/reader-grid-list-view
Oct 4, 2026
Merged

abhi1693 merged 2 commits into
masterfrom
feat/reader-grid-list-view

Conversation

@abhi1693

@abhi1693 abhi1693 commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

What changes and why?

Readers previously had to open account Feed settings to change article layouts, and guests could not choose a compact view. Grid/List icons now sit beside Filters and switch the shared article renderer immediately across My feed, Latest, content-type feeds and topic/source feeds. Read later and Trending expose the same control in their headings.

Grid remains the default and existing saved account choices are honored. Guest choices persist in browser storage; signed-in choices use the existing account feed preference without changing content or language selections. Failed account saves restore the previous layout and announce an error. Unavailable preferences offer a retry before any write, and late responses from another account cannot replace the current account's layout.

The existing compact table now has shorter rows, bounded titles and stable source/date/action columns. Narrow tables put source/date information beneath the title and retain a 44px bookmark target while hiding secondary engagement controls. Toolbar wrapping keeps Filters and the layout icons together on small screens. Both layouts share loaded articles, infinite pagination, generation pins, engagement data and preview navigation.

Trending uses shared reader content and gains an extension route adapter so the same control works in Chrome and Edge. The implementation uses the existing feed display schema; no new backend contract is introduced.

Validation

Updated against master after #80, preserving article-first rendering, options-error recovery, prompt coordination, touch-fixture isolation and backend coverage/security improvements.

  • 18 feed-preference and shared Trending regression cases passed. New Trending cases cover loading, failure with working retry, empty state and loaded articles; its real renderer switches layouts without replacing articles or fetching again. Existing cases cover account/guest persistence, restricted storage, saved filters, rejected saves and account changes.
  • Browser-only layout/pagination helpers now live under apps/web/tests/browser; website and extension consumers share them. Application coverage exclusions are unchanged.
  • Normal commit hooks passed for affected frontend lint, types, unit tests and extension builds. Current-head CI passed 39 jobs, with 10 expected skips, including CI required, all three CodeQL analyses, Sonar, dependency/secret/workflow checks, populated upgrades, real API/admin journeys, performance comparison and ARM64 image checks.
  • Hosted tests: 3,007 backend unit, all 1,137 PostgreSQL/Redis integration, 829 web and 648 admin cases passed with no skips. Backend unit coverage remains above the unchanged 67.60% minimum across all 273 source files.
  • Actual web, Chrome and Edge browser suites passed, including grid/list switching across feeds, account/guest preferences, 320/768/1440px layouts, bookmark targets, preview retention, keyboard operation and 120 unique articles with no duplicate engagement fetches. Earlier article-first, filter-options recovery, signup/onboarding, responsive-grid and touch checks also pass.
  • New layout toggle and shared Trending renderer have 100% line and branch coverage in the hosted LCOV report.
  • Sonar MCP confirms gate OK, zero open issues, 85.7% new-code coverage and 0.0% new duplication. No quality rule, exclusion or gate is weakened.
  • GitHub’s separate managed AI findings scan remains unavailable because its monthly quota is exhausted (HTTP 402); standard CodeQL passed. No paid/account changes were made. Hosted parity must pass against the actual website and both built extensions before manual merge. Auto-merge is disabled.
  • Original implementation screenshots remain local and untracked. Native GitHub attachment upload is unavailable through the configured tools; no review screenshots are committed.

Rollout notes

Guest layout storage is cosmetic and falls back to a working per-tab choice if browser storage is blocked. Signed-in readers use the existing authenticated/CSRF-protected feed-settings endpoint. No migration or configuration change is required.

This PR is isolated on feat/reader-grid-list-view; the legacy-cleanup and other open tasks remain on their own branches. Website deployment and Chrome/Edge store publication require the normal release process and are not included here.

Merge after #80 and before #82–#84, one at a time, after all current-head checks pass.

Ready for review

  • The description explains the change and validation results, including gaps.
  • Relevant usage documentation and regression tests are updated.

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown

PR reader API performance

Result: INCONCLUSIVE

3 inconclusive · 5 within threshold. Zero request failures across all six runs.

Base eedae54c1f3be8461694afbe5eae50f9c6f1d95c → PR 06fee36961e17e09af0da8222f6a375c8cfeb1e0

Three independent runs per revision, each on a fresh GitHub-hosted ARM64 runner. 16 users, 60 seconds/run, 1,000 synthetic articles, cache off, five PgBouncer slots.

Latency comparison

All latency values are in milliseconds; lower is better. Values are medians of three runs.

Route Base p95 PR p95 Change Result
All requests 84 92 +8 (+9.5%) Within threshold
Latest feed 110 120 +10 (+9.1%) Within threshold
Feed pagination 80 87 +7 (+8.7%) Within threshold
Article detail 60 66 +6 (+10.0%) Within threshold
Source feed 89 83 -6 (-6.7%) Inconclusive
Topic feed 79 76 -3 (-3.8%) Within threshold
Feed filters 63 77 +14 (+22.2%) Within threshold
Sources 37 37 +0 (+0.0%) Inconclusive
Topics 40 37 -3 (-7.5%) Inconclusive
Additional latency and throughput metrics

Each cell shows base → PR. Latencies are in milliseconds.

Endpoint p50 p99 Requests/s
Aggregated 26 → 26 130 → 130 30.91 → 30.96
/v1/feed [latest] 42 → 42 150 → 150 8.66 → 8.69
/v1/feed [page] 24 → 25 110 → 120 3.64 → 3.70
/v1/articles/[id] 16 → 17 96 → 90 6.25 → 6.28
/v1/feed [source] 24 → 26 110 → 110 2.01 → 2.04
/v1/feed [topic] 24 → 25 110 → 130 2.09 → 1.96
/v1/feed/options 21 → 20 110 → 120 2.68 → 2.81
/v1/sources 11 → 11 46 → 80 2.68 → 2.81
/v1/topics 10 → 13 80 → 74 2.68 → 2.81
Individual runs
Run Requests Failures Exit code
Base 1 1699 0 0
Base 2 1740 0 0
Base 3 1732 0 0
PR 1 1741 0 0
PR 2 1728 0 0
PR 3 1760 0 0
How to interpret this report

Regressed / Improved: a p95 regression needs >20% and >20 ms increase in the medians and at least two head samples versus the base median. Improvements use the inverse threshold. Within threshold means the change did not meet both thresholds.

Inconclusive: a within-revision p95 range >35% of its median and >20 ms is too noisy for a confident latency verdict.

Inconclusive latency comparisons are non-blocking: the check passes without claiming an improvement. Confirmed regressions and test/report errors fail the PR gate. Throughput is descriptive: paced users do not measure maximum capacity. This uncached public API test does not establish production health, browser performance or worker capacity. Separate runners can differ in hardware or host load; repetitions and noise checks reduce but cannot eliminate that uncertainty.

Full HTML/CSV reports and logs · attempt 1

@gitar-bot

gitar-bot Bot commented Oct 4, 2026

Copy link
Copy Markdown
Code Review ✅ Approved

🟡 Medium risk · Adds persisted layout selection across website and extension article feeds.

Adds grid and compact list view controls across article feeds, allowing readers to switch layouts immediately without opening settings. Grid remains the default, account preferences are preserved, guest choices persist in browser storage, and both layouts share pagination and engagement data. No issues found.

Review coverage

📋 Rules No rules evaluated

🧪 Functional validation Not enabled · Set up

Options

Auto-apply is off → Gitar will not commit updates to this branch.
Display: compact → Counting what did not apply, without listing it.

Comment with these commands to change the behavior for this request:

Auto-apply Compact
gitar auto-apply:on         
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown

Backend unit coverage

PASS · minimum combined coverage 67.60%.

Tests: 3007 passed, 0 failed, 0 skipped. Source files: 273.

Workspace Lines Branches Combined
All backend code 71.64% 53.77% 67.79%
apps/admin-api 64.78% 35.76% 59.95%
apps/aggregator 73.60% 57.18% 69.86%
apps/api 68.94% 55.88% 66.48%
apps/article-enrichment-worker 80.00% 50.00% 71.43%
apps/cli 68.76% 42.93% 64.81%
apps/images-worker 80.00% 50.00% 71.43%
apps/mcp 79.90% 73.88% 78.77%
apps/notifications 83.33% 76.67% 81.75%
apps/search-indexer 85.48% 85.71% 85.53%
apps/source-discovery-worker 80.00% 50.00% 71.43%
apps/user-api 59.19% 32.90% 54.27%
packages/core 73.81% 56.67% 69.73%
packages/http 94.43% 86.47% 92.62%

Unit coverage includes every backend workspace. PostgreSQL/Redis integration tests run separately.

Commit: 06fee36 · HTML, JSON, XML reports and job logs · attempt 1

@sonarqubecloud

sonarqubecloud Bot commented Oct 4, 2026

Copy link
Copy Markdown

@abhi1693
abhi1693 merged commit 6cde784 into master Oct 4, 2026
51 checks passed
@abhi1693
abhi1693 deleted the feat/reader-grid-list-view branch October 4, 2026 17:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant