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
145
planned
1,361
shipped

Motir · Roadmap

MOTIR-4115Done

motir.co serves /p/[identifier] — the layout, the tab nav, the Overview and the page's own entity signal

Opened by Zhu Yue ·

motir.co answers for /p/[identifier] for the first time. This card ships the page's shell and its first screen: the route segment, the layout, the tab bar, the Overview, and the page's own entity signal.

Measured on the live hosts while planning: https://motir.co/p/MOTIR404, and https://motir.co/explore200 with cards rendering href="/p/MOTIR". This is the card that makes that link resolve.

What ships:

  • app/p/[identifier]/layout.tsx — the project shell inside motir.co's existing chrome (SiteHeader / SiteFooter): the hero from the subject read, and the tab bar with its five destinations rendered as links, current-state included. The tab bar ships here even though its tabs land in the tabs card — a shell with no navigation is not a shell; the tab routes it points at arrive next.
  • app/p/[identifier]/page.tsx — the Overview: the authored README as Markdown, the tags, the stats, the empty state for a project with no overview.
  • lib/publicProject.ts — the data layer, following lib/explore.ts exactly: the DTO shapes restated from motir-core's contract, one fetch against ${APP_ORIGIN}/api/public, next: { revalidate: 0 }, and failed-style error handling — an unreachable API is a real state of this surface, not a crash. No database client (the standing repository rule).
  • 404 vs error, distinguished. A 404 { code } from the subject read is notFound(); an unreachable API is the error state the design draws. Conflating them turns an outage into "this project does not exist", which is worse than an error page.
  • The entity signal: metadata with a canonical on SITE_ORIGIN (lib/siteOrigin.ts), og:url naming this host, and JSON-LD in the shape app/explore/_components/JsonLd.tsx established. The OpenGraph IMAGE and the sitemap entries are the crawl-surface card's — this card sets the metadata that names them.

Out of scope, and each named to its owner: the five tabs' own routes (tabs), the detail pages and the request form (detail pages), every act affordance including follow/vote/edit (act affordances), the OG image, sitemap and Atom route (crawl surface). The tab bar renders links to routes that do not exist yet; that is expected and is why the tabs card is blocked_by this one rather than the reverse.

Build to the design asset, not to the deleted page: motir-marketing/design/public-projects/.

Acceptance criteria

  • motir.co/p/<identifier> renders, for a logged-out visitor, a public project's hero and its overview README, inside motir.co's own header/nav/footer chrome.
  • An unknown or non-public identifier renders a 404; an unreachable public API renders the design's error state, and the two are distinguishable in the code and in a test.
  • The tab bar renders all five destinations with the current one marked, and the page's own tab reads as current.
  • Every read goes through lib/publicProject.ts to ${APP_ORIGIN}/api/public/...; no @prisma/client, no database URL, and no direct database import appears anywhere in this repository after this card (asserted by the standing guard).
  • canonical, og:url and the JSON-LD @id all name SITE_ORIGIN — never APP_ORIGIN — and a test asserts it.
  • The empty state (a public project with no authored overview) renders as the design draws it.
  • The page matches design/public-projects/'s Overview board; any deviation is recorded on the asset, not left in the code.
  • No file outside motir-marketing is touched.

Context refs

  • motir-marketing/lib/explore.ts — the data-layer pattern to follow, including the failed state and the no-database-client comment
  • motir-marketing/lib/appOrigin.ts · lib/siteOrigin.ts — which origin answers which question
  • motir-marketing/app/explore/page.tsx · app/explore/_components/JsonLd.tsx · app/legal/[slug]/page.tsx — the closest shipped precedents
  • motir-marketing/app/_components/SiteHeader.tsx · SiteFooter.tsx
  • motir-core/app/api/public/p/[identifier]/route.ts — the subject read (PublicProjectOverviewDto), shipped by MOTIR-3945
  • motir-core/app/(public)/p/[identifier]/page.tsx @ 95a2d4468^ — the deleted page, as prior art only
  • motir-marketing/design/public-projects/ — the asset this builds to

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