Skip to content

feat(routing): retire /projects and redirect it to the main app (fixes #402) - #432

Merged
0xdevcollins merged 3 commits into
boundlessfi:mainfrom
Sendi0011:fix/402-retire-projects-page
Oct 22, 2026
Merged

0xdevcollins merged 3 commits into
boundlessfi:mainfrom
Sendi0011:fix/402-retire-projects-page

Conversation

@Sendi0011

Copy link
Copy Markdown
Contributor

Description

Resolves #402.

The main Boundless app already owns the public projects directory at https://boundlessfi.xyz/projects. This app had a second one at /projects, with different filters and different counts — two directories for the same projects. This PR retires the local directory, redirects every /projects path to the main app, and keeps only the Featured projects row on the landing page.

Changes

Redirect

  • /projects and /projects/:path* permanently redirect (308) to the main app's /projects.
  • Implemented in proxy.ts, not next.config.ts, so the incoming query string is not forwarded. The destination is built with the shared mainAppUrl helper, so the origin still comes from NEXT_PUBLIC_BOUNDLESS_APP_URL (same fallback as lib/seo/site.ts).
  • Why the proxy: redirects() in next.config.ts always appends the request's query string to the destination in Next 16 — there is no config option to drop it. I confirmed this against the installed source (prepareDestination merges args.query unconditionally) and by request. Since the filter params differ between the two apps, forwarding them would land users on a wrong filter state. The equivalent config-only redirect (as in feat(routing): retire /projects route with permanent redirect to main app (fixes #402) #420) does forward the query.

Deleted

  • app/projects/ — page.tsx, opengraph-image.tsx, twitter-image.tsx.
  • components/discover/ — projects-view.tsx, projects-grid.tsx, use-projects.ts, category-tabs.tsx, discover-header.tsx.
  • filter-rail.tsx and filter-sheet.tsx are untouched: the builders directory still uses both.

Moved & re-pointed

  • components/discover/to-project-card.ts → components/landing/to-project-card.ts, next to its last user.
  • The Featured projects row's "View all" now links to the main app via mainAppUrl('/projects').
  • The landing hero buttons are left alone (the nav issue covers them).

SEO

  • /projects removed from lib/seo/routes.ts, so the sitemap no longer lists it.
  • The /projects JSON-LD (collectionPageSchema + breadcrumbSchema) went away with the route.
  • /projects removed from the HTML_ROUTES list in scripts/seo-check.mjs.

Dependency

Verification

curl -sI http://localhost:3000/projects
  → HTTP/1.1 308 Permanent Redirect
  → location: https://boundlessfi.xyz/projects

curl -sI http://localhost:3000/projects/anything
  → HTTP/1.1 308 Permanent Redirect
  → location: https://boundlessfi.xyz/projects

curl -sI "http://localhost:3000/projects/anything?tab=x&page=2"
  → HTTP/1.1 308 Permanent Redirect
  → location: https://boundlessfi.xyz/projects   # query dropped

npm run build route table no longer lists /projects or its image routes and registers ƒ Proxy (Middleware):

┌ ○ /
├ ○ /builders
├ ○ /builders/opengraph-image
├ ○ /builders/twitter-image
ƒ Proxy (Middleware)

/sitemap.xml lists only /, /about, /builders.

Acceptance criteria

  • curl -sI http://localhost:3000/projects returns a permanent redirect to https://boundlessfi.xyz/projects
  • /projects/anything redirects the same way
  • The npm run build route table no longer lists /projects or its image routes
  • /sitemap.xml has no /projects entry
  • The Featured projects row still renders and "View all" opens the main app's /projects
  • No unused files or exports are left behind
  • npm run lint, npx tsc --noEmit, and npm run build pass

Screenshot

The Featured projects row on the landing page, with "Browse all projects" now pointing at the main app:

Featured projects row

…dlessfi#402)

The main Boundless app already owns the public projects directory. Two
directories for the same projects, with different filters and counts, is
confusing, so this app keeps only the Featured projects row on the landing
page and permanently redirects every retired `/projects` path to the main
app.

- Redirect `/projects` and `/projects/:path*` with a permanent 308 in
  `proxy.ts`. The destination is built from the shared `mainAppUrl` helper
  and never forwards the incoming query string, since the filter params
  differ between the two apps. `next.config.ts` redirects cannot drop the
  query in Next 16, so this lives in the proxy.
- Delete the `/projects` route (`app/projects/`) and the components only it
  used (`projects-view`, `projects-grid`, `use-projects`, `category-tabs`,
  `discover-header`). `filter-rail.tsx` and `filter-sheet.tsx` stay: the
  builders directory still uses both.
- Move `to-project-card.ts` next to its last user, `featured-projects.tsx`,
  and point the Featured row's "View all" at the main app via `mainAppUrl`.
- Drop `/projects` from `lib/seo/routes.ts` so the sitemap stops listing it,
  and from the SEO check's HTML routes.

Includes `lib/main-app.ts` from the boundlessfi#401 dependency so the branch builds on
its own; it will de-dup when boundlessfi#401 merges.
@vercel

vercel Bot commented Oct 19, 2026

Copy link
Copy Markdown

@Sendi0011 is attempting to deploy a commit to the Threadflow Team on Vercel.

A member of the Team first needs to authorize it.

@drips-wave

drips-wave Bot commented Oct 19, 2026

Copy link
Copy Markdown

@Sendi0011 Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

@0xdevcollins
0xdevcollins merged commit 2b638b7 into boundlessfi:main Oct 22, 2026
1 of 2 checks passed
0xdevcollins added a commit to lmduy2612/builders that referenced this pull request Oct 22, 2026
Conflicts resolved:
- stats-strip.tsx: keep the shared STATS/fetchTotal from landing-queries.ts.
  Main (boundlessfi#433) dropped the Teams stat, so drop it from landing-queries.ts too
  (and PublicOrganizationListDto from CountedList); otherwise the move would
  have brought Teams back and prefetched /organizations on the server.
- featured-projects.tsx: keep the shared featured query, import
  toProjectCard from its new home next to it (boundlessfi#432) and keep mainAppUrl for
  "Browse all projects".
- builders-view.tsx: keep the shared URL parsing from use-builders.ts and the
  "How to get listed" hook-up from boundlessfi#428, in the file's current quote style.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Retire the /projects page and redirect it to the main app

2 participants