title: Vanilla JS: Add Feed UI

description: Add UI to add a new feed by URL in vanilla JS prototype.

type: feature

status: closed


title: reach parity between vanilla js and react v2 ui

description: Continue implementing the vanilla js one with minimal overhad/depdnencies to be fast and lean. Make sure there are tests and rely on the v2 ui and legacy version as references.

type: epic


title: Refactor E2E tests to use page objects

description: The E2E tests are getting complex. Refactor them to use the Page Object Model pattern for better maintainability.

type: task


title: Vanilla JS (v3): Remove inline JS and fix CSP errors

type: bug


title: Persist sidebar state across reloads

description: Currently sidebar state resets on reload. It should persist in localStorage like the theme.


title: Vanilla JS Parity: Read/Star/Filter

description: Implement read/unread toggle, star/unstar, and special filters (All, Unread, Starred) in vanilla JS prototype.


title: v2 ui: themes

description:
simplify the themes selector by getting of the giant THEMES title

loook at the logic for the theme colors, it doesn't look like the feed item text is changing right. look at the legacy one for behavior.

Let's also simplify down to just light and dark themes (white bg, black bg) and use an emoji or something to distinguish.


title: v2 ui: sidebar design

description: I don't like the new sidebar design in v2 compared to v1. although I realize the v1 is kind of dated. can you take another pass at it -- more like v1, but you can spice it up a little bit maybe. but remember, this is a minimalist, simple, fast rss reader.


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: 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: setup github ci

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


title: [ui] when a left menu item is "active" make it bold

description: The "default" is UNREAD - this should be in the "bold" state when you're seeing that. When you filter out to "ALL" that should instead be bold. Same with the individual feeds if one is selected. And Starred.


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: 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: Mock RSS feeds in E2E tests

description: Currently E2E tests fetch real feeds like CNN, which makes them slow (10s+) and potentially flaky depending on network. Use a local mock server or file-based mocks.


title: Implement Tag View

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


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: Benchmark 'make check' execution time

description: Measure the execution time of the 'make check' workflow to ensure it remains fast and doesn't hinder developer velocity.


title: Ensure 80% Frontend Test Coverage

description: Configure coverage reporting in vitest and ensure the frontend codebase maintains at least 80% test coverage.


title: Multi-select feeds in sidebar

description: Enable multi-selection of feeds in the sidebar to view combined streams from several feeds at once. Keep current additive filtering logic.


title: make new v2 UI the default and serve at /

description:
After we move the old UI to be served at v1, serve the new UI at /

We can keep serving it at v2/ as well if we want.


title: Vanilla JS (v3): Redesign to 2-pane glassmorphism (parity with v2)


title: Migrate frontend to /api/ endpoints

description: The backend now provides a clean REST API at /api/. Update the frontend UI to use these new endpoints instead of the legacy backward-compatibility routes (/stream/, /feed/, etc.). This will allow for cleaner separation and better utilization of proper REST patterns.


title: font themes

description:
in the v2 ui, let's offer a few different font stacks the user can switch through. primarily this should just change font-face, maybe size, but don't worry about colors or anything right now.

the current default (helvetica neue, palatino)
a fancy all serif stack
a no-nonsense modern san-serif stack
a terminal inspired fixed width stack


title: titles changing on read state and hover

description:
Titles are changing on read state from blue to grey. They should just stay blue all the time.

Titles are getting underlined on hover. They should have no underline regardless of hover state.


title: v3: close settings

description:
when settings page is shown, clicking settings again should close it and go back to the "unread items" state

similarly, clicking "unread" or "all" or "starred" should close settings and take you to those.

status: open


title: update documentation based on all the recent changes

description: update README.md based on what's been changed given all the CLs and tickets recently


title: add search to new ui


title: fix docker-compose

description:
bug when trying to build in docker -- we may want to add an automated test for this later (though it may be hard since we're building in a vm to nest these)

--> 668e2e2c4b44
[2/3] STEP 3/9: WORKDIR /app
--> b42c7c265b7f
[2/3] STEP 4/9: COPY go.mod go.sum ./
--> 093e4d9b623e
[2/3] STEP 5/9: RUN go mod download
--> 208c8aaac5eb
[2/3] STEP 6/9: COPY . .
--> 7c44260c3ac0
[2/3] STEP 7/9: COPY --from=frontend-builder /app/frontend/dist ./frontend/dist
--> 09749e6660e1
[2/3] STEP 8/9: RUN rice -i ./web embed-go
2026/02/14 17:34:13 no calls to rice.FindBox() found
--> cdc88c64da36
[2/3] STEP 9/9: RUN go build -o neko .
no Go files in /app
Error: building at STEP "RUN go build -o neko .": while running runtime: exit status 1


title: Implement Export/Import UI

description: Add UI in settings to download OPML export and upload OPML import. Use /export/ and /import/ (need to check if import exists).


title: Enable Gzip Compression in Go Backend

description: Check if the Go backend is serving content with gzip compression. If not, implement it to reduce page size and improve performance. Add tests to verify.


title: new web frontend

description:
The current frontend uses an old version of backbone and jquery. Let's "deprecate" it -- keep it arouond so we can test against it and use it, but let's be able to also serve and use a nice shiny new frontend written in either simiple, highly efficient vanilla javascript, or put together something in react or similar. Needs to feel fast and low latency!

It's very important that this new frontend has all the functionality of the existing one AND looks similar (use same style, etc, but adjust a little if needed.)

ALSO make it highly testable and have high test coverage as you go. I don't want it to use the Chrome browser plugin thing, just test it on your own using things from the command line you can do.


title: Wire Reader API into web.go