Owner profile page: markdown bio, display name, location, timezone, and repo list at /:owner #234
Labels
No labels
actions
bug
cli
duplicate
enhancement
fork
forum
git storage
help wanted
insights
invalid
issues
moderation
oidc
ownership transfer
packages
pr/merge protection rules
projects
pull requests
question
releases
sponsorships
tags
webhooks
wiki
wontfix
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
crueber/walhub#234
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What's requested
Every owner (user or org) should have a profile page — the GitHub-profile model, scoped down: no achievements/badges, no followers, no contribution graph.
Currently
/:owner(web/src/pages/Repos.jsx, route in web/src/index.jsx:62) renders only a bare owner heading, an optional "New repository" button, and an uncapped repo list. There is no profile surface anywhere; the closest thing is/explore(web/src/pages/Owners.jsx), which folds owner overflow into/:owner.Desired behavior
/:ownerbecomes a profile page with:activity:{o}/{r}data already computed in lib/activity.js can order rows; todayRepos.jsxlists in whatever orderrepos.owners.repos()returns andlib/owners.jshasnewestFirstfor the explore page).Architecture notes (for whoever implements)
internal/store/keys.goRepoPrefix()=repos/<owner>/<repo>/, and the owner list is derived by scanning manifests (cmd/walhub/serve.go:512repoRegistry.Owners→listOwners, manifest-gated). There is no owner record to hang profile fields on, so this feature needs a new store object for owner profile data — consistent with the "object store is the only database" rule. Suggest aowners/<owner>/profile.pb(or .json) key ininternal/store/keys.go, written through the WAL like other policy/settings-style docs.internal/api/routes.go:46-51(GET/PUT/api/v1/owners/{owner}/profile, exposed in all three twins: template, api-browser, services/api), plus aProfileaccessor on or alongsideRepoRegistry(internal/api/env.go:124). GET is AuthRead (public bio), PUT is AuthWrite and must be restricted to the owner itself — noteme()(internal/api/discovery.go:101) currently only exposesprincipal/write/anonymous, so write authorization for "only this owner may edit their profile" may need the principal name compared against the owner slug.web/src/pages/Repos.jsx(route/:owner) with a profile header + bio render, and an edit form (markdown textarea + display name / location / tz picker) shown only when the viewer is the owner. ReuseuseDatacache keys,<RepoRow>,<ActivityStamp>.lib/owners.jsalready hasnewestFirst— repo list ordering can reuse it, but note it currently orders by name-derived data; ordering by recent activity needs theactivity:{o}/{r}cache populated per repo (as explore does) or a new owner-level activity endpoint.web/sdk/src/index.jsfor get/update profile.Acceptance criteria
/api/v1/owners/{owner}/profilereturns{display_name, location, timezone, bio_markdown}(empty values when unset) for any known owner; sensible empty/404 behavior for unknown owners consistent with §8 (ownerReposreturns 200 [] — match that convention or document the deviation)./:ownerrenders display name, location, timezone, and rendered markdown bio; falls back to the owner slug when no display name is set./:ownerrepo list is ordered by most recent activity, newest first.Implemented in PR #269 (#269), branch fix/issue-234 — ready for review, not merged.
What landed: /:owner profile page (display name/slug fallback, location, IANA tz picker via Intl.supportedValuesOf, markdown bio via renderBody, activity-ordered repos via the #247 detailed shape — confirmed merged as
addf028, reused as-is); new CAS'd sidecar owners//profile.json (frozen-list amended); GET/PUT triple twins + discovery + SDK owners.profile/updateProfile; PUT gated AuthWrite + admin/name-match/org-owner-role via the api.OwnerEditor seam (decision documented in docs/features/01); GET carries can_edit.Verification: go test -race clean; cover api 95.2% / identity 97.2% / store 95.0%; node --test 542 pass; vite+esbuild green; live-server curl smoke (twins, discovery, validation 400s, restart survival) green. Open: real-Chromium both-themes console check (shared daemon blocks loopback — noted in PR).
Review of PR #269 (fix/issue-234, owner profile page) — verified in scratch worktree, all green.
PASS
FIX APPLIED (pushed
6780479to origin/fix/issue-234, re-tested):No browser pass: per task instructions, tests + reasoning only (no browser-facing serving change — pure API + SPA route already covered by the shared pipeline's Chromium history).
MERGE RECOMMENDATION: ready to merge.
Fixed by PR #269 incl. review anon can_edit fix (seam direction, edit matrix, frozen amendment verified; 95.2/97.2% + 542/542), merged. Closing.