| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The IntersectionObserver approach for infinite scroll was unreliable —
items would not load when scrolling to the bottom in v3, while v1's
polling approach worked fine. The issue was that IntersectionObserver
with a custom root element (main-content, whose height comes from flex
align-items:stretch rather than an explicit height) didn't fire
reliably, and renderItems() being called 3 times per fetch cycle
(from both items-updated and loading-state-changed events) kept
destroying and recreating the observer.
Replace with a simple scroll-position check in the existing onscroll
handler, matching v1's proven approach: when the user scrolls within
200px of the bottom of #main-content, trigger loadMore(). This runs
on every scroll event (cheap arithmetic comparison) and only fires
when content actually overflows the container.
Remove the unused itemObserver module-level variable.
Update regression tests to simulate scroll position instead of
IntersectionObserver callbacks, with 4 cases: scroll near bottom
triggers load, scroll far from bottom doesn't, loading=true blocks,
and hasMore=false hides sentinel.
https://claude.ai/code/session_01DpWhB9uGGMBnzqS28HxnuV
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The load-more sentinel observer was assigned to a local `const observer`
that fell out of scope after renderItems() returned. Without a persistent
JS reference, engines can garbage-collect the observer, silently breaking
infinite scroll (no more items loaded on scroll).
Fix: assign to the existing module-level `itemObserver` variable, which is
already disconnected/replaced at the top of each renderItems() call.
Add three regression tests in regression.test.ts that use a class-based
IntersectionObserver mock to capture the callback and verify:
- sentinel visible → loadMore fires
- sentinel visible while loading → loadMore suppressed
- hasMore=false → no sentinel rendered, no loadMore
https://claude.ai/code/session_01DpWhB9uGGMBnzqS28HxnuV
|
| |
|
|
|
| |
Source changes since last dist commit shifted Vite content hashes.
Rebuilding ensures web/dist/v3/ matches a fresh `make ui-vanilla`.
|
| | |
|
| |
|
|
| |
Vanilla JS (V3)
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
| |
Strip border-radius, box-shadow, background, and backdrop-filter from
the sidebar toggle in both v2 and v3 frontends so the logo appears flat.
https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
|
| |
|
|
|
|
|
|
|
|
|
| |
- CSRF: test excluded paths (/api/login, /api/logout), PUT/DELETE methods
- Item model: test Filter includeContent flag, ItemById returns content,
multiple feed_ids filtering
- API: test read_filter=all param, feed_ids comma-separated filter,
full_content exclusion from stream
- Routing: add v3 frontend route test
https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
|
| |
|
|
|
|
|
|
| |
The sidebar default-closed JS logic used 1024px but CSS media queries
used 768px, causing inconsistent behavior on tablets. Updated all
sidebar-related breakpoints to 1024px/1025px to match.
https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
|
| |
|
|
|
|
|
|
|
|
| |
Login form now includes a CSRF token from the cookie as a hidden form
field. The CSRF middleware accepts tokens from either the X-CSRF-Token
header (for JS clients) or the csrf_token form field (for HTML forms).
Removed /login from the CSRF exclusion list so login POSTs are now
validated.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Change IntersectionObserver threshold from 0.5 to 1.0 so items are only
marked as read when fully scrolled into view, reducing accidental
mark-as-read during fast scrolling.
Also fix unused Category import in perf test and add thicket config.json
to repository so future agents can use thicket CLI commands.
Closes NK-s2g59a
https://claude.ai/code/session_019Z4VJxzY7tcAuNkPAkvry9
|
| |
|
|
|
|
|
|
|
|
|
| |
branding
- Fix V3 keyboard navigation delay (resolved NK-wjats7)
- Update V3 document title to 'neko' (resolved NK-4p3s91)
- Fix V3 neko logo/button position to be top-left fixed (resolved NK-89za3s)
- Improve FeedItems (React) stability with ref-based index tracking and robust tests
- Sync V3 styling and selection feedback with V2 patterns
- Rebuild production assets
|
| |
|
|
|
|
|
| |
- Remove duplicate neko logo from v3 sidebar
- Keep sidebar toggle button fixed at top-left even when sidebar is open
- Add top padding to v3 sidebar to prevent overlap with the fixed toggle button
- Update v3 tests to match UI changes
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Go benchmarks cover item CRUD/filter/sanitization, API endpoints (stream,
item update, feed list), middleware stack (gzip, security headers, CSRF),
and crawler pipeline (feed parsing, mocked crawl). Stress tests verify
concurrent reads/writes and large dataset handling. Frontend perf tests
measure template generation, DOM insertion, and store event throughput.
New Makefile targets: bench, bench-short, stress, test-perf.
https://claude.ai/code/session_01ChDVWFDrQoFjMYHpaLGr9s
|
| |
|
|
|
|
|
|
|
|
| |
stability
- Sync v3 dark/light theme colors with v2 defaults
- Fix v3 settings input/select contrast in dark mode
- Add logo emoji to v3 sidebar
- Fix duplicate key warnings and side-effect issues in FeedItems.tsx (v2)
- Rebuild production assets
|
| |
|
|
|
|
|
| |
- Update Makefile to correctly build and copy frontend-vanilla (v3) assets
- Fix frontend-vanilla/vite.config.ts to build to its own dist directory
- Normalize CSRF check path and exclude /api/logout to fix v3 session clearing
- Include latest built assets for v3
|
| |
|
|
|
|
|
|
| |
- Close NK-oqd24q: Fix login access for v3/api
- Update web.go to exclude /login/ from CSRF check during initial submission
- Modernize web/static/login.html with new CSS and structure
- Add web/login_test.go to verify CSRF exclusion
- Created NK-ngokc3 for further CSRF enhancements
|
| | |
|
| |
|
|
| |
overflow, cleaned up styles
|
| |
|
|
| |
implement feed deselect, and complete Settings (Add Feed, Export/Import OPML)
|
| | |
|
| | |
|
| |
|
|
| |
for Tags and Feeds
|
| |
|
|
| |
responsiveness with backdrop
|
| |
|
|
| |
for v2 parity
|
| |
|
|
| |
Settings view, and achieve 80% test coverage
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
embed dist/v3
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
(NK-v9e7r3)
|
| | |
|
| |
|
|
| |
policy for dev env
|
| |
|
|
| |
web/dist/vanilla directory\n- Updated Makefile, Dockerfile, and CI workflow to remove vanilla references\n- Cleaned up web/web.go to remove vanilla embed and routes\n- Verified build and tests pass\n\nCloses NK-2tcnmq
|
| |
|
|
| |
you were focused on the last loaded item and that item was\nvery long (extending past the viewport), pressing 'j' would do nothing\nbecause there were no more items loaded yet.\n\nNow, when the user presses 'j' and lands on the last item, we automatically\ntrigger loading more items (if available), ensuring that the next 'j' press\nwill work as expected.\n\nAdded test to verify this behavior works correctly.
|
| |
|
|
| |
Authenticated() to return true when no password is configured\n- Updated apiLoginHandler to succeed when no password is set\n- Added comprehensive backend tests for both password/no-password cases\n- Added E2E tests for authentication flows (password tests are skipped by default)\n- All tests pass for both authentication scenarios\n\nFixes issue where app would require login even when no password was configured.\nNow properly supports passwordless mode for local development.
|