import Link from "next/link"; import type { ReactNode } from "react"; import type { Metadata } from "next"; import { SiteShell } from "@/components/site-shell"; import { mono, pre, table, td, th } from "../openontology/ui"; export const metadata: Metadata = { title: "OpenStack.md ยท LogicSRC", description: "OpenStack.md is one Markdown file that says what a piece of software is built on: languages, runtimes, every interface and what each is made of, data, services, tooling, hosting, the rules, and what it must never depend on. Read by a person in a minute, by an agent in one prompt, and inherited by the next project through Extends.", alternates: { canonical: "/openstack" } }; const FILE = `# LogicSRC - **Kind**: monorepo - **Web**: https://logicsrc.com - **Repo**: https://github.com/profullstack/logicsrc - **Operator**: https://logicsrc.com/.well-known/openprofile.md - **License**: MIT - **Updated**: 2026-09-21 Open coordination standards for humans and AI agents, with the reference implementation of each standard beside its text. ## Languages - TypeScript 5.9: everything, as ES modules with \`.js\` specifiers in source ## Runtimes - Node 24: the CLI, the MCP server, the TUI, the API and the web app's server ## Interfaces ### Web - Next.js 16 (App Router): logicsrc.com, the specs and the blog - React 19 ### CLI - @logicsrc/cli: \`logicsrc\`, every standard and tool as one command ### MCP - @profullstack/logicsrc-mcp: the standards as tools, on @modelcontextprotocol/sdk 1 ## Data - Postgres (Supabase): the blog and CommandBoard - libSQL (Turso): the credentials app ## Tooling - npm 11 workspaces - vitest 4: unit and contract tests ## Not - No ORM: SQL is written by hand`; const CHILD = `# nixamp - **Kind**: product - **Web**: https://nixamp.com - **Extends**: https://profullstack.com/.well-known/openstack.md - **Updated**: 2026-09-21 Free radio and live streams, no account needed. ## Data - libSQL (Turso): channels, recordings and playlists ## Interfaces ### Web - Next.js 16 (App Router) - @profullstack/player: the player ## Not - No client-side analytics: the stats script is enough`; const ITEM = `- Name version (status): role - Next.js 16 (App Router): logicsrc.com, the specs and the blog - Playwright 1.57: end to end - Redis (hold): the old session store, nothing new goes here - Bun 1 (trial): the worker, to see if it holds up`; const LAYERS: Array<[string, string]> = [ ["Languages", "Every language source is written in, human or query."], ["Runtimes", "What executes it: a Node or Bun major, a browser, Deno, Electron, an edge runtime."], ["Interfaces", "Every way in, one ### each: web, api, cli, tui, mcp, desktop, mobile, worker, extension, bot, library."], ["Data", "Where state lives: databases, caches, queues, object stores, files."], ["Services", "Third parties the running software calls: payments, email, search, models, analytics."], ["Modules", "The packages the project treats as its own foundation: a house library, a shared kit."], ["Tooling", "What builds, tests, lints and ships it: package manager, bundler, test runner, CI."], ["Hosting", "Where it runs and how it is deployed."], ["Auth", "How a person or an agent signs in."], ["Conventions", "The rules the code follows that a reader could not infer."], ["Not", "What the project must not depend on, and why when the why is short."] ]; const READER: Array<[string, string]> = [ ["Use what is listed", "At the versions listed, for what the role says."], ["Prefer a listed item", "Over a new one that does the same job. A project with vitest listed gets its tests in vitest."], ["Ask before adding a layer or a service", "A new database, a new third party, a new runtime is the author's decision. A small package inside an existing layer is ordinary work."], ["Never add anything under Not", "And never build new work on an item marked hold or leaving."], ["Keep the file true", "An agent that adds something, with permission, adds the bullet."] ]; const ABSENT: Array<[string, string]> = [ ["No inventory", "A stack is the things a maintainer would name, not the lockfile. A project that needs the closure has an SBOM; this is the other file."], ["No pins", "A version is what the code is written against. The manifest holds the exact one, and it changes every week."], ["No detection", "The file is what the project says. A scanner guesses; this does not. A directory may compare the two."], ["No verification", "Nothing checks that a project uses what it lists. The author is the one who has to build on it."], ["No registry", "A stack is a file on a site or in a repository. A directory is optional."], ["No scoring", "The file says what is used, not whether that was wise."] ]; export default function OpenStackPage(): ReactNode { return (

LogicSRC standards surface

OpenStack.md

One Markdown file that says what a piece of software is built on. The languages, the runtimes, every interface and what each is made of, the data, the services, the tooling, the hosting, the rules, and what it must never depend on. Read by a person in a minute, by an agent in one prompt, and inherited by the next project.

Every project has a stack and nowhere to say it. The lockfile lists nine hundred packages and cannot tell the twelve that matter from the rest. The README says "built with Next.js" and stops. An agent handed the repository guesses the framework from the imports, guesses the database from a connection string, and adds a dependency the team took out last year, because nothing in the repository said not to. And a team that has settled its stack well cannot hand it to the next project except by copying a repository and deleting most of it.

Status: 0.1. This site serves its own at{" "} /.well-known/openstack.md, and that file is the worked example in the specification.

The file

OpenStack.md beside the README, and{" "} /.well-known/openstack.md on the site. One heading, an identity block, one line, then the layers. Abridged here; the whole file is at the link above.

{FILE}

An item

One bullet per thing: the name as its maintainers spell it, the major the code is written against, one status word when it is not simply in use, and the role, which is the part no manifest has.

{ITEM}

trial is being tried in one place, hold{" "} is still present but nothing new goes on it, leaving is on its way out. Absent means in use: build with it. A version is not a pin; the manifest holds the pin.

Eleven layers

Fixed section names, matched loosely, any order, every one optional. Interfaces get a{" "} ### each and may carry their own layers when one differs from the rest.

{LAYERS.map(([name, what]) => ( ))}
{name} {what}

Extends: how a stack is shared

A house publishes one file. Every project under it names the parent and writes the ten lines that differ. A section the child writes replaces the parent's;{" "} Conventions and Not accumulate, so a rule a parent set cannot be silently unset.

{CHILD}

What a reader owes the file

This is the rule for agents, and the reason the file exists. A person shares a stack by pasting the file or pointing at its URL; a repository's AGENTS.md says{" "} Stack: see OpenStack.md once instead of restating it.

{READER.map(([rule, meaning]) => ( ))}
rule meaning
{rule} {meaning}

What is deliberately absent

{ABSENT.map(([what, why]) => ( ))}
{what} {why}

Where everything lives

); }