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 · Work items

MOTIR-4118Done

motir.co's crawl surface covers /p/* — the Atom feed route, the sitemap entries and the per-project OpenGraph card

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, with Content-Type: application/atom+xml. This exact path is not a choice. motir-core's proxy.ts matches /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.ts is 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, with lastModified from the index's updatedAt. 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 cardapp/p/[identifier]/opengraph-image.tsx, built the way app/opengraph-image.tsx already is here, with @motir/brand's faces via app/_brand/ogFonts.ts. Read next.config.ts's outputFileTracingIncludes comment 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.xml returns a valid Atom document with Content-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.xml lists every public project and its tab paths with a lastModified from 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, per next.config.ts's own instruction.
  • robots.txt allows /p/*, or names the exclusion and its reason.
  • No file outside motir-marketing is touched.

Context refs

  • motir-marketing/app/sitemap.ts — the static list and its ⚠️ note about being static
  • motir-marketing/app/robots.ts — allow-all, and the note that a change is only live after deploy
  • motir-marketing/app/opengraph-image.tsx · app/_brand/ogFonts.ts · next.config.ts — the OG pipeline and the inert-config warning
  • motir-marketing/lib/siteOrigin.tssiteUrl(), the absolute-URL requirement
  • motir-core/proxy.tsPUBLIC_REDIRECT_SEGMENTS and the /p/:path* matcher entry
  • motir-core/lib/publicProjects/atomFeed.ts — the document's real shape, served by the producing card
  • motir-core/docs/decisions/public-surface-hosts.md §6 — each host writes its own, neither describes the other