Spaces:
Running
Running
Commit History
3 days ago
-
feat(hn): Lasting gets Hacker Papers' controls: views, sorts, years, fields
siddhm11 +1: Claude Opus 5.5DAIR.AI's Hacker Papers lets a reader browse the list by view, sort, year and field, and shows each paper's year-by-year record and dated threads. Lasting now does the same, beside "Closest to you", which it keeps: - Views: Most lasting, Longest running (first link to latest), Hidden gems, Recently mentioned, Saved (lasting papers in the reader's library). - Sorts: newest, oldest, most people, most threads. - Published: the last four years one by one, 2020-2022, 2015-2019, before 2015, by the year in the arXiv id. - Fields: AI & ML, computer science, mathematics, physics, and biology, economics & statistics, by primary category, with counts. - Each row: a bar per year since 2007 on one axis for every row, and its eight most relevant threads in date order, each saying how it links the paper, behind a disclosure. A hidden gem is a lasting paper cited 1 to 49 times and at least two years old: 346 papers, led by "Markets are efficient iff P = NP", "Magic: The Gathering is Turin…7ac1da1 -
feat(hn): On Hacker News on paper pages, a Lasting list, and HN lately on /trending
siddhm11 +1: Claude Opus 5.5HN_PAPER: the paper page (v2) gains "On Hacker News": how many people linked the paper, in how many separate months, a strip of people per year, and its three main threads (submissions that drew attention first, then the discussions that linked it most). It says links, not votes: most papers on HN are cited in an argument, not recommended. HN_LASTING: /trending/lasting lists the papers HN keeps coming back to. A reader with saves or chosen areas lands on "Closest to you", ranked by the shelf's ranker with people on HN as the popularity term; everyone can browse the whole list, 25 a page, by area. One list per page, so a paper never shows twice. The Trending tab gains a "This week | Lasting" switch. HN_FRESH: /trending gains "On Hacker News lately": papers linked by at least two people in 30 days, or posted and upvoted to 20 points, the reader's closest first. For readers outside ML this is the only part of the page in their field: HN and Hugging Face's lists barely overlap. All thre…ad66333
12 days ago
-
feat(trending): cards open on the paper's figure, and /trending puts papers first
siddhm11 +1: Claude Opus 5.5Trending cards had no picture and /trending led with 16 topic boxes, so a logged-out visitor scrolled about 3,300 px before reaching a paper. - Pictures come from our own figure reader, never Hugging Face: of the week's 312 papers only 112 had HF media (73 of them MP4) and HF's thumbnail is the PDF's first page, while our reader had a figure for 179 of 187 papers read, served from our origin with its credit. - card_data.add_figures sets each card's figure from saved sources only; first_figure is shared with the feed card. - trending_shelf.warm_figures queues the week's unread papers for figure_prewarm on every refresh, most upvoted first (at most 200), and the moving topics' top papers after each topics refresh. - The card: a 16:10 plate that shimmers until the figure paints, then fades it in (app.js); no figure yet or a failed one shows the paper's name ("WeVisOne-VL") or its upvotes instead of an empty box. It names the HF organisation (text only) or the first auth…1960336 -
feat(trending): Trending becomes a main tab, every topic gets a page, and new readers see trending in their areas first
siddhm11 +1: Claude Opus 5.5The owner's decisions on the Trending Tab Plan (doc 06, 2026-10-25): - Bars: Feed · Trending · Search · Library on desktop and phone. Collections moves inside Library, which gets its own tabs (Saved · Collections · Recent). With TRENDING_PAGE off the bars keep Collections, so nothing links to a page that is off. - /trending says which lists it shows ("Lists of 19–23 Oct · next list Mon 26 Oct" at weekends), leads with chips for rising and cooling topics and the reader's areas, gives shares in plain numbers too ("1 in 37 → 1 in 18"), puts the topics before the area rows, and lists the 10 named topics that fail the trend test as "Steady" with their share now, never as moving. - /trending/topics/<id> for every named topic: its 26-week line and label, its papers on this week's lists (papers listed since the daily grouping go to their nearest topic), its 10 most upvoted, recent arXiv papers nearest its middle paper (new qdrant_svc.search_recent on the recent shard, labe…408392e
13 days ago
-
fix(trending): /trending shows the week's top 9, and one rule under its heading
siddhm11 +1: Claude Opus 5.5Ten cards in the three-column grid left one alone on the last row; nine fill three rows. The first section's top rule doubled the heading's own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>2c3ec3c -
feat(trending): rising topics from 26 weeks of Daily Papers, and a /trending page
siddhm11 +1: Claude Opus 5.5Once a day, trending_topics clusters the last 26 weeks of lists the daily job stores in Turso (hf_daily_papers, PR #56) the way §3.3 clusters a reader's saves: Ward on L2-normalised vectors from Qdrant, K = 24, medoids, and topic ids kept across days by stabilize_cluster_ids. A topic is rising or cooling only when the slope of its weekly share beats the same slope with every paper's week shuffled 2,000 times, Benjamini-Hochberg q < 0.05, and it is shown only under a phrase from its papers' titles, keywords and summaries that 30% of them carry. Phrases never cross a field; no model writes names (doc 06 defers LLM cluster summaries to Phase 8). On the 24 Oct data (5,176 papers): 30 s a day on a laptop, ids stable across recomputes, rising today: Skills, Robot, World Models. /trending lists the week's papers in the reader's interests, the rising and cooling topics with their weekly-share lines and top papers, and the week's most upvoted, with a footnote on the method; its cards log expo…e51c693 -
feat(search): trending papers step up in search for a few days (SEARCH_TRENDING)
siddhm11 +1: Claude Opus 5.5A paper in the top quarter of this week's Daily Papers that retrieval already found in its first 50 may take one of the last 2 places the cross-encoder scores. If it scores at least half the best, it gains up to 0.25 x the best score, in full for its first 3 days on the list and fading to nothing at 7; at most 2 papers per search. A moved result is tagged "Trending on Hugging Face" with its strongest fact; the classic card is byte-for-byte unchanged otherwise. Switch SEARCH_TRENDING: off (default), shadow (search_meta.trending_shadow records each would-be move, from and to, and nothing changes on screen) or on. No preview: search results are cached for everyone. Doc 06, 2026-10-24. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>d3ea811 -
feat(trending): each trending card says why, in counts from the lists
siddhm11 +1: Claude Opus 5.5Every shelf card now carries its place on the day it was listed ("#1 of 92 papers on 30 Sep") and, in the top quarter of a week of 20 or more, its place in the week ("top 1% of this week's 404"); relative places because the lists ran from 101 to 404 papers a week and upvotes are heavy-tailed (median 13, p99 271 over 26 weeks). Hugging Face's one-line summary is shown labelled as theirs, stars are shortened (5.7k), and comment counts are never shown: nearly every paper has one or two. The card moves to partials/trending_card.html so /trending can reuse it; its topic line and the shelf's /trending link render only once a later change attaches a topic. rank() and shelf_for() take a size, week_top() lists the week's most upvoted, and trending_now() hands search the week's papers with their freshness (full for 3 days, gone at 7). Doc 06, 2026-10-24. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>3c99209
14 days ago
-
feat(feed): trending in your interests, a shelf of Hugging Face Daily Papers
siddhm11 +1: Claude Opus 5.5Readers in the clustered tier get up to 6 papers from Hugging Face Daily Papers (last 7 days, refreshed every 3 hours) in one block after the fourth card of page 1, loaded once the page is on screen. A paper qualifies when it is as close to one of the reader's interests as the 25th percentile of their own saves (clamped 0.55-0.70; 0.60 below four measurable saves); the order is closeness + 0.07 * log10(upvotes), each interest gets max(2, ceil(6/K)) places first, and fewer than 3 qualifying papers means no shelf. The shelf holds no feed slot, so quota, MMR and the served order are untouched (doc 06, 2026-10-23). Its cards carry their own query_id, propensity 1.0 and policy trending_shelf_v1 through links, Save and the exposure log; what it shows counts as shown for the feed and the next shelf. Interest names come from the feed page it sits on. Vectors come from Qdrant through the shared cache, so nothing is embedded on the Space. Switch TRENDING_SHELF (off by default); /healthz/runtim…727c02a -
feat(onboarding): describe your work in a sentence and get its areas picked
siddhm11 +1: Claude Opus 5.5A newcomer often can't map their work onto arXiv's area names. Step 1 now opens with "In a sentence": the description is searched (hybrid search with no LLM rewrite, so it reaches no model, and it is not stored), and the areas its top papers sit in are picked for the reader to check, with the evidence: "Picked Robotics, Computer Vision from 10 matching papers, like 'DexVIP: ...'". Picked areas carry a "from your words" tag, suggestions only add to what is already picked, and step 2 opens on papers for the sentence instead of popular ones. Doc 06 cites language-based preferences as competitive near cold start (Sanner et al. 2023). A paper's primary category counts 1 and a cross-list 1/2: cs.LG is cross-listed on so much that, counted fully, Machine Learning would be suggested for most descriptions. Probed on 12 descriptions with word-match search only (no BGE-M3 locally), 11 got sensible areas; "I like space stuff" matched COCO-Stuff. Logged in doc 06; CURRENT-STATE and CLAUDE.md updat…4c1781d -
feat(onboarding): a drawing of each research area on its card
siddhm11 +1: Claude Opus 5.5An area's name alone often means nothing outside the field: "Machine Learning" or "Condensed Matter" tells a newcomer little about what they would be choosing. Each of the 20 cards on /onboarding and /interests now shows the field doing its typical thing: a detector's box round a cat for Computer Vision, a line fitted to points with y = wx + b for Machine Learning, a question answered step by step for AI, a Feynman diagram, a Bell-pair circuit, the chord rule on an elliptic curve. The drawings are inline SVG written by scripts/build_area_art.py; the plotted ones (the curve, the helix, flow round a cylinder, the spectrogram) are computed. They take the page's colours in both themes and turn green with a picked card, and hover redraws the one annotated stroke (off under reduced motion). They are decorative to screen readers: the name and description still carry the meaning. Not images, because Hugging Face refuses binary files in pushed history. About 10 KB gzipped for all twenty. Co-A…ec199d7 -
fix(search): the query shows in the box, not as the heading
siddhm11 +1: Claude Opus 5.5The search page printed the query as its heading, in the box and in the result count ("10 results for ..."), and the empty state quoted it again. b804177 kept the heading in step with a search from the box: that fixed a stale heading but kept the repetition. The heading is now "Find papers", naming the page like every other masthead, and the count and the empty state no longer quote the query. The tab title still names it, so tabs and the browser's history tell searches apart. With the box the only place on the page that names the query, it has to be right after Back and Forward. htmx restores those from saved HTML, which holds the value the page was served with, not what was typed: Forward to a search run from the box showed its results under the first query. app.js now sets the box from the URL when htmx restores a page; the browser test fails on that line without it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>d8d4da6
17 days ago
-
feat(admin): readers, searches and AI history dashboards
siddhm11 +1: Claude Opus 5.5Three owner-only pages next to AI usage, with tabs across all four: /admin/readers readers today, this week and month, the share who came back, what they did, new and returning readers per day, and readers per month since launch with where saves came from /admin/searches searches per day with and without results, the share that led to an opened or saved paper, the most searched queries, queries that found nothing, and the latest searches with their AI rewrite and overview /admin/ai/history every AI call by paper (title, plain summary, briefing outcome, tokens) and by search (rewrite, overview) The owner's own use is left out unless 'Include my own use' is chosen. Model-written text is shown as text, never markup. Every chart now comes from one builder with one tooltip script: whole-number ticks for small counts, about seven l…e8530b8 -
feat(admin): an AI usage dashboard at /admin/ai
siddhm11 +1: Claude Opus 5.5/healthz/ai is data for machines; this is the same data for a person, visible only with the preview token (404 for everyone else, noindex): today model calls, tokens, share answered by a backup model, share served from the cache, failed or busy calls stands out plain sentences with a status icon and word: the feature using most tokens (and whether it is cached), a model near its daily tokens or its minute, backup answers over a tenth, busy or failed calls, cache hit rates, declined briefings, reports models each model's tokens today against 200,000, and the requests and minute-tokens Groq last reported, as meters labelled when close features per feature: calls, answered, backup, cut off, failed, tokens and time per call, cache hit rate, every outcome count history tokens per day for 14 days, stacked by feature, one tooltip per day listing every feature, and th…61a86da
18 days ago
-
feat(search): a small figure beside each search result (SEARCH_FIGURES)
siddhm11 +1: Claude Opus 5.5Search is for scanning titles, so its figure is a small thumbnail to the right of the text (7.5rem, 4.75rem on a phone), not the feed card's large figure. It appears only for papers with a figure already saved (card_data, local reads only); the warm-up reads the top five results for next time. Without a figure the classic card's markup is unchanged, and it is shared by every page. The thumbnail repeats the title's link with #sec-fig, so it is out of the tab order and hidden from screen readers, with its credit in the title attribute. A thumbnail that fails to load is hidden. Eye-tracking (Google) and a 2025 IJHCI study found result thumbnails make the wanted result faster to find without changing how people scan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>7f2981f -
fix(figures): hide a figure whose thumbnail cannot be made
siddhm11 +1: Claude Opus 5.5/fig/ answers 404 when no thumbnail can be made, and the page showed a broken image box in its place. app.js now hides that figure: the card's figure, the key-figure section, or its tile in All figures, and that section once no tile is left. It catches failures before it loaded too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>e10f732 -
fix(feed): pin the card menu to the corner when a card has no interest label
siddhm11 +1: Claude Opus 5.5Cards from the category and popularity tiers have no interest label, so the top row held only the menu button and left a blank band above every title. The menu now sits in the card's corner on those cards and the title keeps clear of it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>f3db993 -
feat(feed): two-column wide feed with an interest rail (FEED_WIDE)
siddhm11 +1: Claude Opus 5.5From 1180 px the feed is a grid of small rows with each card spanning rows to its height, set by a ResizeObserver, so two columns pack without moving anything: it stays one list in served order (§3.1), auto-flow row and never dense, and the loader still swaps in place. A sticky rail holds the issue line, Discover more, the interests on the page with counts (built from the cards with textContent), a client-side filter that hides cards and says "Showing N of M", and the Plain terms / Abstract preference. Filter use is recorded as a UI event, since hidden cards were still served. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>260969f -
style(feed): card v2 layout, per-card text tabs and Why this paper
siddhm11 +1: Claude Opus 5.5Card tabs and the menu's Why this paper are delegated, so appended pages need no binding; cards open on the reader's remembered text preference. The action row's own Why button, which a Save response re-renders, stays hidden on these cards. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>f1da4df -
test(e2e): briefing and Ask in the browser; fix an outline race
siddhm11 +1: Claude Opus 5.5The seeded world gains a cached briefing and two cached answers for SatNav. New browser tests: the briefing's links and outline entries, a suggested question echoed then answered with a cite, Enter sends while Shift+Enter doesn't, a missing model says busy, the phone sheet opens and closes on Escape with focus back on its button, and the lightbox asks about its figure. Fixed on the way: the section observer could override the last outline entry at the bottom of the page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>0cb3a12 -
fix(paper): background fragments fail quietly; limits sized for shared networks
siddhm11 +1: Claude Opus 5.5The browser tests opened paper pages faster than /briefing's 20-a-minute limit, and each 429 raised a "Something went wrong" toast for a fragment the reader never asked for. Fragments that load after paint now carry data-quiet and fail silently. The per-paper limits also assumed one reader per address, which a university network breaks; the cache-backed fragments now allow 60 a minute and Ask 20. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>0ef8102
19 days ago
-
feat(ask): the chat panel, phone bottom sheet and figure questions
siddhm11 +1: Claude Opus 5.5A panel beside the text from 900 px and a bottom sheet from a floating button on a phone, with focus kept inside it until Escape. The question is echoed into the log as it's sent, Enter sends and Shift+Enter starts a new line, suggested questions disappear once asked, and the lightbox's Ask about this figure opens the panel and asks. Styles ported from the preview. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>a571e6c -
feat(briefing): three things to know, how it works, where you'd use it
siddhm11 +1: Claude Opus 5.5A model writes the briefing from the paper's own passages (abstract, introduction, key sections, captions; at most 24,000 characters) and code decides what survives: each point must cite a passage that was sent and hold only numbers found in it, steps and the use line only numbers found in the passages, and fewer than two surviving points means no briefing. Digits inside names (3D, GPT-4) are not counted as numbers. Cached per paper version, parser, prompt and model; one generation in flight per paper; readers wait at most 12 s and a slow one finishes for the next visit. BRIEFING shadow generates without showing. Report a problem stores to content_reports. Rate limits for /briefing and /report. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>1694185 -
fix(paper): mark the last outline entry at the bottom of the page
siddhm11 +1: Claude Opus 5.5A short last section never reaches the band the outline watches, so the outline kept pointing at the section above it. Found by the browser tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>5866d4e -
feat(paper): summary tabs, figure lightbox, outline and maths
siddhm11 +1: Claude Opus 5.5paper.js: ARIA tabs with arrow keys and a remembered choice; an empty or failed plain summary falls back to the abstract; figures open in a dialog built with textContent, and focus returns to the figure on close; the outline marks the section in view; KaTeX renders $...$ in .tex elements with trust off. app.js gains the shared overflow menu and Copy arXiv ID. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>692c41d -
style(paper): three-zone layout, summary box, figures and lightbox
siddhm11 +1: Claude Opus 5.5Ported from the approved preview using the existing tokens, plus --plate for figure backgrounds and --note for annotations. Outline, reading column and Ask from 1180 px; reading and Ask from 900 px; one column on a phone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>51fbe73 -
build: vendor KaTeX 0.18.11 for maths on the paper page
siddhm11 +1: Claude Opus 5.5Minified build, auto-render and woff2 fonts from the npm tarball, its sha512 integrity checked against the registry. Served from /static, since the site loads nothing from other origins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>d1b0598
-
feat(onboarding): validate category choices and add an interests editor
siddhm11 +1: Claude Opus 5.5Completed onboarding redirected to the feed, leaving no way to change research areas. /interests edits them at any time without touching saved papers. Onboarding JSON and the form share one contract: a list of up to eight known category groups; anything else is rejected with 422 and writes nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>65cb3f3
-
feat(search): show truthful request progress
siddhm111c7dfd8
-
feat(paper): put comprehension on the page that was built for it
siddhm11 +1: Claude Opus 5Two surfaces, one LLM-free and one generated. The paper page existed and was empty; this is what it was for. READING DENSITY (app/readability.py) A three-band badge from notation rate, acronym rate, long-word share and sentence length. No model, no network, microseconds — cheap enough to compute inline anywhere. It deliberately does NOT claim to measure how hard a paper is to UNDERSTAND. doc 01 names difficulty ratings as an unfilled gap and also says why the obvious approach fails: Flesch-Kincaid and FORCAST are calibrated on general prose and mislead badly on academic writing, where a conceptually simple paper can score unreadable. What IS honestly computable from text is how dense the abstract is to read, so the wording is "Dense with notation", never "hard". Thresholds are the terciles of the real corpus (n=525), not round numbers. My first guess of 0.34/0.50 put 82.5% of papers in a single band — a label that never discriminates costs the reader attention and returns nothing. …c3db102 -
feat(paper): give a paper a home on this site
siddhm11 +1: Claude Opus 5No URL on this site was ABOUT a paper. Every card sent its title straight to arxiv.org, so the product had nothing of its own to share, to link to, or to return to. Three structural consequences: - Nothing was shareable. The Open Graph tags added earlier could only describe the feed, because the feed was all there was to describe, so a pasted link never carried a paper's title. - There was nowhere to put comprehension. Plain-language explanation, difficulty, "read this first" — each needs a surface, and a card in an infinite feed is not one. - Every session ended at arxiv.org. GET /p/{arxiv_id} serves full metadata, the abstract unclamped (a reader who opened this page chose to stop), per-paper og:title / og:description / og:type=article, links to the PDF and the 3D map, and a "What sits near this" section. That section is drawn from the paper's OWN embedding, not the reader's profile. The distinction is the point: it answers "what is this paper next to", which…596fcec -
fix(ui): a phone had no way to change theme
siddhm11 +1: Claude Opus 5`.nav` is display:none below 720px and the theme toggle lived inside it, so the control was unreachable on mobile — on a product whose whole premise is reading on a phone. Moved into the top bar rather than the bottom nav: the bottom nav is a four-item grid and a fifth item would unbalance it, while the top bar has nothing else on the right at mobile widths. It carries its own margin-left:auto below the breakpoint, since that was inherited from .nav. Also records the batch of signal-integrity and resource fixes in doc 06 and adds CLAUDE.md §3.6b, so the invariants they establish are stated where the next change will look for them. Verified by the real-browser suite, which exercises both themes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>02009a6 -
fix(events): un-saving a paper is not a dislike
siddhm11 +1: Claude Opus 5"Remove" on an already-saved card posted to /not-interested, because that was the only unwind path that existed. Correcting a misclick — or just tidying the library — was therefore logged as a `not_interested` interaction, added to the negative deque, and folded into the negative EWMA profile that heuristic_score subtracts at 0.15. Those are different acts. "I did not mean to save this" is not "show me less like this", and conflating them poisons both the only signal the system has for genuine dislike and the interaction log any future ranker will train on. Adds POST /api/papers/{id}/unsave, logged under its own event_type so an undo stays distinguishable from a dislike in the training data. The button declares itself with data-action="unsave" and app.js routes on that rather than hardcoding one endpoint. The undo toast says "Removed from your library" instead of "from your feed", which is what actually happened. The positive contribution already folded into the long-term profile is…468b9f9 -
fix(ui): stop the card misrepresenting the abstract it was given
siddhm11 +1: Claude Opus 5Two defects, measured against the 509 real abstracts in the local cache. The ingest cap truncates abstracts at 500 characters: 406 rows (79.8%) sit exactly at the cap and 403 of those (99.3%) stop without terminal punctuation — one ends literally "...we study a parameter". The card rendered that stump with no ellipsis and no marker, so a reader could not tell the sentence had been cut rather than badly written, and "Read more" expanded to reveal only more stump. Now marked, with a link to the full text on arXiv. The cap is measured on the RAW string and the punctuation on the stripped one: the cut often lands on a space, so stripping first loses 402 of the 406 real cases. Repairing the DATA is a PHASE7 arXiv backfill (~7,200 requests) and is out of scope here. Separately, _lead_split returns ("", whole) when it finds no confident sentence boundary — 1.6% of real abstracts. The card then emitted `<p class="card-abstract is-clamped">` containing only `<span class= "rest">`, and `.is-c…d63c4ca
-
feat(ui): make the multi-interest engine visible and give the page ink
siddhm11The frontend had one content component. paper_card.html renders the Feed, Search, Library and Collections, and every page is a vertical stack of it, so the product reads flat by the fifth screen no matter how well that card is styled. Separately, every prior design decision here had been subtractive -- hero removed, badges removed, timings removed -- each correct on its own, and the sum was restraint with nothing left to be restrained about. WHAT THE PIPELINE KNEW AND NEVER SAID * Cluster identity. Each card now carries a tone and the interest's name, and the feed heads with a composition strip. Because stabilize_cluster_ids() Hungarian-matches indices across reclusterings, a tone stays attached to the same interest between sessions -- an existing mechanism that was collecting no payoff. Exploration picks deliberately lose it: they are chosen for being OUTSIDE the profile, so badging them with an interest would be a lie. * The match score. Cosine against the r…1730744
-
feat(collections): curated reading tracks that seed the recommender
siddhm11 +1: Claude Opus 5Cold start asks a new user to pick arXiv categories, but cs.LG is ~302k papers -- far too coarse to retrieve against, and the resulting Tier 0 feed was a citation sort. A collection is a much sharper signal: following one replays its anchors through the ordinary save path, which puts the user straight past the >=5-save threshold into Tier 1 multi-interest clustering and skips the weakest part of the pipeline entirely. Semantic Scholar's Research Feeds work exactly this way -- the feed is seeded from a curated Library folder, with a documented minimum of "5 relevant papers ... and 3 non-relevant". Every track here carries at least 6 anchors, so one click clears that budget. Eight tracks, 66 anchors, each with a curator note: LLM inference, RAG, agents, fine-tuning/alignment, diffusion, embeddings, scaling, evaluation. All 66 verified present in the production vector store before writing a line of UI -- an anchor with metadata but no embedding would render perfectly and silently fail t…f283a87
-
feat(frontend): infinite paginated feed and a hand-written design system
The feed used to end. REC_LIMIT (10) papers plus 2 exploration picks, then a dead end — and dismissing shrank it further, so actively triaging drained the page toward empty. That is an inbox, not a feed. Feed - GET /api/recommendations?page=N&query_id=… The first request ranks a 60-deep pool and caches the ORDER under its query_id; later pages replay it, so they cost a metadata fetch rather than a recluster + re-retrieve + rescore. Measured cold, one process: page 1 3506ms, page 2 1.6ms, no overlap. - Exploration is drawn PER PAGE from a pre-shuffled pool, so doc 06 §3.5's "2 serendipitous papers per feed" holds for every page. Injecting once over the pool would dilute the ratio and strand every pick on the last page, since inject_exploration appends. - Scroll-to-load is driven by an IntersectionObserver in app.js that clicks a real <button>. Both htmx built-ins were tried against the deployment first: `revealed` cannot fire when combined with a second trigger (htmx's …99c77d4
-
feat: complete premium frontend redesign
siddhm113f70e4a
-
feat: UI Polish and AI Search Summaries
siddhm11- Add mobile-responsive navbar with hamburger menu - Redesign index hero section and empty saved state - Polish paper cards with year pills and citation icons - Add AI Overview generation via Groq using llama-3.3-70b-versatile - Async load AI summaries in search results via HTMX - Add site footercd54524
-
Phase 5: Cold-Start Onboarding + UI Redesign
siddhm11NEW FEATURES: - 2-step onboarding wizard (category select → seed paper search) - 20 curated arXiv category groups with friendly names + icons - Dark mode default with theme toggle (localStorage persistence) - Glassmorphism navbar, Inter font, brand rename to ResearchIT - Tier 0 popularity fallback: trending papers filtered by categories - Auto-mark existing users as onboarded (no disruption) NEW FILES: - app/routers/onboarding.py (5 endpoints: page, save, search, complete, skip) - app/templates/onboarding.html (standalone wizard, no base.html) - app/templates/partials/seed_search.html (embedded search for seeds) - app/static/styles.css (animations, hover effects, category badges) - docs/phases/PHASE5-Cold-Start-Onboarding-And-UI.md (design doc) - tests/test_onboarding.py (11 tests) MODIFIED: - base.html: dark theme, glassmorphism, theme toggle, Inter font - config.py: CATEGORY_GROUPS taxonomy, expand_category_groups() - db.py: user_onboarding table, 4 new functions - main.py: onboard…7106701