From 0f6326e910d636e145a938e1bdc191b790e29fce Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Sat, 12 Sep 2026 10:55:52 -0700 Subject: [PATCH] Serve LogicSRC's own OpenProfile.md, and install OpenMCP with one line (#156) logicsrc.com/.well-known/openprofile.md was a 404 while every relay in the OpenMCP catalog, Obscura included, named it as its operator. The site that publishes the spec now serves its own file: Kind organization, accounts (GitHub, blog, the catalog, the Obscura relay so the trust chain closes both ways), topics, projects and contact. The root layout carries rel="openprofile" and every response carries the same relation as a Link header, per the spec's discovery rules. skill.md and llms.txt point at it. The OpenMCP spec page and docs/openmcp.md now lead with curl -fsSL https://openmcp.logicsrc.com/install.sh | sh instead of npx, and the descriptor examples name logicsrc.com's real profile rather than one profullstack.com never served. Claude-Session: https://claude.ai/code/session_01Qh2dieNyPZ4Hx5g3XNJ1Eo Co-authored-by: Claude Fable 5.1 --- apps/logicsrc-web/next.config.ts | 6 +++ .../app/.well-known/openprofile.md/route.ts | 50 +++++++++++++++++++ apps/logicsrc-web/src/app/layout.tsx | 5 ++ apps/logicsrc-web/src/app/llms.txt/route.ts | 2 + apps/logicsrc-web/src/app/openmcp/page.tsx | 20 ++++++-- apps/logicsrc-web/src/app/skill.md/route.ts | 2 + docs/openmcp.md | 14 +++++- 7 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 apps/logicsrc-web/src/app/.well-known/openprofile.md/route.ts diff --git a/apps/logicsrc-web/next.config.ts b/apps/logicsrc-web/next.config.ts index 11f787b..740bbdd 100644 --- a/apps/logicsrc-web/next.config.ts +++ b/apps/logicsrc-web/next.config.ts @@ -24,6 +24,12 @@ const securityHeaders = [ { key: "X-Frame-Options", value: "SAMEORIGIN" }, { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" }, { key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=()" }, + // OpenProfile.md discovery for responses that are not HTML (feeds, JSON, + // the specs as Markdown): the same relation the root layout puts in . + { + key: "Link", + value: `<${(process.env.PUBLIC_URL ?? "https://logicsrc.com").replace(/\/$/, "")}/.well-known/openprofile.md>; rel="openprofile"`, + }, ]; /** diff --git a/apps/logicsrc-web/src/app/.well-known/openprofile.md/route.ts b/apps/logicsrc-web/src/app/.well-known/openprofile.md/route.ts new file mode 100644 index 0000000..ed4541e --- /dev/null +++ b/apps/logicsrc-web/src/app/.well-known/openprofile.md/route.ts @@ -0,0 +1,50 @@ +const SITE_URL = (process.env.PUBLIC_URL ?? "https://logicsrc.com").replace(/\/$/, ""); + +// GET /.well-known/openprofile.md: LogicSRC's own OpenProfile.md, the file the +// spec at /openprofile says a domain serves for itself. Relays in the OpenMCP +// catalog name this URL as their operator, so it has to resolve. +export function GET(): Response { + const body = `# LogicSRC + +- **Kind**: organization +- **Handle**: @logicsrc +- **Web**: ${SITE_URL} +- **Email**: support@logicsrc.com +- **Avatar**: ${SITE_URL}/icon.svg +- **Parent**: [Profullstack, Inc.](https://profullstack.com) + +Open coordination standards for humans, AI agents, plugins, payment systems and hosted products. + +## Accounts + +- [GitHub](https://github.com/profullstack/logicsrc) +- [GitHub org](https://github.com/logicsrc) +- [Blog](${SITE_URL}/blog) +- [OpenMCP catalog](https://openmcp.logicsrc.com) +- [Obscura relay](https://obscura.openmcp.logicsrc.com) + +## Topics + +- open standards, coordination, ai agents, mcp, openmcp, openprofile, openresume, openjob, opencreds, asdlc, credential sharing, agent orchestration + +## Projects + +- [OpenMCP](${SITE_URL}/openmcp): an open catalog of MCP relays, live at https://openmcp.logicsrc.com +- [OpenProfile.md](${SITE_URL}/openprofile): one Markdown file for who and where, people and agents alike +- [ASDLC](${SITE_URL}/asdlc): the agentic software development lifecycle +- [OpenCreds](${SITE_URL}/opencreds): end-to-end encrypted credential sharing +- [Docs](${SITE_URL}/docs): every specification LogicSRC publishes + +## Contact + +- Support: support@logicsrc.com +- Security: security@profullstack.com +- Privacy: privacy@profullstack.com +`; + return new Response(body, { + headers: { + "content-type": "text/markdown; charset=utf-8", + "cache-control": "public, max-age=3600", + }, + }); +} diff --git a/apps/logicsrc-web/src/app/layout.tsx b/apps/logicsrc-web/src/app/layout.tsx index becb010..cb45c6e 100644 --- a/apps/logicsrc-web/src/app/layout.tsx +++ b/apps/logicsrc-web/src/app/layout.tsx @@ -77,6 +77,11 @@ const jsonLd = { export default function RootLayout({ children }: { children: ReactNode }): ReactNode { return ( + + {/* OpenProfile.md discovery (/openprofile, rule "A link element"): the + site points at its own profile, the one relays name as operator. */} + +