Skip to content

moooon

Motir

Vibe your whole project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
146
planned
1,367
shipped

Motir · Roadmap

MOTIR-3884Done

301 app.motir.co/{explore,docs,legal,p}/* and / to motir.co — plus the in-code sweep of every absolute-URL reader

Opened by Zhu Yue ·

Type: code · Executor: coding_agent · Repo: motir-core · ONE PR.

The four public paths now answer on the public site. This card makes their OLD addresses redirect, and sweeps the places in this repository that still print the old one.

1 — The redirects

Permanent redirects on the application host, path and query preserved, for:

  • / → the public site root
  • /explore and /explore/topic/*, including the ?rank= variants the sitemap publishes
  • /docs and every surface beneath it
  • /legal and every document beneath it

proxy.ts already runs on this application with a matcher enumerated from the filesystem by tests/navigation/proxy-matcher.test.ts, so the redirect belongs there rather than in a second mechanism — and its matcher gains these segments through the same filesystem-derived guard, never as a hand-maintained list. The /admin exclusion that test asserts as deliberate stays exactly as it is.

⚠️ /p/* IS redirected by this card — the line that stood here said the opposite and is SUPERSEDED (2026-08-30). It read "/p/* is NOT redirected by this card. Those pages are still served here." That was true when /p/* was staying in motir-core; docs/decisions/public-surface-hosts.md moves it to motir.co with everything else, so the redirect set below is /, /explore, /docs, /legal and /p/*. It is corrected in place rather than left with an appended note contradicting it, because a card whose §1 and whose tail disagree is a card whose runner picks one.

2 — The MIGRATION sweep: every caller of the old address

The card's verb is move, so the referrers are call sites rather than cards. grep this repository for the literal app.motir.co and give every hit one of two dispositions — in this card's scope, or a named sibling card. There is no third option, and "the rest later" without a card is the orphan. The hits on origin/main today fall into groups, and each needs a verdict written into the PR:

  • Content that a reader followscontent/legal/*.md (privacy, terms, DPA, cookies, subprocessors, acceptable-use) and docs/*.md. A legal document naming an address that redirects is not wrong, but it is now imprecise about where the service is provided; decide per document and say why.
  • Tests that assert the addresstests/baseUrl.test.ts, tests/hosting/appUrlSeam.test.ts, tests/rootMetadata.test.ts, tests/emailDeliveryRecord.test.ts, tests/brand/emailBrandHeader.test.tsx, the API-docs and OpenAPI registry tests. These encode the CURRENT contract and must move with it, not be deleted.
  • Design notesdesign/brand/design-notes.md, design/mcp-server/design-notes.md.
  • Decision recordsdocs/decisions/*.md. These are HISTORY and are not rewritten; where one states a fact that is no longer true, the amendment the ADR card wrote is what a reader is pointed at.

The abandoned path is itself a deliverable, and it is NOT this card's — MOTIR-3951 owns it. This clause used to say "delete it in this PR", which was a tail sentence claiming 72 files, a Server Actions module and a service-layer sweep. It is carved out: this card ships the redirects and the in-code sweep; MOTIR-3951 removes app/(public) and is blocked_by this card, because a path must be unreachable before it is deleted rather than after.

3 — What is NOT in this card, and who owns it

The values that live outside this repository move on the cutover card: the MOTIR_BASE_URL secret, Google's OAuth redirect URIs, Better-Auth trustedOrigins as deployed, the Search Console sitemap submission, and NEXT_PUBLIC_MOTIR_APP_ORIGIN in motir-marketing. Those are console and platform actions, not a diff — and putting them here would straddle two repositories and a dashboard.

Acceptance criteria

  • Every path in §1 returns 308/301 with the destination on the public origin, path and query intact — one test per path family, including a topic page and a ?rank= variant.
  • /p/* returns 200 on the application host, asserted explicitly so the next story's boundary is protected by a test rather than by intent.
  • proxy.ts's matcher covers the redirected segments, and tests/navigation/proxy-matcher.test.ts still derives its expectations from app/'s filesystem — no hand-listed segment is introduced, and /admin still has none.
  • The PR body carries the full grep -rn 'app.motir.co' result with a per-hit disposition, and every hit is either changed here or names the card that owns it.
  • No route that was moved is still served by this application; the sweep for leftovers is recorded.
  • Signed-in application journeys are unaffected: /home, /settings and the item surfaces do not redirect.
  • ≥90% coverage on the files this PR touches.

Context refs

  • motir-core/proxy.ts · tests/navigation/proxy-matcher.test.ts — the mechanism and its guard
  • motir-core/lib/baseUrl.ts · lib/publicProjects/urls.ts — the origins, split by the robots/sitemap card
  • motir-core/content/legal/*.md · docs/*.md · design/*/design-notes.md · docs/decisions/*.md — the sweep's population
  • motir-core/tests/{baseUrl,rootMetadata,emailDeliveryRecord}.test.ts · tests/hosting/appUrlSeam.test.ts — the assertions that encode the old contract
  • The cutover card — owns every value outside this repository

⚠️ RE-FILED into MOTIR-3932 (2026-08-29), and its ORDER matters more than its parent

Authored under MOTIR-3876 when that story was going to serve the public surface. It no longer does. These redirects point at motir.co, and they may not ship until motir.co actually serves what they point at — otherwise /explore and /docs 301 into a 404 on the brand's own host, and the failure is invisible in CI because both sides are green in isolation.

So the card sits in the story that lands the replacements. Its in-parent edges are MOTIR-3932's own expansion pass to wire — it must come after the cards that render /explore and /docs there — and this card is not runnable until they exist. The cross-parent edges it carried into MOTIR-3881 and the archived host-branch card are dropped; the container edge carries what remains.

And its scope grows by one path. With /p/* also moving to motir.co (MOTIR-3877), the redirect set is /, /explore, /docs, /legal and /p/* — the last of which the earlier version of this card explicitly excluded. That exclusion is superseded; re-read the card's §1 against the current arrangement before building.

Discussion

No comments yet.

Adding to this discussion signs you in on app.motir.co and brings you back to this request.

Add a comment