Commit log

e3d0a22 docs(web): update README for current architecture

Click to expand commit body
rewrite README to reflect all the changes:
- updated tech stack (Vite 8, TS 6, Tailwind v4, TanStack Router,
  Apollo 4, oxlint/oxfmt, valibot)
- file-based routing with route tree structure
- GitHub-style code browser URLs (tree/blob/commits)
- data loading pattern (preloadQuery + useReadQuery)
- router context architecture (preloadQuery, ref, labels)
- custom link components (ButtonLink, BackLink)
- tooling table (oxlint, oxfmt, valibot, tsconfig bases)
- removed outdated REST API references (code browser uses GraphQL)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

4edb444 feat(web): add proper favicon and logo

Click to expand commit body
use the official git-bug logo (ladybug with git branches):
- copy logo-alpha-flat-bg.svg as favicon and header logo
- copy favicon.ico from the old webui for legacy browser support
- import logo as React component via vite-plugin-svgr in the Header
- add theme-color meta tag and apple-touch-icon
- replace Lucide Bug icon with the real logo in the header

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

7caab09 feat(web): wrap repo images in Link to blob view

Click to expand commit body
repo-local images in markdown are now wrapped in a TanStack Router
Link to the blob viewer, so clicking an image navigates to the file

  <Link to="/$repo/blob/$ref/$" params={...}>
    <img src="/gitraw/repo/ref/path" />
  </Link>

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

96c1e61 feat(web): use typed router Links for relative markdown links

Click to expand commit body
override the `a` component in ReactMarkdown to render TanStack
Router Links for repo-local URLs, giving proper client-side
navigation with preloading instead of full page reloads

