title: Make feed crawling async in API

description: Currently, POST /api/feed triggers an immediate crawl which blocks the response (or at least keeps the goroutine alive). Refactor the crawling architecture to be truly async with a job queue or status updates, improving API responsiveness and reliability.

type: cleanup

status: icebox


title: v3: cut "FILTERS" text

description: there's no header needed above unread/read/starred, just cut that please

type: task

status: closed


title: Implement Item Interactions

description: Add ability to toggle read/unread and star/unstar status for items. Use PUT /item/:id


title: check coverage again

description: check test coverage again and see if more tests are needed


title: Refactor routing logic for consistent settings exit

description: Instead of checking 'if currentRoute.path == /settings' in every click handler, maybe centralize this logic in the router or a helper function to ensure consistent behavior when navigating away from settings.

status: open


title: setup github ci

description: Maybe it'd be nice to have github run the tests. Is that a thing we can try to setup

type: feature


title: TUI is terrible and needs fixing

description: The TUI doesn't really work and doesn't make sense. Think very hard and look at the v2 HTML UI implementation and make something cool like that. Probably needs tests too.

type: epic


title: [security] Implement CSRF Protection for API

description: Add CSRF protection to all state-changing API endpoints. 1. Implement a middleware that generates a CSRF token and sets it in a cookie (readable by JS) or header. 2. Update the AuthWrap middleware to validate the presence of this token in the X-CSRF-Token header for all unsafe methods (POST, PUT, DELETE). 3. Update the React frontend to read the token and include it in all API requests.


title: Add coverage check to 'make check'

description: Add a code coverage check to the 'make check' workflow, ensuring it doesn't significantly slow down execution. This replaces ad-hoc coverage checks.


title: FEEDS in sidebar needs to be more clearly a collapsible thing

description: FEEDS in the sidebar needs a caret (> that turns to V) or something similar to make it clear it's a toggle collapsible list thing


title: Feed list collapsed by default

description: The list of feeds on the left side should be collapsed by default, with a little control to extend it.


title: Remaining test coverage gaps

description: Cross-package test coverage is at 81.2%. The remaining untested functions are: GetFullContent (goose HTTP extraction), indexHandler/serveBoxedFile (rice.MustFindBox), Serve (starts HTTP server), main, util.init. To reach 90%, consider: (1) refactoring GetFullContent to accept an interface for HTTP fetching, (2) refactoring Serve to extract route setup into a testable function, (3) mocking rice.MustFindBox, (4) using feeds from https://trenchant.org/feeds.txt as static test fixtures for integration tests.


title: Add Local Git Hooks

description: Create a script/make target to install a pre-push hook that runs 'make check'. This enforces quality gates locally, keeping the CI clean.


title: Investigate E2E Tag View flakiness

description: The E2E test for /v2/tag/Tech was temporarily disabled because it was timing out/failing. Investigate if it's a race condition or a routing issue.

type: bug


title: Vanilla JS: Implement Test Infrastructure

description: Setup testing infrastructure for vanilla JS prototype to ensure 80% coverage. Refactor app.js for testability and add unit tests.


title: infinite scroll on ipad/mobile

description: On a mobile device, the infinite scrooll didn't seem to be working properly and triggering as I scrolled to the bottom. Are the right triggers set up for mobile browsers as well as desktop -- this was on an ipad.


title: Add thicket config.json to repository

description: The .thicket/config.json file was missing from the repository, causing thicket add to fail with 'not initialized' error. Ensure config.json is tracked in git so future agents can use thicket commands.


title: Improve scraper heuristics

description: The scraper currently uses a simple fallback between CleanedText and TopNode. It could be improved to better handle different article layouts.


title: 600px width by default, closer to left panel

description: On desktop the feed items are too narrow (~500px) compared to legacy version which is ~600px.


title: adding feed in v2 ui shows error

description: added https://trenchant.org/rss.xml as a feed in the UI but it gave some weird message inline like unexpected character, but it did eventually add it. what happened there


title: add neko cat back to hide left navivation

description: Change the "neko reader" to the cat emoji like in the legacy and have it toggle visibility of the left nav


title: Evaluate E2E test harness

