MOTIR-4118Done
motir.co's crawl surface covers /p/* — the Atom feed route, the sitemap entries and the per-project OpenGraph card
Opened by Zhu Yue ·
Everything on /p/* that a machine consumes, on motir.co:
/p/[identifier]/changelog.xml— a route handler that serves the project's Atom document, sourced from the feed endpoint the crawl endpoints card adds, withContent-Type: application/atom+xml. This exact path is not a choice.motir-core'sproxy.tsmatches/p/:path*and 308s to the same path on the public origin, so the address existing subscribers hold —app.motir.co/p/<id>/changelog.xml— lands here or lands nowhere.- The sitemap gains
/p/*.app/sitemap.tsis currently static and returns a fixed list; it now also enumerates public projects from the index endpoint that card adds, one entry per project plus its tab paths, withlastModifiedfrom the index'supdatedAt. That makes the sitemap dynamic — it reads a network resource — so the route's own rendering mode changes and the file's ⚠️ "STATIC, unlike motir-core's" note is rewritten rather than left contradicting the code. A failed index read emits the static entries rather than an empty sitemap: a sitemap that briefly loses its project pages is recoverable, one that 500s is not. - The per-project OpenGraph card —
app/p/[identifier]/opengraph-image.tsx, built the wayapp/opengraph-image.tsxalready is here, with@motir/brand's faces viaapp/_brand/ogFonts.ts. Readnext.config.ts'soutputFileTracingIncludescomment before assuming the fonts ship: it says the key is inert under the Turbopack build that actually runs, that Turbopack's own tracer is what carries the bytes, and that the evidence is the built trace (grep -l Inter- .next/server/app/**/*.nft.json) — never the presence of the config key. Check the trace for this new route. robots.txt— confirm/p/*is crawlable under the existing allow-all rule, and if any/p/path should not be indexed, say which and why on the card.
The deleted opengraph-image.tsx under motir-core/app/(public)/p/[identifier]/ is prior art, not a source to copy — this repository's OG pipeline is its own.
Acceptance criteria
motir.co/p/<identifier>/changelog.xmlreturns a valid Atom document withContent-Type: application/atom+xml, byte-equivalent to what the producing endpoint serves, and 404s for a non-public project.- The path is exactly the one
proxy.ts's/p/:path*redirect produces, demonstrated by following a redirect from the old address in a test or a recorded probe. motir.co/sitemap.xmllists every public project and its tab paths with alastModifiedfrom the index, alongside the existing static entries; when the index read fails it still returns the static entries and a 200.app/sitemap.ts's rendering mode is correct for a request-time read, and its header comment describes what the file now does./p/<identifier>serves a per-project OpenGraph image; the built trace for that route is inspected and shown to carry the font bytes, pernext.config.ts's own instruction.robots.txtallows/p/*, or names the exclusion and its reason.- No file outside
motir-marketingis touched.
Context refs
motir-marketing/app/sitemap.ts— the static list and its ⚠️ note about being staticmotir-marketing/app/robots.ts— allow-all, and the note that a change is only live after deploymotir-marketing/app/opengraph-image.tsx·app/_brand/ogFonts.ts·next.config.ts— the OG pipeline and the inert-config warningmotir-marketing/lib/siteOrigin.ts—siteUrl(), the absolute-URL requirementmotir-core/proxy.ts—PUBLIC_REDIRECT_SEGMENTSand the/p/:path*matcher entrymotir-core/lib/publicProjects/atomFeed.ts— the document's real shape, served by the producing cardmotir-core/docs/decisions/public-surface-hosts.md§6 — each host writes its own, neither describes the other
Discussion
No comments yet.
Adding to this discussion signs you in on app.motir.co and brings you back to this request.