Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
382 commits
Select commit Hold shift + click to select a range
4ad5b78
Split Filters into Repo and People controls with a chip row
jarstelfox Jul 20, 2026
fdb2462
Put star and mute one kebab away on every row
jarstelfox Jul 20, 2026
71958f9
Add weight and viewer-state query tokens
jarstelfox Jul 20, 2026
41786ba
Drop the redundant muted-count chips
jarstelfox Jul 20, 2026
4cbb63a
Add the actionState classifier and weight-bucket helpers
jarstelfox Jul 20, 2026
cc34af0
Add Weight and State filter dropdowns
jarstelfox Jul 20, 2026
231431f
Make the merge-age chart readable: one slowest mark, honest bar scale
jarstelfox Jul 20, 2026
6b2a46a
Nest stacked PRs under their base in every lane
jarstelfox Jul 20, 2026
0e95d8e
Give every card a state popover, even brand-new PRs
jarstelfox Jul 20, 2026
01262cb
Broadcast label changes on their own authority
jarstelfox Jul 20, 2026
1db384f
Say "Lift your block" when the author blocked themselves
jarstelfox Jul 20, 2026
7de990d
Fix mobile nav overflow, dead banner, and the Review-tab snap-back
jarstelfox Jul 20, 2026
37e6eae
Add saved filters: bookmark and reapply session filter combos
jarstelfox Jul 20, 2026
ec4568d
Draw the stack connector as a gutter elbow, not a glyph
jarstelfox Jul 20, 2026
6df012c
Add an in-memory review-claim protocol over the socket
jarstelfox Jul 20, 2026
9487020
Add the turn-rotation and dealer models
jarstelfox Jul 20, 2026
bbdfcc3
Wire claims, turns, and the dealer into the board
jarstelfox Jul 20, 2026
474ca77
Add an "only" quick-action to the filter pickers
jarstelfox Jul 20, 2026
ce7b55e
Request the claimer as a GitHub reviewer on claim
jarstelfox Jul 20, 2026
50d9ab0
Fix stale-stamp mis-bucketing in the Team and People lenses
jarstelfox Jul 20, 2026
d133231
Add the cheers evaluator: edge-triggered review rewards and nags
jarstelfox Jul 20, 2026
c647c50
Add the gamified cheers toasts and a setting to toggle them
jarstelfox Jul 20, 2026
4dc0d55
Add code regions: float PRs matching areas you own to the top
jarstelfox Jul 20, 2026
77acdc7
Gate "Deal me one" behind a claim confirmation
jarstelfox Jul 20, 2026
47bf791
Replace the merged-count banner with a shipped catch-up
jarstelfox Jul 20, 2026
6ea02c1
Swap the claim toggle from an eye to a raised hand
jarstelfox Jul 20, 2026
d2d4bf6
Generalize toasts into a reusable Toast contract
jarstelfox Jul 20, 2026
d466ff4
Add shippedToast: the catch-up as one relevance-gated toast
jarstelfox Jul 20, 2026
0308c7f
Fire the shipped catch-up as a toast, drop the banner
jarstelfox Jul 20, 2026
d36fd37
Add a reviewer leaderboard over the loaded board
jarstelfox Jul 20, 2026
b55df19
Add a review-streak day counter
jarstelfox Jul 20, 2026
3dc4b97
Rebuild the toast catalog around what to review
jarstelfox Jul 20, 2026
cfe61c6
Wire the new toasts: closed window, streak, previews
jarstelfox Jul 20, 2026
ecd030d
Reveal + flash on toast click, filter for quick-wins
jarstelfox Jul 20, 2026
086955a
Show the PR title and a real link in toasts
jarstelfox Jul 20, 2026
9ab5d46
Nag on a claim you're sitting on
jarstelfox Jul 20, 2026
80bd727
Keep the claim hand lit on rows you've claimed
jarstelfox Jul 20, 2026
f4672b8
Give code regions and your claims their own sections
jarstelfox Jul 20, 2026
4b9acaa
Document code regions and claims in the board legend
jarstelfox Jul 20, 2026
2db7c29
Wrap the metric rail so it can't overflow a narrow card
jarstelfox Jul 20, 2026
5a14ce4
Explain how claims work in the legend
jarstelfox Jul 20, 2026
f5b7fad
Give each review claim its own expiry
jarstelfox Jul 20, 2026
e0bf5d1
Add claim length + warning as user settings
jarstelfox Jul 20, 2026
7e367a0
Merge remote-tracking branch 'origin/master' into frontend-v2
jarstelfox Jul 20, 2026
bf50002
Highlight PRs GitHub asked you to review
jarstelfox Jul 20, 2026
ccb262f
Hide the row kebab menu on desktop
jarstelfox Jul 20, 2026
88e6e78
Strip gamification slop from the toast copy
jarstelfox Jul 20, 2026
4be8f24
Add a setting for whether a PR card opens in a new tab
jarstelfox Jul 20, 2026
7c9b7aa
Redesign Stats with line, donut, and two-series charts
jarstelfox Jul 20, 2026
1317ef1
Show Deal-me-one's pick as a card in a popover
jarstelfox Jul 20, 2026
eabada3
Keep dismissed nudges in a notification panel
jarstelfox Jul 20, 2026
3b7b585
Remember every rest-group fold's open state
jarstelfox Jul 20, 2026
eeead18
Document the review-requested chip in the legend
jarstelfox Jul 20, 2026
0194ae9
Retire the legacy v1 frontend and serve v2 at /
jarstelfox Jul 20, 2026
a72781f
Add the stag mark to the header and favicon
jarstelfox Jul 20, 2026
65bbd55
Use the real brand deer for the mark
jarstelfox Jul 20, 2026
96bbdff
Extract a shared onOpen helper for popover triggers
jarstelfox Jul 20, 2026
be5aaef
Seed review requests onto others' pulls in dummy mode
jarstelfox Jul 20, 2026
db2353c
Let people clear the notification panel
jarstelfox Jul 20, 2026
2c6b335
Notify the author when their PR breaks CI or gets changes requested
jarstelfox Jul 20, 2026
6b5fe24
Surface code regions to people who haven't set any
jarstelfox Jul 20, 2026
0ce37f3
Explain regions, weight, and the turn rotation in the legend
jarstelfox Jul 20, 2026
ae2a0ad
Add notification settings: dwell, bell badge, and an explainer
jarstelfox Jul 21, 2026
75a9086
Replace the cheers prose with per-kind toggles
jarstelfox Jul 21, 2026
9eda6f6
Make toast dwell an explicit duration, with a sticky option
jarstelfox Jul 21, 2026
43bafe1
Drop the "you know this repo" start-here reason
jarstelfox Jul 21, 2026
7e25ccb
Stop reloads from replaying the load-time nudges
jarstelfox Jul 21, 2026
30d0ded
Fold aging and bot PRs into the review queue and the deal
jarstelfox Jul 21, 2026
5ec51c7
Make "your turn" a claim prompt picked by best fit
jarstelfox Jul 21, 2026
40ff358
Add reward-toast flourishes: confetti, sparkle, shimmer, odometer
jarstelfox Jul 21, 2026
bcd93dc
Drop reward confetti and stop phantom load-time notifications
jarstelfox Jul 21, 2026
86cc51f
Fix Build check: exclude nested dist/ dirs from eslint
jarstelfox Jul 21, 2026
8dfd00f
Stop dropping capped toasts and nagging satisfied re-stamps
jarstelfox Jul 21, 2026
12a4d51
Polish cards, toasts, and charts from a UI audit
jarstelfox Jul 21, 2026
56012b5
Fire the shipped nudge only for merged PRs
jarstelfox Jul 21, 2026
476f55a
Surface re-stamp/re-QA and self-block moves consistently
jarstelfox Jul 21, 2026
8787b20
Stop nudges crediting self-review, bots, and stale copy
jarstelfox Jul 21, 2026
0de22dd
Fix mobile title crush in closed rows and stat cards
jarstelfox Jul 21, 2026
19d5e46
Make the shipped catch-up toast configurable
jarstelfox Jul 21, 2026
828343c
Name each cheer toggle after the toast it controls
jarstelfox Jul 21, 2026
2e4994e
Bring back the v1 board side-by-side at /v1
jarstelfox Jul 21, 2026
c2e7b00
Add ball-tracking and a one-word action model for pulls
jarstelfox Jul 22, 2026
ad816c1
Redesign the metric rail: CI status, sign-off marks, weight strip
jarstelfox Jul 22, 2026
80f4bbf
Temper the --ok/--warn/--bad/--violet color tokens
jarstelfox Jul 22, 2026
debd24c
Replace per-card status badges with word-grouped sections
jarstelfox Jul 22, 2026
ce111e9
Unify closed-row and dead-badge cleanup across lenses
jarstelfox Jul 22, 2026
467381f
Let your own pulls show up in your team's view
jarstelfox Jul 22, 2026
59eae03
Promote drafts to a first-class filter control
jarstelfox Jul 22, 2026
d4ccc56
Add a hover-intent delay before popovers open
jarstelfox Jul 22, 2026
796a6ca
Show a GitHub avatar and profile hover card
jarstelfox Jul 22, 2026
ae08f62
Give the header its own responsive floating layout
jarstelfox Jul 22, 2026
9af62a8
Shrink the star hit-box bleed so it stops overlapping neighbors
jarstelfox Jul 22, 2026
57468fc
Add PRODUCT.md and DESIGN.md design doctrine
jarstelfox Jul 22, 2026
d011c8f
Split My work lanes by rowWord, not authorMove
jarstelfox Jul 22, 2026
2ab37fe
Expose the deal ranking as dealRank + dealFrom
jarstelfox Jul 22, 2026
b0e579e
Add the age strip; quiet the age numeral
jarstelfox Jul 22, 2026
d20c13c
Merge Aging into one ranked, self-explaining queue
jarstelfox Jul 22, 2026
238841a
Document the age strip and one-queue doctrine
jarstelfox Jul 22, 2026
544e3c1
Unify the rail: CI joins the marks, age moves to the baseline
jarstelfox Jul 22, 2026
e4c1604
Update the shape taxonomy for the unified rail
jarstelfox Jul 22, 2026
138a543
Tell the truth in every ranked-lane explanation
jarstelfox Jul 22, 2026
6d6b033
Keep Stats inside the board's color vocabulary
jarstelfox Jul 22, 2026
5611fd9
Retract Classic's stale "new concepts stay out" charter
jarstelfox Jul 22, 2026
26ad038
Fix the mouse-only traps: weight popover, actions, filters
jarstelfox Jul 22, 2026
18edfe9
Quiet the age line to a relative grey hairline; sweep vocab drift
jarstelfox Jul 22, 2026
7fa2cce
Escalate failing CI to the alarm tier
jarstelfox Jul 22, 2026
f374adb
Deal the actual row, not a redrawing of it
jarstelfox Jul 22, 2026
a8163b3
Fix the weight track's ruler; let CI breathe
jarstelfox Jul 22, 2026
25fdc43
Add a CI lens: the board re-keyed by the machine reviewer
jarstelfox Jul 22, 2026
b408096
Give the CI slot one fixed width in every state
jarstelfox Jul 22, 2026
57d2bd1
Size the sign-off pip slot to three marks, not two
jarstelfox Jul 22, 2026
b7a64e7
Reserve the claim button's slot on your own pulls
jarstelfox Jul 22, 2026
b1dbbdd
Move Deal me one to a top-of-page strip and inline banner
jarstelfox Jul 22, 2026
dd68170
Rename Your move to Waiting on you, with a door on every lane
jarstelfox Jul 22, 2026
f94b217
Say waiting on, not awaiting; nudge, not chase
jarstelfox Jul 22, 2026
d2ed074
Every mark and header explains itself in place
jarstelfox Jul 22, 2026
0747db1
Drop em dashes from every string the user reads
jarstelfox Jul 22, 2026
e579288
Retire Deal me one; the queue is the deal now
jarstelfox Jul 22, 2026
56af13a
Rewrite compressed copy so a junior dev parses it first read
jarstelfox Jul 22, 2026
f29ad20
Reformat three server files with biome (no logic change)
jarstelfox Jul 22, 2026
ed0b922
Claims live on GitHub now; delete the in-memory store
jarstelfox Jul 22, 2026
fa2b87a
Read claims from the pull itself; drop the claims map
jarstelfox Jul 22, 2026
8f17f07
Weight is a letter in the CR cluster; the age line answers hover
jarstelfox Jul 22, 2026
bedce27
One icon family: lucide everywhere a mark isn't a pip
jarstelfox Jul 22, 2026
af82652
Per-view lane length; settings move to where they act
jarstelfox Jul 22, 2026
e053224
Dissolve the settings panel; controls live where they act
jarstelfox Jul 22, 2026
ea01782
Remove the dead Settings embeds of the repo and team pickers
jarstelfox Jul 22, 2026
aa23d71
Split stacks wear the connector's stub
jarstelfox Jul 22, 2026
e75fa23
CI is one circle: red disc, progress ring, hover green
jarstelfox Jul 22, 2026
b38b612
Age line ramps to the border color, not ink
jarstelfox Jul 22, 2026
a438f6a
Climbing requires your own stamp; add the overtaken nudge
jarstelfox Jul 22, 2026
5d77241
Dummy board carries a full 3-deep nesting demo
jarstelfox Jul 22, 2026
e508676
Record the session's doctrine: salience, alarms, settings, demos
jarstelfox Jul 22, 2026
684827a
Quiet the filter bar: the trigger is the chip, hiding gets a ledger
jarstelfox Jul 22, 2026
59f3bfc
Make the action machine truthful: bots, dismissals, masks, stacks
jarstelfox Jul 22, 2026
59d76f3
Legend as a conventions card; per-mark rules move to their marks
jarstelfox Jul 22, 2026
d78337d
Parked pulls ask nothing of anyone; a draft's move is Undraft
jarstelfox Jul 22, 2026
202e12e
Retire the CI ✗ disc: one glyphless circle, animated with purpose
jarstelfox Jul 22, 2026
4ac3bf3
Snooze goes Review-only; the rail reorders around its optional marks
jarstelfox Jul 22, 2026
ca811dc
CI animates only on state changes, never on hover
jarstelfox Jul 22, 2026
bc14576
CI failing: the solid disc becomes a ring with a center dot
jarstelfox Jul 22, 2026
3c36248
Narrow columns trade the four-icon hover cluster for the kebab
jarstelfox Jul 22, 2026
ce85e6f
Every pull has a real size: fetch missing diff stats, drop "unknown"
jarstelfox Jul 22, 2026
7cf9588
Row actions split: worded verbs on hover, plumbing in the kebab
jarstelfox Jul 22, 2026
7371bf9
Age band deepens on row hover, not only its own strip
jarstelfox Jul 22, 2026
a51d555
Verbs stand in the rail: the claim/snooze dock replaces the hover pill
jarstelfox Jul 22, 2026
4527a43
Verbs: the slot stands, the words fade in; held claims join the CR pips
jarstelfox Jul 22, 2026
85e1674
Verbs float left of the rail; the right edge returns to the data
jarstelfox Jul 22, 2026
d3cfba9
The hand retires; claim and snooze become word toggles
jarstelfox Jul 22, 2026
c88f947
Claimed and snoozed stand as brand flags in the meta line
jarstelfox Jul 22, 2026
6d370dd
Verb chips: a button stands when it records, reveals when it offers
jarstelfox Jul 22, 2026
e568fb7
One fold grammar: every subsection is a collapsible eyebrow band
jarstelfox Jul 22, 2026
00bf814
Merge the People tab into Team: one tab, yours pinned first
jarstelfox Jul 22, 2026
acd46fa
CI lens: lead with the Check health dashboard
jarstelfox Jul 22, 2026
b3f56f6
Hovering a PR title previews its description
jarstelfox Jul 22, 2026
7d7d1df
Raise the title's hover trigger above the row's hit layer
jarstelfox Jul 22, 2026
046fadd
CI lens: the check ledger IS the failing-by-check view
jarstelfox Jul 23, 2026
f2bd5a5
Team: the directory rests behind an Everyone door
jarstelfox Jul 23, 2026
857ad08
State popover: every fact links to its source
jarstelfox Jul 23, 2026
e169eee
Reconnect and re-auth promptly after a tab sleeps
jarstelfox Jul 23, 2026
0c9636e
Board feedback batch: honest state, visible controls, your mark
jarstelfox Jul 23, 2026
93eb1ce
The you-coin: your pulls carry v1's star, minted
jarstelfox Jul 23, 2026
ca98703
The seated-star seal: the ring parts and the star takes its place
jarstelfox Jul 23, 2026
23f2f28
Seal: the ring quiets to a tint, the star keeps the voice
jarstelfox Jul 23, 2026
35d705c
Fix hover verbs clipped in Classic's narrow columns
jarstelfox Jul 23, 2026
83d93aa
Measure the sticky header's height exactly
jarstelfox Jul 23, 2026
963046a
Naming pass: hide, CI failing, and a verb on every toggle
jarstelfox Jul 23, 2026
d0b8acb
Promote Ready to merge into Pick up next
jarstelfox Jul 23, 2026
eda84f2
The silhouette and the star: new author-identity marks
jarstelfox Jul 23, 2026
99fbe1d
Name the matched code region on the row again
jarstelfox Jul 23, 2026
bc47dae
Lens tabs become a dropdown at phone width
jarstelfox Jul 23, 2026
6d97651
Human names: resolve logins through a cached server lookup
jarstelfox Jul 23, 2026
44cbe69
Round the age band's growing tip
jarstelfox Jul 23, 2026
d7cbe61
One roster: starred people fold into your team
jarstelfox Jul 23, 2026
610a9a1
Multiple teams, and each one becomes a bar toggle
jarstelfox Jul 23, 2026
c7988c1
Saved filters grow up: seeded, always home, state-aware
jarstelfox Jul 23, 2026
4a6dbf0
Team lens: roster clusters, managed in place
jarstelfox Jul 23, 2026
521497f
Reserve the geometry that data fills in later
jarstelfox Jul 23, 2026
dae3e0b
Saved searches: pin to the bar, rosters ride along
jarstelfox Jul 23, 2026
53c5edb
Team lens selection IS the authors filter
jarstelfox Jul 23, 2026
3a4e60e
Delete reads as delete, rosters end where they're managed
jarstelfox Jul 23, 2026
8629547
Claim and Snooze become icon chips
jarstelfox Jul 23, 2026
6680ceb
The wordmark deals in
jarstelfox Jul 23, 2026
f0e22f5
Clean cut: drop migrations, retired params, dead code
jarstelfox Jul 23, 2026
b8f6951
One rotation read, one claim predicate
jarstelfox Jul 23, 2026
e65d768
Filter triggers never move: state rides a corner badge
jarstelfox Jul 23, 2026
f5302ea
People rows learn "except"; selection chips go quiet
jarstelfox Jul 23, 2026
f9d0f32
Retire config.json teams: rosters are the only teams
jarstelfox Jul 23, 2026
0eba1ac
Split bits.tsx into identity, age, and pips modules
jarstelfox Jul 23, 2026
0cb7605
Bound the saved-filter gloss so truncate can bite
jarstelfox Jul 23, 2026
cce0d57
Failing CI no longer hides a pull from review
jarstelfox Jul 23, 2026
e302ace
Wordmark animates only on breakpoint crossings
jarstelfox Jul 23, 2026
2cd2081
Fix the People filter's crushed names: except and Hide give way
jarstelfox Jul 24, 2026
b4ec80b
Retire the starred concept; teammates wear a heart
jarstelfox Jul 24, 2026
9d61318
Mute for real: per-user hides only, and scope stops persisting
jarstelfox Jul 24, 2026
d0a98a7
Header stops eating clicks at narrow widths; badge gets headroom
jarstelfox Jul 24, 2026
0bfd2f7
"only" leads the filter rows' right cluster
jarstelfox Jul 24, 2026
1430fa5
Review queue: repo blocks in your order, capped per repo
jarstelfox Jul 24, 2026
328843a
Raise the per-repo queue cap: 15/30/50/No cap, default 15
jarstelfox Jul 24, 2026
7b8752b
Team lens: one foldable roster list, no chip blob
jarstelfox Jul 24, 2026
d2ce84e
CI lens: kill the wall — failing checks only, healthy folded
jarstelfox Jul 24, 2026
ccb13ee
Stats: interactive charts — hover tooltip, crosshair, isolate a series
jarstelfox Jul 24, 2026
cda7a04
Address audit findings across Team, CI, and Stats
jarstelfox Jul 24, 2026
fa339b5
Extract the review-derivation model into shared/ for the backend
jarstelfox Jul 24, 2026
88ea9fb
Bundle the shared derive for the backend (compile-ahead)
jarstelfox Jul 24, 2026
a8cb275
Fix tinyint mergeable + wire the shared derive into the backend
jarstelfox Jul 24, 2026
8194cd0
Add the classified /api/v1 endpoint with GitHub-token Bearer auth
jarstelfox Jul 24, 2026
9864760
Prove the backend derive path end-to-end with a golden test
jarstelfox Jul 24, 2026
ac79183
Make config.js the single source for bots/weightLabels (via socket)
jarstelfox Jul 24, 2026
ea17ce7
Backend cleanup: dead code, review-request cache leak, DRY caches
jarstelfox Jul 24, 2026
3e942c8
Frontend cleanup: drop dead code, exports, and CSS
jarstelfox Jul 24, 2026
e848e58
DRY: single-source shared constants (weight order, CR-incomplete, bot…
jarstelfox Jul 24, 2026
6fa750d
DRY: app-shell -- share LENS_LABELS (fix CI-lens label), pullKey, has…
jarstelfox Jul 24, 2026
492d4fa
DRY: extract UI hooks + shared class constants (pure)
jarstelfox Jul 24, 2026
6ffd101
UI primitives: CheckboxField, HeaderIconButton, ChecklistFilter
jarstelfox Jul 24, 2026
3cb6059
Structural: extract review lanes (tested), scope helper, app.tsx hooks
jarstelfox Jul 24, 2026
5a287a9
Thicken the resting age line from 1px to 2px
jarstelfox Jul 24, 2026
4497dec
Lead Pick up next with Ready to merge
jarstelfox Jul 24, 2026
4ec0616
Resolve display names in notifications and honor hidden repos
jarstelfox Jul 24, 2026
c004986
Rename the empty-board title from "Workbench" to "All clear"
jarstelfox Jul 24, 2026
674ad62
Redesign the Team roster: face clusters, collapsed by default
jarstelfox Jul 24, 2026
04693bb
Hoist Ready to merge above Waiting on you
jarstelfox Jul 24, 2026
7126b23
Polish the CR/weight popover and the teammate heart
jarstelfox Jul 24, 2026
f4662cb
Curve the age bar with a square root
jarstelfox Jul 24, 2026
261184a
CI-failed mark: a circle with an X, not a center dot
jarstelfox Jul 24, 2026
d47c64a
Surface silent GitHub-API refresh failures in logs
jarstelfox Jul 24, 2026
a407198
Keep others' drafts out of Recently updated
jarstelfox Jul 24, 2026
01b2611
Add an "Ignore bot PRs" toggle to the Hidden filter
jarstelfox Jul 24, 2026
b167578
Default cr_req to 1 in the tracked configs, matching prod
jarstelfox Jul 24, 2026
9fdbbfe
Make the stamp pips reflect variable cr_req/qa_req
jarstelfox Jul 24, 2026
937c7b1
Swap the devtools easter egg for a wrench
jarstelfox Jul 24, 2026
29cf1fa
Align pip slots to the board-wide max required count
jarstelfox Jul 24, 2026
f685459
Polish pass: doctrine copy fixes (tab, filters, no em dashes)
jarstelfox Jul 24, 2026
d20b215
Fix CI lint: declare className on HeaderIconButton's props
jarstelfox Jul 24, 2026
244bd34
Fix Fold hooks-order crash on live lane transitions
jarstelfox Jul 24, 2026
75e6a8c
Preserve mergeable through a bulk pull refresh
jarstelfox Jul 24, 2026
65e0751
Harden the background pull-refresh timers
jarstelfox Jul 24, 2026
29a64fa
Don't cache a transient GitHub failure as an invalid token
jarstelfox Jul 24, 2026
2f00c69
Exclude already-stamped reviewers from engagedNoStamp
jarstelfox Jul 24, 2026
288c5b0
Fix three reward-correctness bugs in cheers
jarstelfox Jul 24, 2026
e689ef3
Filter correctness: unknown is: value and scope collapse
jarstelfox Jul 24, 2026
930e4dd
Retry display names after a transient /user-names failure
jarstelfox Jul 24, 2026
832d458
Don't send a "your turn" desktop notification for bot PRs
jarstelfox Jul 24, 2026
2e824b8
Drop author self-stamps from the reviewer leaderboard
jarstelfox Jul 24, 2026
84f9f55
Surface re-QA debt in the Team roster
jarstelfox Jul 24, 2026
5c99eb1
Case-insensitive team membership and rename revert
jarstelfox Jul 24, 2026
86ad134
Clearable number field and no focus-steal on mount
jarstelfox Jul 24, 2026
02d3956
Clean default-lens URL and refresh names on roster change
jarstelfox Jul 24, 2026
83cd2be
Distinguish a dead session from a transient network blip
jarstelfox Jul 24, 2026
ac72d93
Review follow-ups: is: filters, snooze-aware cheers, dead weight toggle
jarstelfox Jul 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 50 additions & 60 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -1,62 +1,52 @@
{
"extends": [
"eslint:recommended"
],
"parserOptions": {
"ecmaVersion": 2022,
"sourceType": "module"
},
"env": {
"browser": true,
"node": true,
"es2022": true
},
"globals": {
"App": true
},
"ignorePatterns": [
"dist/*",
"frontend/dist/*"
],
"overrides": [
{
"files": [
"**/*.ts",
"**/*.tsx"
],
"parser": "@typescript-eslint/parser",
"plugins": [
"@typescript-eslint"
],
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:@typescript-eslint/recommended",
"plugin:react/jsx-runtime",
"plugin:import/recommended",
"plugin:import/typescript"
],
"parserOptions": {
"ecmaVersion": 2017,
"sourceType": "module"
},
"env": {
"browser": true,
"node": true,
"es6": true
},
"globals": {
"App": true
},
"rules": {
"react/jsx-uses-react": "off",
"react/react-in-jsx-scope": "off"
"extends": ["eslint:recommended"],
"parserOptions": {
"ecmaVersion": 2022,
"sourceType": "module"
},
"env": {
"browser": true,
"node": true,
"es2022": true
},
"globals": {
"App": true
},
"ignorePatterns": ["**/dist/**"],
"overrides": [
{
"files": ["**/*.ts", "**/*.tsx"],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:@typescript-eslint/recommended",
"plugin:react/jsx-runtime",
"plugin:import/recommended",
"plugin:import/typescript"
],
"parserOptions": {
"ecmaVersion": 2017,
"sourceType": "module"
},
"env": {
"browser": true,
"node": true,
"es6": true
},
"globals": {
"App": true
},
"rules": {
"react/jsx-uses-react": "off",
"react/react-in-jsx-scope": "off"
}
}
}
],
"settings": {
"react": {
"version": "detect"
}
}
}
],
"settings": {
"react": {
"version": "detect"
}
}
}
359 changes: 359 additions & 0 deletions DESIGN.md

