title: Freeing up space by purging very old items

description: I have been running neko for so long that my production database is 1.4GB. Come up with a tool (ok to run it from command line) that purges some super old feed items to save space. Probably needs some variables on age, etc. Think carefully about the algorithm! it should be accessible from the CLI to start, although maybe we should show "db size" in settings too with an option to clean up.

type: feature

status: closed


title: [security] Add HTTP Security Headers

description: Add middleware to set standard security headers: Content-Security-Policy (restrict sources), X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: strict-origin-when-cross-origin.


title: Enhance UI with better loading indicators and error states

description: The application should have a consistent and premium feel for loading and error states. Currently, it uses simple text. We should implement skeleton screens or more polished animations.

type: task


title: Clean up unused font CSS variables

description: The font CSS variables might have duplicates or unused entries after the fix. Audit them.


title: scrape full text button

description: add this feature back in to the v2 ui and verify it is still working (not sure if we have any tests)


title: v2 frontend: when selected, don't change style of feed items

description: Just leave them the same when j/k "selects" an item. No blue side thing, no change in background, it's distracting. Just scroll it to the right place.

type: bug


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: Fix Playwright E2E Tests

description: The e2e tests in tests/e2e.spec.ts are failing when run with vitest. They should be run with playwright test runner, or configured correctly. Currently excluded from vitest.


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: [feature] light/dark/black toggle

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


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.

type: epic


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: Vanilla JS (v3): Achieve 80% test coverage


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.

type: cleanup


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: 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