Changelog
feat(portfolio): M4-b public slug, publish, and /p/[slug]
April 16, 2026Branch feat/m4-b-portfolio-public-slugPR #2531 min readAI Generated
feat(portfolio): M4-b public slug, publish, and /p/[slug]
Automated summary for branch feat/m4-b-portfolio-public-slug. This post is generated on push; commit it with your changes.
Commits
- 3820bbae chore: merge main (signup UX #252) + resolve TLDR conflict
- 8f9353a1 chore(webapp): finalize PR blog post commit list
- 71d8bf2a chore(webapp): sync PR blog post (post-push)
- 6eeedbc4 chore(webapp): refresh PR blog post after push
- f8832d7a chore(webapp): sync PR blog post for m4-b portfolio
- 3bc2aa8f docs(adversarial-review): push review for M4-b portfolio branch
- bd540a16 feat(portfolio): M4-b public slug, publish, and /p/[slug] page
Files changed
CHANGELOG.md | 3 +
.../unreleased/added-m4-b-portfolio-public-link.md | 3 +
.../reviews/2026-04-16-feat-m4-b-portfolio-push.md | 24 ++
docs/adversarial-review/reviews/TLDR.md | 1 +
.../016_candidate_portfolio_settings.sql | 19 ++
services/rust-api/src/api/mod.rs | 4 +
services/rust-api/src/api/v1/mod.rs | 1 +
services/rust-api/src/api/v1/portfolio.rs | 241 +++++++++++++++++++++
services/rust-api/src/errors.rs | 8 +
services/rust-api/src/repositories/mod.rs | 5 +-
services/rust-api/src/repositories/postgres.rs | 91 ++++++++
.../feat-m4-b-portfolio-public-slug/manifest.json | 12 +
.../feat-m4-b-portfolio-public-slug/versions/ai.md | 46 ++++
webapp/e2e/m4-portfolio.spec.ts | 11 +-
.../account/home/account-home-client.tsx | 2 +-
.../src/app/(authenticated)/account/home/page.tsx | 19 +-
.../app/(authenticated)/account/portfolio/page.tsx | 28 +--
.../portfolio/portfolio-settings-client.tsx | 156 +++++++++++++
.../src/app/api/portfolio/public/[slug]/route.ts | 13 ++
webapp/src/app/api/portfolio/settings/route.ts | 34 +++
webapp/src/app/p/[slug]/page.tsx | 65 ++++++
webapp/src/lib/api.ts | 27 ++-
webapp/src/lib/profile-completion.ts | 16 +-
webapp/src/middleware.ts | 2 +
webapp/test/profile-completion.test.ts | 18 ++
25 files changed, 820 insertions(+), 29 deletions(-)
How this works
This file is produced by webapp/tools/sync-pr-blog-post.ts. Add a versions/human.md file in the same folder to publish a human-written alternative; the site will show tabs for AI Draft and Human when both exist.