description:
Evaluate the current E2E test harness (Cleaning up test environment...
Cleanup complete.
Building backend...
Creating data directory...
Starting mock feed server on port 9090...
Mock Server PID: 166494
Mock server is up.
Starting backend on port 4994...
Backend PID: 166520
Waiting for backend to start...
Waiting...
Backend is up!
Running E2E tests...

> frontend@0.0.0 test:e2e
> playwright test

Running 13 tests using 1 worker

[1/13] [chromium] › tests/auth.spec.ts:12:5 › Authentication - No Password Required › should allow direct access to dashboard without login
[2/13] [chromium] › tests/auth.spec.ts:25:5 › Authentication - No Password Required › should allow login with empty password
[3/13] [chromium] › tests/auth.spec.ts:38:5 › Authentication - No Password Required › should report authenticated status via API when no password
[4/13] [chromium] › tests/auth.spec.ts:53:10 › Authentication - Password Required › should redirect to login when accessing protected routes
[5/13] [chromium] › tests/auth.spec.ts:64:10 › Authentication - Password Required › should reject incorrect password
[6/13] [chromium] › tests/auth.spec.ts:79:10 › Authentication - Password Required › should accept correct password and redirect to dashboard
[7/13] [chromium] › tests/auth.spec.ts:93:10 › Authentication - Password Required › should persist authentication across page reloads
[8/13] [chromium] › tests/auth.spec.ts:109:10 › Authentication - Password Required › should logout and redirect to login page
[9/13] [chromium] › tests/auth.spec.ts:128:10 › Authentication - Password Required › should report unauthenticated status via API
[10/13] [chromium] › tests/auth.spec.ts:142:5 › Authentication - Complete Flow › should handle complete user flow without password
[11/13] [chromium] › tests/crawl.spec.ts:4:5 › Crawl Integration › should add a feed and see items after crawl
[12/13] [chromium] › tests/e2e.spec.ts:4:3 › Neko Reader E2E › should allow login, viewing feeds, and logout
[chromium] › tests/e2e.spec.ts:4:3 › Neko Reader E2E › should allow login, viewing feeds, and logout
Step 5: Navigate to Home

Step 6: Logout

[13/13] [chromium] › tests/font.spec.ts:4:5 › Font Theme Settings › should change font family when theme starts
  6 skipped
  7 passed (5.2s)

To open last HTML report run:

  npx playwright show-report

Tests passed!
Cleaning up...
Cleaning up test environment...
Cleanup complete.) which is brittle and resource intensive. Consider alternative approaches or refactoring.


title: scroll mark as read broken in V3 UI

description: j/k properly select and mark an item as read, but scrolling it off the screen on desktop and mobile don't seem to mark it as read.


title: [feature] light/dark/black toggle

description: Add in a simple [light | dark | black] theme toggler like in the legacy version.


title: Optimize observer creation in renderItems

description: We currently recreate IntersectionObservers every time renderItems is called. We should investigate if this impacts performance and potentially reuse the observer or optimize the logic.


title: docker support

description: add support so people can self-host this in docker and (maybe) test it yourself. maybe keep it in a docker directory with separate docs etc.


title: enhance github ci/cq

description: Make sure we have the right CI/CQ things in the github workflow. Can it test our docker compose for us too maybe


title: Implement Tag View

description: Create frontend view for browsing items by tag/category. Use /tag/:id endpoint.


title: review recent tickets / CLs and write tests

description: Given the key behaviors/features/bugs are there any additional tests needed -- don't worry about e2e tests.


title: Fix TypeScript Lint Errors in Tests

description: There are lint errors in test files regarding jest-dom matchers (toBeInTheDocument, etc). Ensure proper types are included.


title: fix github ci

description: seems to be broken, are the right things still in there given all the refactorings


title: [security] Run Docker Container as Non-Root User

description: Update the Dockerfile to create and use a non-privileged user. 1. Create a user (e.g., neko) in the final stage. 2. Ensure the /app/data directory is owned by this user. 3. Switch to this user using USER neko before the CMD.


title: UI: Add skeleton loaders for feed item loading

description: The currently 'Loading more...' text is basic. We should add skeleton loaders for a smoother infinite scroll experience.


title: https://computer.rip/rss.xml fails to importa

description: running neko -a https://computer.rip/rss.xml gave an error. debug it and add test case to catch.


title: consistency in sidebar

description: With the new sidebar styling, SETTINGS and LOGOUT and the light/dark look really different than the rest. Let's make them more consistent from a style perspective.


title: update README.md

description:
Ensure the build, configuration, etc are up too date.
Note the git change when we started to vibe-code this in the history (with dates etc.)


title: v3 ui: takes 3 presses of 'j' to move to next item

description: Is there some weird timer before it's scrolling it -- after that it's fine. Or a delay to setup the listener or something


title: Vanilla JS: Test Infrastructure & Coverage

description: Setup testing framework (likely vitest or simple runner) for vanilla JS. Refactor code for testability. Aim for 80% coverage on vanilla/app.js logic.


title: test coverage

description:
assume the code works properly (it mostly does)
get to 90% test coverage on the go code