diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-15 08:49:46 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-15 08:49:46 -0800 |
| commit | 038cdd6ae395eb4249ab1758d319f847beeb4549 (patch) | |
| tree | 9e02389c290658196067f7e369bcc2cea08ef43b /.thicket | |
| parent | 9e7946ce0474fddb8901df27e5c3646fd87af67c (diff) | |
| download | neko-038cdd6ae395eb4249ab1758d319f847beeb4549.tar.gz neko-038cdd6ae395eb4249ab1758d319f847beeb4549.tar.bz2 neko-038cdd6ae395eb4249ab1758d319f847beeb4549.zip | |
Commit ticket updates and remaining backend lint fixes
Diffstat (limited to '.thicket')
| -rw-r--r-- | .thicket/tickets.jsonl | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/.thicket/tickets.jsonl b/.thicket/tickets.jsonl index 7283311..d1cfacf 100644 --- a/.thicket/tickets.jsonl +++ b/.thicket/tickets.jsonl @@ -14,6 +14,8 @@ {"id":"NK-3g1ouf","title":"fix font theming","description":"The font selector should adjust more than just the titles/ui, the font stack should include the \"normal\" article text too, right now it's palatino in every stack, it should really just be the first one I think.","type":"bug","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-15T00:53:53.986364009Z","updated":"2026-02-15T02:23:57.431627206Z"} {"id":"NK-3om7x2","title":"Implement Feed Items View","description":"Create a component to display items for a selected feed. Fetch items from /api/stream?feed_id=...","type":"","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T05:59:46.161356437Z","updated":"2026-02-13T14:55:14.795643835Z"} {"id":"NK-4juza2","title":"v2 ui - collapsible feed list","description":"In the left side navigation list of feeds, the feeds should be hidden by default. The word \"feeds\" should be a toggle to show/hide the list, with a triangle that indicates state.","type":"feature","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T02:48:25.194856022Z","updated":"2026-02-14T03:16:19.259726648Z"} +{"id":"NK-4jy0t2","title":"Implement Mocked-API UI Tests","description":"Configure Playwright to intercept /api/ requests and return mock JSON. This decouples UI testing from the backend, reducing VM crash risk and enabling fast UI iteration.","type":"task","status":"open","priority":2,"labels":null,"assignee":"","created":"2026-02-15T16:23:32.209848684Z","updated":"2026-02-15T16:23:32.209848684Z"} +{"id":"NK-4y484t","title":"last item behavior on mobile","description":"I think there's a bug where if the last item on screen on mobile isn't \"big\" enough it won't trigger loading more items, but not sure. please verify the behavior.","type":"bug","status":"open","priority":1,"labels":null,"assignee":"","created":"2026-02-15T16:46:38.025288816Z","updated":"2026-02-15T16:46:38.025288816Z"} {"id":"NK-4yjicm","title":"Create api/reader package and middleware","description":"","type":"task","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-15T00:21:45.866133071Z","updated":"2026-02-15T00:44:41.290163192Z"} {"id":"NK-59kbij","title":"Implement Frontend Logout","description":"Add logout button to dashboard header. Call /api/logout (need to create this potentially?). Redirect to /login","type":"","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T14:58:18.343464645Z","updated":"2026-02-13T15:01:33.783216589Z"} {"id":"NK-5ocxgm","title":"Infinite scroll","description":"a key feature of the original version that when you scroll to the bottom, it catches that and loads more (based on the current filters, etc)","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-13T19:27:01.14879752Z","updated":"2026-02-13T19:45:02.283640203Z"} @@ -35,11 +37,13 @@ {"id":"NK-9pgjph","title":"v2 ui - font size 18px","description":"Compare your font sizes with the legacy version -- I think they're a little too small (16 vs 18 baseline)","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T03:21:48.453217898Z","updated":"2026-02-14T03:24:25.316927886Z"} {"id":"NK-a217qm","title":"font styles","description":"Switch the default font stack and size to match the legacy UI","type":"feature","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T00:59:37.686539676Z","updated":"2026-02-14T01:25:03.119825567Z"} {"id":"NK-a7c6lb","title":"coverage status","description":"check coverage status -- are we still close to 80%\nit's ok to ignore the old static legacy javascript or vanilla js prototype\nif it's low file a ticket to get coverage back up","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T17:32:19.995215347Z","updated":"2026-02-14T18:03:41.748377361Z"} +{"id":"NK-a9hs2m","title":"Update golangci-lint version and config to v2","description":"The local environment uses golangci-lint v2.9.0 which is incompatible with the current v1 config. Running migration updated the .golangci.yml to version 2. We should update the GitHub CI workflow to use a compatible version and ensure local/CI parity.","type":"cleanup","status":"open","priority":3,"labels":null,"assignee":"","created":"2026-02-15T16:11:21.682298135Z","updated":"2026-02-15T16:11:21.682298135Z"} {"id":"NK-acq08a","title":"update Makefile","description":"Ensure the Makefile builds things and works\nTest it by running it regularly before checking in!","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T00:55:40.127322076Z","updated":"2026-02-14T01:26:31.564799193Z"} {"id":"NK-ahzf5c","title":"drop \"mark read\" button","description":"there's no mark read/unread buttons, it's just by scrolling!","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-13T19:28:20.708443259Z","updated":"2026-02-13T20:26:43.029168286Z"} {"id":"NK-aiaza3","title":"clean up root directory of project","description":"There are some scripts in the root directory like run_e2e.sh that probably should be in a subdirectory -- look into it and make things a little tidier where approopriate.","type":"task","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T17:42:14.8736959Z","updated":"2026-02-14T23:44:07.081167865Z"} -{"id":"NK-aibd0t","title":"Add crawl status indicator to UI","description":"Currently triggering a crawl via 'Crawl All Feeds Now' just shows an alert. We should provide a visual status indicator and refresh the item list automatically when done.","type":"task","status":"open","priority":1,"labels":null,"assignee":"","created":"2026-02-15T05:20:28.975031077Z","updated":"2026-02-15T05:20:28.975031077Z"} -{"id":"NK-arckp3","title":"Install golangci-lint in dev environment","description":"Local Makefile uses 'go vet' because 'golangci-lint' is missing. CI uses golangci-lint. We should install it locally for consistency.","type":"task","status":"open","priority":1,"labels":null,"assignee":"","created":"2026-02-15T05:14:44.840444844Z","updated":"2026-02-15T05:14:44.840444844Z"} +{"id":"NK-aibd0t","title":"Add crawl status indicator to UI","description":"Currently triggering a crawl via 'Crawl All Feeds Now' just shows an alert. We should provide a visual status indicator and refresh the item list automatically when done.","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-15T05:20:28.975031077Z","updated":"2026-02-15T05:20:28.975031077Z"} +{"id":"NK-ak4om3","title":"Create 'make check' unified workflow","description":"Create a 'make check' target that runs 'golangci-lint' (replacing 'go vet') and all unit tests (Backend + Frontend). This becomes the fast (\u003c30s) 'Golden Command' for local verification.","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-15T16:23:27.713664939Z","updated":"2026-02-15T16:41:08.346742218Z"} +{"id":"NK-arckp3","title":"Install golangci-lint in dev environment","description":"Local Makefile uses 'go vet' because 'golangci-lint' is missing. CI uses golangci-lint. We should install it locally for consistency.","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-15T05:14:44.840444844Z","updated":"2026-02-15T05:14:44.840444844Z"} {"id":"NK-bsdwqz","title":"terminal UI","description":"once there is good test coverage and a clean backend API, work on a nice efficient TUI with https://github.com/charmbracelet/bubbletea","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T01:54:02.285738454Z","updated":"2026-02-13T04:42:09.824268427Z"} {"id":"NK-ca9t70","title":"Vanilla JS: Add Feed UI","description":"Add UI to add a new feed by URL in vanilla JS prototype.","type":"feature","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T04:47:41.764330544Z","updated":"2026-02-14T04:47:41.764330544Z"} {"id":"NK-chns2b","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","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T04:45:06.813453353Z","updated":"2026-02-14T04:45:06.813453353Z"} @@ -55,28 +59,33 @@ {"id":"NK-fkc119","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","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T03:16:32.574415787Z","updated":"2026-02-14T03:23:01.837550873Z"} {"id":"NK-fm15vq","title":"UI: Improve accessibility for star icon","description":"The new star button should have proper aria-labels and potentially better focus states for screen readers.","type":"task","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-13T20:27:36.768034045Z","updated":"2026-02-13T20:27:36.768034045Z"} {"id":"NK-fnaohu","title":"UI Styling: Dark Mode Support","description":"","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-13T18:05:19.59504351Z","updated":"2026-02-13T18:11:46.326064329Z"} -{"id":"NK-fnbaaf","title":"stress test with a REALLY big database","description":"I have been using a version of neko for over a decade and my prod database is 1.4GB sqlite file. it's in big_neko.db\n\nrun some tests with that big database and see if anything messes up! DO NOT CHECK IN THAT BIG DATABASE EVER.\n\nif there are bugs or performance issues with such a big db, file some tickets for us to evaluate and we can create some synthetic data or issues later on.","type":"task","status":"open","priority":1,"labels":null,"assignee":"","created":"2026-02-15T02:58:54.859954523Z","updated":"2026-02-15T02:58:54.859954523Z"} +{"id":"NK-fnbaaf","title":"stress test with a REALLY big database","description":"I have been using a version of neko for over a decade and my prod database is 1.4GB sqlite file. it's in big_neko.db\n\nrun some tests with that big database and see if anything messes up! DO NOT CHECK IN THAT BIG DATABASE EVER.\n\nif there are bugs or performance issues with such a big db, file some tickets for us to evaluate and we can create some synthetic data or issues later on.","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-15T02:58:54.859954523Z","updated":"2026-02-15T02:58:54.859954523Z"} {"id":"NK-fpzx66","title":"v2 ui - title styling","description":"The title of the article stays blue and bold regardless of read state.","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T03:22:55.339956853Z","updated":"2026-02-14T03:28:01.555909701Z"} {"id":"NK-fzjyay","title":"github CI fails","description":"Both the backend and frontend failed the CI jobs failed the lint checks.\n\nare we running those properly locally before submitting\n\nalso the frontent consistency check failed","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-15T02:41:02.747760248Z","updated":"2026-02-15T05:11:46.097784637Z"} {"id":"NK-g7ya0n","title":"Style Settings page to match Glass sidebar","description":"The settings page currently uses the old retro aesthetic. It should be updated to match the new minimalist 'glass' sidebar style for visual consistency. This should include updating form elements, backgrounds, and typography.","type":"feature","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T23:53:46.590222566Z","updated":"2026-02-15T00:51:14.771780934Z"} {"id":"NK-g818qn","title":"Improve mobile responsiveness of React UI","description":"The React UI should be fully responsive and work well on small screens. Now that the vanilla JS prototype is removed, we should ensure the main interface is a great experience for mobile users.","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T22:46:32.850472479Z","updated":"2026-02-14T22:49:01.411224187Z"} {"id":"NK-gdf99z","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","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T03:51:59.882212859Z","updated":"2026-02-14T04:31:28.290051717Z"} {"id":"NK-gfh33y","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.","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T16:35:56.341543505Z","updated":"2026-02-14T17:08:53.079904915Z"} +{"id":"NK-ghpdkr","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.","type":"task","status":"open","priority":2,"labels":null,"assignee":"","created":"2026-02-15T16:27:42.348183236Z","updated":"2026-02-15T16:27:42.348183236Z"} {"id":"NK-gjymiw","title":"FEEDS in sidebar needs to be more clearly a collapsible thing","description":"FEEDS in the sidebar needs a caret (\u003e that turns to V) or something similar to make it clear it's a toggle collapsible list thing","type":"feature","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T23:54:20.355824171Z","updated":"2026-02-15T00:06:02.456524674Z"} {"id":"NK-gnxc6e","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.","type":"feature","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T00:58:15.661695308Z","updated":"2026-02-14T01:29:12.82081713Z"} {"id":"NK-gqkh96","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.","type":"cleanup","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-13T03:54:30.298141982Z","updated":"2026-02-14T02:44:05.399097286Z"} +{"id":"NK-hidz4w","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.","type":"task","status":"open","priority":3,"labels":null,"assignee":"","created":"2026-02-15T16:23:36.906173277Z","updated":"2026-02-15T16:23:36.906173277Z"} {"id":"NK-hj6f9p","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","status":"open","priority":2,"labels":null,"assignee":"","created":"2026-02-15T01:04:54.404114014Z","updated":"2026-02-15T01:04:54.404114014Z"} {"id":"NK-hspao2","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.","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T05:13:11.587767054Z","updated":"2026-02-14T05:13:11.587767054Z"} {"id":"NK-hyej38","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.","type":"epic","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T00:47:25.74838134Z","updated":"2026-02-14T01:25:07.267016355Z"} +{"id":"NK-iklxn4","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.","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-15T16:12:01.013697894Z","updated":"2026-02-15T16:35:49.542636756Z"} {"id":"NK-iw9l7h","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.","type":"feature","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-14T01:04:11.588135487Z","updated":"2026-02-14T01:04:11.588135487Z"} {"id":"NK-jhludy","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.","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-13T20:14:48.84900972Z","updated":"2026-02-13T20:50:22.207833479Z"} {"id":"NK-jqpn98","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","type":"bug","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T01:22:17.546117265Z","updated":"2026-02-14T01:25:07.317174513Z"} {"id":"NK-jyw7lb","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","type":"feature","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T01:01:08.430978911Z","updated":"2026-02-14T01:21:11.002320114Z"} {"id":"NK-k04tet","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.","type":"bug","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-13T21:50:14.152486771Z","updated":"2026-02-14T02:43:56.02734439Z"} +{"id":"NK-k1p9ij","title":"Evaluate E2E test harness","description":"Evaluate the current E2E test harness (Cleaning up test environment...\nCleanup complete.\nBuilding backend...\nCreating data directory...\nStarting mock feed server on port 9090...\nMock Server PID: 166494\nMock server is up.\nStarting backend on port 4994...\nBackend PID: 166520\nWaiting for backend to start...\nWaiting...\nBackend is up!\nRunning E2E tests...\n\n\u003e frontend@0.0.0 test:e2e\n\u003e playwright test\n\n\nRunning 13 tests using 1 worker\n\n\u001b[1A\u001b[2K[1/13] [chromium] › tests/auth.spec.ts:12:5 › Authentication - No Password Required › should allow direct access to dashboard without login\n\u001b[1A\u001b[2K[2/13] [chromium] › tests/auth.spec.ts:25:5 › Authentication - No Password Required › should allow login with empty password\n\u001b[1A\u001b[2K[3/13] [chromium] › tests/auth.spec.ts:38:5 › Authentication - No Password Required › should report authenticated status via API when no password\n\u001b[1A\u001b[2K[4/13] [chromium] › tests/auth.spec.ts:53:10 › Authentication - Password Required › should redirect to login when accessing protected routes\n\u001b[1A\u001b[2K[5/13] [chromium] › tests/auth.spec.ts:64:10 › Authentication - Password Required › should reject incorrect password\n\u001b[1A\u001b[2K[6/13] [chromium] › tests/auth.spec.ts:79:10 › Authentication - Password Required › should accept correct password and redirect to dashboard\n\u001b[1A\u001b[2K[7/13] [chromium] › tests/auth.spec.ts:93:10 › Authentication - Password Required › should persist authentication across page reloads\n\u001b[1A\u001b[2K[8/13] [chromium] › tests/auth.spec.ts:109:10 › Authentication - Password Required › should logout and redirect to login page\n\u001b[1A\u001b[2K[9/13] [chromium] › tests/auth.spec.ts:128:10 › Authentication - Password Required › should report unauthenticated status via API\n\u001b[1A\u001b[2K[10/13] [chromium] › tests/auth.spec.ts:142:5 › Authentication - Complete Flow › should handle complete user flow without password\n\u001b[1A\u001b[2K[11/13] [chromium] › tests/crawl.spec.ts:4:5 › Crawl Integration › should add a feed and see items after crawl\n\u001b[1A\u001b[2K[12/13] [chromium] › tests/e2e.spec.ts:4:3 › Neko Reader E2E › should allow login, viewing feeds, and logout\n\u001b[1A\u001b[2K[chromium] › tests/e2e.spec.ts:4:3 › Neko Reader E2E › should allow login, viewing feeds, and logout\nStep 5: Navigate to Home\n\n\u001b[1A\u001b[2KStep 6: Logout\n\n\u001b[1A\u001b[2K[13/13] [chromium] › tests/font.spec.ts:4:5 › Font Theme Settings › should change font family when theme starts\n\u001b[1A\u001b[2K 6 skipped\n 7 passed (5.2s)\n\nTo open last HTML report run:\n\u001b[36m\u001b[39m\n\u001b[36m npx playwright show-report\u001b[39m\n\u001b[36m\u001b[39m\nTests passed!\nCleaning up...\nCleaning up test environment...\nCleanup complete.) which is brittle and resource intensive. Consider alternative approaches or refactoring.","type":"task","status":"open","priority":4,"labels":null,"assignee":"","created":"2026-02-15T16:23:52.252436663Z","updated":"2026-02-15T16:23:52.252436663Z"} {"id":"NK-k4y597","title":"[feature] light/dark/black toggle","description":"Add in a simple [light | dark | black] theme toggler like in the legacy version.","type":"feature","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T00:45:55.312953906Z","updated":"2026-02-14T01:29:20.073659889Z"} {"id":"NK-kqt9oc","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","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T20:19:10.70328135Z","updated":"2026-02-14T01:03:35.363466842Z"} {"id":"NK-kra45a","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","type":"feature","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-15T00:08:25.732991582Z","updated":"2026-02-15T01:04:54.350079542Z"} {"id":"NK-lrew5z","title":"UI Styling: Global Typography \u0026 Layout (Fixed Width)","description":"","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-13T18:04:57.254341682Z","updated":"2026-02-13T18:11:31.436752093Z"} +{"id":"NK-lrihov","title":"Re-enable and fix errcheck lints","description":"Re-enable 'errcheck' in .golangci.yml and fix the remaining ~140 issues, mostly related to unchecked Writes and DB operations.","type":"cleanup","status":"open","priority":3,"labels":null,"assignee":"","created":"2026-02-15T16:41:08.395284346Z","updated":"2026-02-15T16:41:08.395284346Z"} {"id":"NK-m8bya7","title":"Fix and Re-enable Playwright E2E Tests","description":"E2E tests were crashing the VM and timing out. Disabled them in package.json. Need to investigate resource usage and re-enable.","type":"bug","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T03:08:18.501189975Z","updated":"2026-02-14T04:00:03.995357386Z"} {"id":"NK-mbuw7q","title":"v2 ui bug - panel open by default","description":"Panel is closed by default, it should be open by default on desktop.","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T02:46:56.870671639Z","updated":"2026-02-14T03:08:17.322841854Z"} {"id":"NK-mgmn5m","title":"serve \"legacy\" version UI at /v1/ instead of /","description":"Let's \"softly\" start to deprecated the legacy version by moving it to /v1/ -- ideally this won't require any changes but there may be some relative/absolute URLs to adjust in the static files there or in rouoting","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T16:41:04.710679944Z","updated":"2026-02-14T17:38:25.35292336Z"} @@ -86,7 +95,9 @@ {"id":"NK-nx8dhw","title":"fix github ci","description":"seems to be broken, are the right things still in there given all the refactorings","type":"bug","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T18:02:19.485418738Z","updated":"2026-02-14T18:08:16.790742187Z"} {"id":"NK-o3n9jf","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.","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T16:35:58.328232962Z","updated":"2026-02-14T17:18:34.748238191Z"} {"id":"NK-ojdcmq","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.","type":"task","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-13T19:45:07.376295295Z","updated":"2026-02-13T19:45:07.376295295Z"} +{"id":"NK-ojga4q","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.","type":"task","status":"open","priority":2,"labels":null,"assignee":"","created":"2026-02-15T16:27:42.422337573Z","updated":"2026-02-15T16:27:42.422337573Z"} {"id":"NK-op5594","title":"Ensure 80% Frontend Test Coverage","description":"Configure coverage reporting in vitest and ensure the frontend codebase maintains at least 80% test coverage.","type":"task","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-13T05:46:24.13314466Z","updated":"2026-02-13T05:50:46.728239299Z"} +{"id":"NK-p0nfoi","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.","type":"feature","status":"open","priority":3,"labels":null,"assignee":"","created":"2026-02-15T16:49:31.008650778Z","updated":"2026-02-15T16:49:31.008650778Z"} {"id":"NK-p89hyt","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 /\n\nWe can keep serving it at v2/ as well if we want.","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T16:42:20.13241547Z","updated":"2026-02-14T17:38:26.362895517Z"} {"id":"NK-pmznme","title":"Implement ClientLogin and Token endpoints","description":"","type":"task","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-15T00:21:47.832112417Z","updated":"2026-02-15T00:44:41.338958256Z"} {"id":"NK-pr3re0","title":"Implement Stream Contents endpoint","description":"","type":"task","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-15T00:21:53.326022558Z","updated":"2026-02-15T00:44:41.477972444Z"} @@ -96,6 +107,7 @@ {"id":"NK-r1aqiw","title":"Implement Subscription List and UserInfo endpoints","description":"","type":"task","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-15T00:21:51.619650383Z","updated":"2026-02-15T00:44:41.428045944Z"} {"id":"NK-r39tqq","title":"username + password","description":"it's too weird to have just a password -- in the old UI i had a username but it was just ignored. but password managers get confused by this new no username thing.\n\nlet's make it so you can enter a username and password. to start, just let that be a no-op (it ignores the username and just pays attention to the password.)\n\nwe can consider later on if we want to make the username real and definable too.","type":"bug","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-15T02:56:35.68970604Z","updated":"2026-02-15T05:16:49.35160585Z"} {"id":"NK-r6nhj0","title":"import/export","description":"Import/Export has only ever been partially implemented. Let's finish it up across OPML (de facto standard) but also simple txt line oriented input/output. We may need to file a ticket to deal with the async crawling as part of this.","type":"feature","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-14T16:45:04.739162003Z","updated":"2026-02-14T17:42:20.713094047Z"} +{"id":"NK-r8rs7m","title":"filtiering behavior between all/unread/starred + feeds","description":"The filters are additive, but the UI isn't working that way right now.\n\nalways one of these is selected\n-\nUnread -- filters the list to only unread items\nAll -- no filter applied, shows read+unread\nStarred -- filters to everything starred, regardless of read state. Since you can't star things without reading them!\n\nFEEDS\nby default *none* are selected, so there is no filtering\nOnce one is selected, that filter is applied but it's additive -- if you are in `all` it shows `all` but filtered to that feed. Both are bolded. If youo click `unread` it would just show unread in that feed.\n\nThis is a bit tricky, you can look at the old UI implementation to see some logic that reflects this. We may want some tests too to catch this bug next time!\n\nNice to have: be able to multi-select feeds (that wasn't possible in the old version) but that can be a follow-up ticket.","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-15T16:38:50.437153325Z","updated":"2026-02-15T16:49:24.72884868Z"} {"id":"NK-rhelrq","title":"Add end-to-end integration test for complete crawl cycle","description":"Create an integration test that verifies the complete crawl workflow: start server with background crawling enabled, add a feed via API, wait for background crawl to execute, verify items are fetched and stored. This would require mocking or using a test RSS feed and potentially adjusting timing for faster test execution.","type":"task","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-14T20:44:31.052207214Z","updated":"2026-02-15T05:20:23.090352944Z"} {"id":"NK-ric1zs","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","status":"closed","priority":3,"labels":null,"assignee":"","created":"2026-02-13T04:26:55.864725765Z","updated":"2026-02-13T04:26:55.864725765Z"} {"id":"NK-rn4nzp","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.\n\nthe current default (helvetica neue, palatino)\na fancy all serif stack\na no-nonsense modern san-serif stack\na terminal inspired fixed width stack","type":"feature","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-14T17:10:02.185477382Z","updated":"2026-02-14T18:12:30.253145852Z"} @@ -118,6 +130,7 @@ {"id":"NK-wjnczv","title":"Vanilla JS: Test Infrastructure \u0026 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.","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T05:13:23.292982698Z","updated":"2026-02-14T05:34:53.241988263Z"} {"id":"NK-x924bu","title":"test coverage","description":"assume the code works properly (it mostly does)\nget to 90% test coverage on the go code","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-13T01:52:01.042476226Z","updated":"2026-02-13T03:54:21.526519915Z"} {"id":"NK-ymf1jb","title":"add \"star\" back in","description":"rather than the word \"star\" it should just have a star that changes colors right next to the title","type":"task","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-13T19:29:05.582140321Z","updated":"2026-02-13T20:27:31.598346438Z"} +{"id":"NK-zd39pt","title":"Fix backend linting issues reported by golangci-lint","description":"golangci-lint reports 64 issues including 46 errcheck violations (ignored errors in web handlers), 13 staticcheck issues (e.g., using 307/401 literals instead of http constants), and minor formatting/unused param issues. These should be addressed to improve code quality.","type":"cleanup","status":"open","priority":3,"labels":null,"assignee":"","created":"2026-02-15T16:11:26.179223018Z","updated":"2026-02-15T16:11:26.179223018Z"} {"id":"NK-zl922p","title":"slow scrolling in v2 ui compared to v1","description":"When using j/k to go to the next feed, they appeared instantly, now it feels like a slow scroll. Make it speedy again.","type":"bug","status":"closed","priority":0,"labels":null,"assignee":"","created":"2026-02-14T03:41:02.267766275Z","updated":"2026-02-14T04:27:10.368160216Z"} {"id":"NK-zs9we8","title":"UI Styling: Sidebar (Fixed, Gray Background)","description":"","type":"","status":"closed","priority":2,"labels":null,"assignee":"","created":"2026-02-13T18:05:16.188317572Z","updated":"2026-02-13T18:11:46.213993245Z"} {"id":"NK-zt4e32","title":"Implement Frontend Feed List","description":"Create feed list view in new frontend. Fetch feeds from API.","type":"task","status":"closed","priority":1,"labels":null,"assignee":"","created":"2026-02-13T05:44:01.58866298Z","updated":"2026-02-13T05:59:46.132148641Z"} @@ -136,6 +149,7 @@ {"id":"NK-d7zgu6w","from_ticket_id":"NK-fm15vq","to_ticket_id":"NK-ymf1jb","type":"created_from","created":"2026-02-13T20:27:36.795511524Z"} {"id":"NK-d86tgcs","from_ticket_id":"NK-ed1iah","to_ticket_id":"NK-1phdpf","type":"created_from","created":"2026-02-13T04:26:55.917754798Z"} {"id":"NK-dda9zfr","from_ticket_id":"NK-lrew5z","to_ticket_id":"NK-mwf9q2","type":"created_from","created":"2026-02-13T18:04:57.273164732Z"} +{"id":"NK-de65jjz","from_ticket_id":"NK-p0nfoi","to_ticket_id":"NK-r8rs7m","type":"created_from","created":"2026-02-15T16:49:31.043201298Z"} {"id":"NK-dew7hvb","from_ticket_id":"NK-tw0nga","to_ticket_id":"NK-59kbij","type":"created_from","created":"2026-02-13T15:01:33.825547908Z"} {"id":"NK-dffwhjf","from_ticket_id":"NK-2t5ijy","to_ticket_id":"NK-lrew5z","type":"created_from","created":"2026-02-13T18:11:47.471931543Z"} {"id":"NK-dfyyk6k","from_ticket_id":"NK-hj6f9p","to_ticket_id":"NK-kra45a","type":"created_from","created":"2026-02-15T01:04:54.417714174Z"} @@ -151,6 +165,7 @@ {"id":"NK-dlvmiyc","from_ticket_id":"NK-7tzbql","to_ticket_id":"NK-bsdwqz","type":"created_from","created":"2026-02-13T05:02:57.392616851Z"} {"id":"NK-dm35o6g","from_ticket_id":"NK-d4c8jv","to_ticket_id":"NK-chns2b","type":"created_from","created":"2026-02-14T04:46:32.151239137Z"} {"id":"NK-dm75oc8","from_ticket_id":"NK-3om7x2","to_ticket_id":"NK-zt4e32","type":"created_from","created":"2026-02-13T05:59:46.169842933Z"} +{"id":"NK-dmmxnj3","from_ticket_id":"NK-lrihov","to_ticket_id":"NK-ak4om3","type":"created_from","created":"2026-02-15T16:41:08.42415823Z"} {"id":"NK-dmow9sy","from_ticket_id":"NK-iw9l7h","to_ticket_id":"NK-uywybr","type":"created_from","created":"2026-02-14T01:04:11.599126072Z"} {"id":"NK-dnspb2r","from_ticket_id":"NK-6o87rr","to_ticket_id":"NK-d4c8jv","type":"created_from","created":"2026-02-14T04:47:40.652696057Z"} {"id":"NK-dnw8qnj","from_ticket_id":"NK-qwef98","to_ticket_id":"NK-mwf9q2","type":"created_from","created":"2026-02-13T18:05:18.469080925Z"} |
