motir-core stops serving public pages — delete app/(public), its 21 components and its Server Actions, and retire the page-facing service surface
Opened by Zhu Yue ·
Type: code · Executor: coding_agent · Repo: motir-core · ONE PR.
The abandoned path is a deliverable, and until this card existed nobody owned it. docs/decisions/public-surface-hosts.md decides that motir-core ships no public rendering; every page moves to motir.co. Removing them was a tail clause on MOTIR-3884 — a redirect card whose own §1 says "/p/* is NOT redirected by this card. Those pages are still served here." — which is both under-scoped and self-contradictory. This card takes it.
The ENUMERATED population — git ls-files 'app/(public)', 2026-08-30
72 files, by top segment:
| segment | files | disposition |
|---|---|---|
_components | 21 | delete — the shared public chrome and panels; motir-marketing renders its own |
docs | 15 | delete — rendered on motir.co, from the artifact MOTIR-3932 decides |
explore | 19 | delete |
p | 12 | delete — including overview-actions.ts, the Server Actions module |
legal | 3 | NOT THIS CARD'S — MOTIR-3909 removes the content and the renderer together |
follow | 2 | ⚠️ DECIDE — see below. Do not delete by momentum. |
Verify the population at run time, do not trust this table. It is a reading of one day; re-run git ls-files 'app/(public)' and give every file a disposition in the pull request, including any this card does not name.
⚠️ /follow/confirm and /follow/unsubscribe are NOT the reading surface
Two pages that happen to live under app/(public) and are reached from transactional email, not from the public site. publicFollowDigestService — which stays in this repository — sends mail whose links land on them, and an unsubscribe link that 404s is a compliance problem, not a broken page.
They are in scope for a DECISION and not for deletion by default. Either they stay here (moving out of the (public) group if that group is emptied) or they move with the digest that links to them, and whichever is chosen, the links in already-delivered mail must keep working. MOTIR-3881 configures those links and names this card as their owner.
The service surface behind the pages
Deleting routes does not delete what they called. After the pages go, walk publicProjectsService, projectSquareService and projectTagsService and give every method one of two dispositions — still reached by app/api/public/*, or reached by nothing. A method with no caller is the abandoned path one layer down, and it is the layer nobody looks at because the visible files are already gone.
Do not delete a method the API needs, and do not leave one nothing calls. MOTIR_CLOUD (MOTIR-3908) gates the API but does not delete it, so the API's callers are the population that decides.
Ordering — why this is blocked_by the redirects
Delete before the redirect and the paths 404 for everyone. Redirect first and they are unreachable, then deleted. So this card follows MOTIR-3884, which in turn follows the cards that make motir.co serve the replacements.
Boundary
- It moves nothing. The rendering already exists on
motir.coby the time this runs; this is removal only. - It does not touch
app/(authed),app/(auth)orapp/api. The API is what survives, and it is the point of the arrangement. - It does not touch
/legal— MOTIR-3909's. - It does not decide the sitemap — MOTIR-3881's, and it must already be decided when this lands, or the sitemap is left emitting URLs for deleted routes.
Acceptance criteria
- Every file
git ls-files 'app/(public)'returns has a disposition in the pull request — deleted, kept with a reason, or named as another card's. No file is left unaccounted for, and the re-run population is quoted rather than this card's table. app/(public)/{_components,docs,explore,p}are gone,overview-actions.tsincluded./follow/*'s disposition is DECIDED and recorded, and links in already-delivered mail still resolve — asserted, not asserted-to-be-obvious.- Every method of
publicProjectsService,projectSquareServiceandprojectTagsServiceis either reached byapp/api/public/*or removed; the caller sweep is in the pull request body. A method with no caller may not survive this card. next buildproduces no route underapp/(public)except whatever/followdisposition was chosen, and the route manifest in the pull request shows it.- Nothing under
app/(authed)changes behaviour, and the public API's own tests are untouched and green. - No test is deleted merely because its subject moved: a test covering behaviour that still exists in the API is re-pointed, and one covering a deleted page is removed with its reason stated.
- ≥90% coverage on any file this PR modifies rather than deletes.
Context refs
motir-core/app/(public)/— the population;git ls-filesis the authoritymotir-core/app/(public)/p/[identifier]/overview-actions.ts— the Server Actions modulemotir-core/lib/services/{publicProjectsService,projectSquareService,projectTagsService}.ts— the layer belowmotir-core/app/api/public/— what survives, and the caller set that decides the sweepmotir-core/docs/decisions/public-surface-hosts.md— the decision this executes- MOTIR-3884 — the redirects this follows; its §1 exclusion of
/p/*is superseded - MOTIR-3881 — the sitemap and the follow-digest links
Discussion
No comments yet.
Adding to this discussion signs you in on app.motir.co and brings you back to this request.