Large diffs are not rendered by default.

43 changes: 43 additions & 0 deletions PRODUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Pulldasher — Product Context

register: product

## What this is

A PR review hub for iFixit engineers: the between-tasks glance that answers
"what can I act on, and what's the best next pickup?" in under a second.
Used many times a day, briefly, by people who already know the codebase —
familiarity and speed over novelty, always.

## Users

iFixit engineers (~20 reviewers) triaging their review queue between tasks.
Desktop-first on wide monitors; both light and dark themes are first-class.
The dummy board (`npm run dev:dummy` in `frontend-v2/`) is the design bench.

## Design principles (in the owner's words)

- "A minimal UI that just feels like it was meant to work — but indicate
things instead of hiding them." Subtle is good; invisible is a bug.
- "No news is good news." Healthy states show nothing at rest (the CI bar is
invisible when green, revealed on hover). Color on the board means
*look here* — if everything is quiet, everything is fine.
- Actionability first: the page answers "what's my move" before "what exists."
Position (which section a card sits in) is the primary state encoding.
- Think Rams / Ive: the mark should *be* the thing it represents, self-evident
without the legend. The legend documents the vocabulary; it must never be
required to read it.

## Anti-references

- Badge soup: rows wearing 3+ colored chips each. v2 shipped this once and
the owner's eyes "went right to the badges instead of the titles."
- Dashboard-as-fruit-salad: saturated status colors on every row.
- Private codes: abstract marks (colored squares) that need the legend.
- Anything that makes heavy/broken work the loudest thing on a board whose
users are hunting the *easy* pickups.

## See also

DESIGN.md (the visual system as implemented), frontend-v2/src/styles.css
(tokens are the source of truth for values).
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,9 @@ Pulldasher is released under the [MIT License](LICENSE/).

### React Frontend

- Hack on the just the UI (no DB needed): `npm frontend:start`
- Then open http://localhost:8080/
- Or the demo page at http://localhost:8080/pull-card-demo.html
- Hack on both the frontend + backend: `npm frontend:watch` + `npm start`
- Then open http://localhost:{port} where port is from your config.js
The frontend lives in `frontend-v2/` (see its README). From the repo root:

- Hack on just the UI, no DB needed: `npm run frontend:dummy`, then open the
Vite dev server it prints (a synthetic board, no backend).
- Hack on the frontend against a live backend: `npm run frontend:dev` (proxies
`/token`, the socket, and `/stats-history` to a local `npm start`).
Loading