Repository navigation
feat: show who wrote the wire in the left rail - #74
Merged
Merged
Conversation
This was referenced Oct 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Session 2 of 4 (rails). Adds the first left-rail panel: how the feed's current window splits by origin, and how its articles were found.
Changes
origin_counts(session, since)incatalog/facets.py. One COUNT perOrigin, built withorigin_condition, zeros included. Alsounlabelledandfound_viagrouped counts.GET /api/v1/articles/origins?since=<iso>, thin adapter, 422 on a badsince.OriginCount,FoundViaCount,OriginCountsincatalog/models.py.types.gen.ts,sdk.gen.ts,schemas.gen.ts.components/Rails/panels/WhoWrote.tsx, registered first inLEFT. Only change topanels.tsxis the import and the oneLEFTentry.RailPanelDefis untouched.PUBLISHED_DAYSandcutoffIsoare now exported fromArticlesList.tsx, andORIGIN_OPTIONSfromFeedFilters.tsx.foreground/45on a faint track. The active From row and its label are paper. A click setsorigin, and clicking the active row clears it.found_viathat isn'tHacker Newscounts as a newsletter.["articles", "origins", dateRange], staleTime 5 min.docs/product.md: one line under the feed section.Where I departed from the plan
marked_for_deletion_atis not excluded. The plan says to exclude it "same as the feed", but the feed (_filtersinarticles.py) doesn't exclude those rows. The plan's main rule is that the numbers always match what the From filter shows, so I kept that rule and left the marked rows in.unlabelledcounts posts only. These are posts by anunknownpublisher. A repo, paper or model from an unknown publisher already counts under its own origin. With this,total = sum(origins) + unlabelled.[hides and shows the left rail, with the state surviving a reload. The merged shell (feat: add collapsible side rails to the feed #72) doesn't work that way: on a wide screen the rails are always open,[does nothing, and only a panel's folded state is saved. The test checks what the shell actually does:[leaves the rail visible, and folding the panel survives a reload in both directions.postfrom anindividualpublisher, and the row count must match. Row text can't tell a writer from other publishers.Verification
prestart.shandpytest. Result: 537 passed, 1 failed. The failure istest_read_endpoints_are_public[/search?q=agents]: the test downloads an embedding model and the sandbox proxy blocks it (403). It's unrelated to this change.catalog/tests/test_routes.py:sincebounds the countsfound_viagrouping, including nullsinceruff check,ruff format,mypy,tyandbiomeall clean.bun run buildpasses.tests/rails.spec.ts: all 4 pass (1440, 1000, 390, Writers click).likes.spec.ts"shows Liked / My profile / Password / Danger zone tabs". It fails the same way on master, since sign-in has no passwords and the profile has no Password tab.🤖 Generated with Claude Code
https://claude.ai/code/session_0183b3dLpUezpQ8TCgDQnysM
Generated by Claude Code