- relative links → <Link to="/$repo/blob/$ref/$" params={...}>
- anchor links (#heading) → plain <a>
- external links → plain <a>
- images stay as urlTransform to /gitraw (need raw bytes)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

c43fe50 refactor(web): move user profile filters to URL search params

Click to expand commit body
replace useState-based statusFilter and cursor pagination with URL
search params (status, after) on the /$repo/user/$id route:

- add validateSearch with valibot schema for status + after
- preload query via loaderDeps (re-fetches on status/page change)
- use useReadQuery instead of useUserProfileQuery
- open/closed toggle is now a proper Link (preloadable, shareable)
- pagination prev/next are ButtonLinks
- add search={{ status, after }} to all Links targeting user/$id

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

53eb77a refactor(web): preload user profile initial query in route loader

Click to expand commit body
preload the first page of the user profile (open issues, no cursor)
in the route loader so the router waits before transitioning.

subsequent pagination and status filter changes still use useQuery
which either serves from Apollo cache or fetches fresh.

add pendingComponent skeleton and remove the manual loading guard.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

1162622 fix(web): add cursor-pointer to BackLink button state

Click to expand commit body
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

30adbb9 refactor(web): add BackLink component, use history.back with fallback

Click to expand commit body
create a reusable BackLink component that:
- uses router.history.back() when canGoBack is true (preserves
  scroll position, filter state, pagination)
- falls back to a typed Link destination when there's no history
  (e.g. direct navigation to a detail page)

replace all "Back to issues" Links and the CommitPage back button
with BackLink across bug detail, new issue, user profile, and
commit pages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

23f8e53 build(web): use vite-tsconfig-paths instead of manual resolve.alias

Click to expand commit body
replace the explicit resolve.alias for @ with vite-tsconfig-paths
which reads path mappings from tsconfig.json automatically —
single source of truth for the @ → ./src alias

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

ed9536e refactor(web): preload tree and blob queries in route loaders

Click to expand commit body
move tree and blob GraphQL queries from component-level useQuery
to route-level preloadQuery so data loads before the transition:

tree route:
- preload TREE_QUERY in loader (params provide ref + path)
- use useReadQuery for tree data, keep useQuery for cascading
  lastCommits and readme queries (depend on tree result)
- add pendingComponent skeleton

blob route:
- preload BLOB_QUERY in loader
- add pendingComponent skeleton

remove loading props from FileTree and FileViewer since data is
always ready when the component renders (suspense handles loading)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

88aa379 feat: add /gitraw endpoint for ref+path raw file serving

Click to expand commit body
add a new HTTP handler at /gitraw/{repo}/{ref}/{path} that resolves
a git ref and file path to raw blob content, using BlobAtPath.

this enables the web UI to render images from markdown READMEs
without needing to know blob hashes upfront — the markdown renderer
rewrites relative image URLs to /gitraw/{repo}/{ref}/{resolved-path}
while relative links go to the code browser blob view.

- add BlobAtPath passthrough on RepoCache
- add gitRawHandler serving raw content with Content-Type detection
- register /gitraw route in webui server
- add /gitraw to Vite dev proxy
- simplify Markdown component: use urlTransform to rewrite URLs
  based on file extension (images → /gitraw, links → blob viewer)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

9fa216b feat(web): resolve relative links/images in markdown against the repo

Click to expand commit body
add optional repoContext prop to Markdown component with repo, ref,
and basePath. When set, relative URLs in markdown content are
rewritten to point to the code browser (/$repo/blob/$ref/path).

this makes images and links in READMEs like ![](../misc/diagram.png)
or [docs](doc/) resolve correctly against the current directory
and ref in the code browser.

issue comments don't pass repoContext, so their links are unaffected.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

59478a4 refactor(web): replace imperative navigation with proper Links

Click to expand commit body
FileTree:
- replace onClick handlers with typed Links on entry names and ".."
- remove onNavigate/onNavigateUp callback props
- pass repo/currentRef/currentPath for Link params construction

BugRow:
- replace string-interpolated hrefs with typed Link params
- change repo prop from string | null to string

CommitPage:
- use useCanGoBack() + router.history.back() instead of
  window.history.back(), only show Back when there's history

all Links now use typed to/params for proper preloading and
accessible navigation (right-click, cmd+click, etc.)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

a6bee2c fix(web): fix Code/Issues active state in header nav

Click to expand commit body
the NavLink active detection couldn't distinguish code vs issues
routes because they share the /$repo prefix

replace NavLink with plain Links that determine active state from
the matched route IDs — checking for _code or _issues layout routes
in the active matches via useRouterState

remove unused NavLink component from button-link.tsx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

67a9da5 fix(web): reset highlight.js padding on code viewer

Click to expand commit body
the imported github.css theme sets padding on .hljs which caused
misalignment between line numbers and code content

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

2b84a8e refactor(web): replace useMatchRoute with child route context for view mode

Click to expand commit body
each code browser child route (tree, blob, commits) now declares its
viewMode in beforeLoad context. The _code layout reads it from the
deepest match via useRouterState instead of pattern-matching route
paths with useMatchRoute.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

d5bbee5 fix(web): preserve view mode and path when switching refs

Click to expand commit body
the ref selector now navigates to the same view (tree/blob/commits)
and path on the new ref, instead of always resetting to tree root

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

41a443f fix(web): move refs preload to $repo context, fix blinking on ref switch

Click to expand commit body
the refs query only depends on the repo slug, not the child route
(tree/blob/commits/ref). Preloading it in _code.tsx beforeLoad caused
a new QueryRef on every navigation, triggering suspense flashes.

move refs preload to $repo.tsx beforeLoad so it's loaded once per
repo and shared via context. The _code layout and /$repo redirect
both read from context instead of firing their own queries.

also replace window.location.href ref switch with router navigation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

25e7686 refactor(web)!: restructure code browser to GitHub-style URLs

Click to expand commit body
replace search-param-based code browser with proper URL segments:
  /$repo/tree/$ref/...path   → directory view
  /$repo/blob/$ref/...path   → file view
  /$repo/commits/$ref        → commit history
  /$repo/                    → redirect to tree/{defaultRef}

add pathless _code layout route that:
- preloads refs (branches/tags) in beforeLoad
- renders shared header: breadcrumb, ref selector, history toggle
- child routes (tree, blob, commits) render inside Outlet

convert CodeBreadcrumb segments from onClick handlers to typed Links

update Header "Code" NavLink and repo picker to use new URL structure

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

7a3893f fix(web): use Route.useParams() for Link params, ref for GraphQL

Click to expand commit body
the normalized ref from context is null for the default repo, but
Link params need the raw URL slug (e.g. "_"). Use Route.useParams()
for Link params and context.ref for GraphQL variables.

also remove unnecessary non-null assertions on params from
Route.useParams() which always returns strings

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

3d029d8 refactor(web): add pathless _issues layout route

Click to expand commit body
introduce /$repo/_issues as a pathless layout route that preloads
validLabels and allIdentities only for issue-related pages, instead
of loading them for every /$repo child (including code browser and
commit pages that don't need them)

move issue routes under _issues/:
  $repo/_issues/issues/     → issue list
  $repo/_issues/issues/new  → new issue
  $repo/_issues/issues/$id  → issue detail
  $repo/_issues/user/$id    → user profile

$repo.tsx now only provides the normalized ref — labels/identities
preloading moved to _issues.tsx beforeLoad

URL paths are unchanged (the _issues prefix is stripped)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

74bf0a6 refactor(web): delete useRepo, pass repo as prop to shared components

Click to expand commit body
remove src/lib/repo.tsx entirely — the router context already provides
the resolved ref via $repo's beforeLoad

route components read repo from Route.useRouteContext(), then pass
it as a prop to shared components (Timeline, FileTree, CommitList,
FileDiffView) instead of those components reaching into router context

this keeps shared components decoupled from the routing layer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

71dd706 refactor(web): replace RepoShell React context with router context

Click to expand commit body
remove the hand-rolled RepoContext/RepoShell pattern — the $repo
route's beforeLoad already provides `ref` in the router context

- useRepo() now reads from useRouteContext({ strict: false })
  instead of a dedicated React context
- remove RepoShell component — TanStack Router renders Outlet
  automatically when no component is specified
- remove createContext/useContext/Outlet imports from repo.tsx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

245b64c refactor(web): use router context for preloadQuery and shared repo data

Click to expand commit body
provide preloadQuery via createRootRouteWithContext instead of
importing it directly in each route file:
- define RouterContext with preloadQuery in __root.tsx
- pass preloadQuery to createRouter({ context }) in App.tsx
- all route loaders access it via context.preloadQuery

use $repo beforeLoad to provide shared context to all child routes:
- resolve repo slug ("_" → null) once as context.ref
- preload validLabels and allIdentities queries (shared across
  issue list, bug detail, etc.)
- child routes read labelsRef/identitiesRef from Route.useRouteContext()
  instead of preloading their own copies

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

7cb78fc refactor(web): simplify loader awaits with inline toPromise

Click to expand commit body
replace Promise.all + separate return with sequential await in
the return object — preloadQuery() calls already fire in parallel,
so awaiting them inline is equivalent but reads cleaner

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

0122c57 fix(web): await preloaded queries before route transition

Click to expand commit body
use preloadQuery.toPromise() in all route loaders so the router
waits for data to be ready before transitioning, instead of
rendering the component with a pending query ref

loaders with multiple queries use Promise.all to await them
in parallel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

4425033 refactor(web): preload valid labels in bug detail route

Click to expand commit body
preload ValidLabelsDocument alongside BugDetailDocument in the
/$repo/issues/$id route loader, eliminating the waterfall where
LabelEditor would only start fetching labels after mount

pass validLabels as a prop to LabelEditor instead of the component
fetching its own copy with useValidLabelsQuery

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

ad9dc86 refactor(web): preload bug list query, pass labels/identities as props

Click to expand commit body
preload the bug list, valid labels, and all identities queries in
the /$repo/issues route loader using loaderDeps for search params:
- bugListRef depends on q/after search params (re-fetched on change)
- labelsRef and identitiesRef are independent (stable across filters)

pass labels/identities data down to IssueFilters and QueryInput as
props instead of each component fetching its own copy:
- add labels/identities props to IssueFilters and QueryInput
- export LabelItem/IdentityItem types from IssueFilters
- remove useValidLabelsQuery/useAllIdentitiesQuery from both components

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

8257431 refactor(web): use valibot for runtime validation

Click to expand commit body
replace hand-rolled typeof guards and unsafe type assertions with
valibot schemas for proper runtime validation:

- validateSearch: use v.object + v.fallback + v.picklist for typed
  search param parsing with defaults (code page, issues page)
- fetch().json(): validate auth user and identity responses against
  valibot schemas instead of unsafe `as` casts
- derive TypeScript types from schemas via v.InferOutput

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

4346045 fix(web): resolve all 607 lint warnings

Click to expand commit body
disable react-in-jsx-scope (585 false positives with jsx: react-jsx)

fix no-unsafe-enum-comparison (7):
- import GitObjectType/GitRefType enums from codegen
- compare against enum members instead of string literals

fix no-unsafe-type-assertion (8):
- replace `as string` casts with typeof guards in validateSearch
- add type guard functions for union validation

fix no-array-sort (3):
- replace `[...arr].sort()` with `arr.toSorted()` (ES2023)
- add ES2023 to tsconfig lib

fix remaining:
- rename shadowed `_` variable (no-shadow)
- move handleSignOut to module scope (consistent-function-scoping)
- suppress import/no-unassigned-import for CSS import

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

5566ba0 build(web): use @tsconfig/bases for tsconfig presets

Click to expand commit body
extend @tsconfig/vite-react and @tsconfig/strictest to replace
hand-rolled compiler options:

tsconfig.app.json:
- extends @tsconfig/strictest + @tsconfig/vite-react
- adds verbatimModuleSyntax, erasableSyntaxOnly, noUncheckedIndexedAccess,
  noImplicitOverride, noImplicitReturns, etc.
- disable exactOptionalPropertyTypes and noPropertyAccessFromIndexSignature
  (incompatible with generated GraphQL types)

tsconfig.node.json:
- extends @tsconfig/strictest for strict checks
- keeps bundler-specific options inline (no base covers this)

fix code issues caught by stricter settings:
- guard suggestions[acIndex] access (noUncheckedIndexedAccess)
- use optional chaining for nodes[0] access

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

edd77e6 refactor(web): move issue list filters to URL search params

Click to expand commit body
replace useState-based filter state with URL search params on the
/$repo/issues route so that:
- open/closed toggle is a proper Link (preloadable, shareable)
- filter state is preserved in the URL and works with back/forward
- pagination cursor is in the URL via `after` param
- the query string `q` holds the full structured query

add search={{ q, after }} to all links targeting /$repo/issues

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

0807986 refactor(web): move page components into route files, add data preloading

Click to expand commit body
inline all page components from src/pages/ into their route files
in src/routes/, following TanStack Router conventions

add Apollo preloadQuery integration for router-level data loading:
- create preloadQuery helper via createQueryPreloader(client)
- preload repos query in / route loader
- preload bug detail query in /$repo/issues/$id loader
- preload commit query in /$repo/commit/$hash loader
- preload refs query in /$repo/ (code page) loader
- use useReadQuery() in components to read preloaded data

move loading skeletons to route-level pendingComponent:
- BugDetailSkeleton, CommitPageSkeleton, CodePageSkeleton

delete src/pages/ directory — all UI now lives in src/routes/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

2f90ccb build(web): ignore tanstack router plugin cache

Click to expand commit body
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

dda306d Revert "build(web): ignore generated route tree and tanstack cache"

Click to expand commit body
This reverts commit e831dc5bdd7f9ab142ffe9c6ae9acfa9973f02ff.

Quentin Gliech created

e831dc5 build(web): ignore generated route tree and tanstack cache

Click to expand commit body
add routeTree.gen.ts and .tanstack/ to .gitignore since they are
regenerated by the tanstack router vite plugin on every build

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

8dcd0bb refactor(web): migrate to file-based routing

Click to expand commit body
replace code-based route tree with file-based routing using
@tanstack/router-plugin:

- add tanstackRouter vite plugin with autoCodeSplitting
- create src/routes/ directory mirroring the URL structure
- each route file uses createFileRoute/createRootRoute
- page components stay in src/pages/, route files just wire them up
- App.tsx now imports the generated routeTree from routeTree.gen.ts
- move CodePageSearch type to the route file where validateSearch lives
- ignore routeTree.gen.ts from linter and formatter

route structure:
  __root.tsx          → Shell + ErrorPage
  index.tsx           → RepoPickerPage
  auth/select-identity.tsx → IdentitySelectPage
  $repo.tsx           → RepoShell layout
  $repo/index.tsx     → CodePage (with search params)
  $repo/issues/       → BugListPage, NewBugPage, BugDetailPage
  $repo/user/$id.tsx  → UserProfilePage
  $repo/commit/$hash.tsx → CommitPage

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

314d974 refactor(web): add ButtonLink/NavLink components, use typed links everywhere

Click to expand commit body
- create ButtonLink via createLink() for type-safe button-styled links
  with preloading, replacing the <Button asChild><Link/></Button> pattern
- create NavLink via createLink() with activeProps/inactiveProps,
  replacing manual useMatchRoute() active state detection
- convert all string-interpolated Link paths to typed params form
- convert onClick navigate handlers to ButtonLink where possible
- remove unnecessary type assertions on useParams (router Register
  provides full type inference)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

e15604c build(web)!: migrate from react-router to @tanstack/react-router

Click to expand commit body
replace react-router v7 with @tanstack/react-router for fully
type-safe routing with typed Link params and search params

- define code-based route tree with createRootRoute/createRoute
- register router type for global type inference
- add typed validateSearch for code page search params (ref, path, type)
- replace NavLink with Link + useMatchRoute for active state detection
- replace useSearchParams with useSearch/useNavigate
- replace useRouteError/isRouteErrorResponse with errorComponent props
- use typed Link params instead of string interpolation for all routes
- replace navigate(-1) with window.history.back()

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

7ac37c3 fix(web): fix Slot import from unified radix-ui package

Click to expand commit body
the unified radix-ui package exports Slot as a namespace object,
not a component directly — use Slot.Root instead

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

0ae543b refactor(web): migrate to unified radix-ui package

Click to expand commit body
replace individual @radix-ui/react-* packages with the unified
radix-ui package and update all imports accordingly

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

ab89c7d build(web)!: upgrade to tailwind css v4

Click to expand commit body
migrate from tailwind v3 to v4:
- replace postcss-based setup with @tailwindcss/vite plugin
- rewrite index.css: @tailwind directives → @import "tailwindcss",
  JS theme config → CSS @theme inline block
- replace tailwindcss-animate with tw-animate-css
- load @tailwindcss/typography via @plugin directive
- configure dark mode via @custom-variant
- delete tailwind.config.ts and postcss.config.js

rename classes per v4 spec:
- shadow → shadow-sm, shadow-sm → shadow-xs
- rounded → rounded-sm
- outline-none → outline-hidden

also fix type errors from apollo v4 (add explicit query types),
react-router v7 (void navigate promises), and react-markdown v10
(move className to wrapper div)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

ae4e8cf build(web)!: upgrade to apollo client v4

Click to expand commit body
- upgrade @apollo/client from v3 to v4, add rxjs peer dependency
- move hook imports to @apollo/client/react (new canonical path)
- move ApolloProvider import to @apollo/client/react
- use explicit HttpLink instead of implicit uri option
- update codegen to use @apollo/client/react for generated hooks
- remove unused localState and incrementalHandler boilerplate

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

c8f274c build(web)!: upgrade to react-router v7

Click to expand commit body
replace react-router-dom v6 with react-router v7, updating all
imports from "react-router-dom" to "react-router"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

a3c2e73 build(web): upgrade tailwind-merge to v3

Click to expand commit body
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

df30bdb build(web): upgrade react-markdown to v10

Click to expand commit body
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

d9df3d0 build(web): upgrade graphql-codegen to v6/v5

Click to expand commit body
upgrade @graphql-codegen/cli to 6.2.1,
@graphql-codegen/typescript and typescript-operations to 5.0.9

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

3f5c8df build(web): upgrade lucide-react to v1

Click to expand commit body
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

f78f050 refactor(web): remove manual chunk splitting

Click to expand commit body
let rolldown handle chunk splitting automatically instead of
manually mapping vendor dependencies to named chunks

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created

63d1a03 build(web)!: upgrade to vite 8

Click to expand commit body
migrate from vite 6 to vite 8 (rolldown-based):
- upgrade vite to 8.0.3 and @vitejs/plugin-react to 6.0.1
- rename build.rollupOptions to build.rolldownOptions
- convert manualChunks from object form (removed) to function form

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Quentin Gliech and Claude Opus 4.6 (1M context) created