Use Phast app for product names and preserve phast wordplay

This commit is contained in:
codex committed 2026-10-07 22:19:16 -07:00
1 parent 1f15789abd
commit 64d2374f60
7 files changed
+51 -28

No files matched your search

+1 -1
View File
@@ -2,7 +2,7 @@
## Scope
Build and maintain Phast as a deliberately small Python + Prefab + MCP application platform.
Build and maintain Phast app as a deliberately small Python + Prefab + MCP application platform.
## Product model
+30 -7
View File
@@ -1,10 +1,10 @@
# phast
# Phast app
Canonical source of truth for Phast.
Canonical source of truth for Phast app.
> **Connect your tools once. Bring your tool belt anywhere.**
Phast gives a person one portable MCP plus a programmable Prefab home. Connect `my.phast.app/mcp` to an agent to create and manage Phasts. A created Phast has two matching surfaces:
Phast app gives a person one portable MCP plus a programmable Prefab home. Connect `my.phast.app/mcp` to an agent to create and manage Phast apps. A created Phast app has two matching surfaces:
- `user.phast.app` — human / Prefab home
- `user.phast.app/mcp` — the user's portable MCP tool belt
@@ -29,10 +29,33 @@ Connect once to `my.phast.app/mcp` → create/manage `user.phast.app` → search
## Boundaries
- **Phast composes.** It owns the portable MCP/tool belt and Prefab composition.
- **Oracle discovers.** Provider/MCP/OAuth discovery comes from the capability graph, not a hard-coded Phast directory.
- **Persimmons holds secrets.** Phast stores connection/authority references, not secret values.
- **Phast app composes.** It owns the portable MCP/tool belt and Prefab composition.
- **Oracle discovers.** Provider/MCP/OAuth discovery comes from the capability graph, not a hard-coded Phast app directory.
- **Persimmons holds secrets.** Phast app stores connection/authority references, not secret values.
- **Factory builds/operates.** Provisioning uses bounded deterministic infrastructure routes.
- **Clients are replaceable.** ChatGPT, Claude, Codex, or another MCP client should be able to use the same Phast without recollecting the user's tools.
- **Clients are replaceable.** ChatGPT, Claude, Codex, or another MCP client should be able to use the same Phast app without recollecting the user's tools.
V0 is intentionally not arbitrary app generation. Prove the portable-tool-belt + editable-home loop first.
## Naming and copy
Use **Phast app** when naming the product or one of its instances; use
**Phast apps** for the plural. Write “your Phast app,” “create a Phast app,”
and “My Phast app” for the management connector. Existing all-caps display
styles may use “PHAST APP.” Apply this to page titles, metadata, navigation,
buttons, examples, generated homes, MCP display text, and documentation.
Keep deliberate substitutions for “fast”: “make something phast,”
“built phast,” and “make MCP apps phast.” Do not rename literal domains,
URLs, `phast.json`, environment variables, CSS classes, tool names, or
schema keys/values as part of a copy edit. Preserve user-chosen app names.
The public copy lives in `index.html` (phast.app), `my/index.html`
(my.phast.app), and `server.py` (generated personal homes and MCP display
text). `phast.json` supplies the management display name. Review these
surfaces together when changing product naming.
Chair review: the standalone “PHAST.” wordmark and the “My Phast” connector
label could be separate brand treatments. This change proposes “PHAST APP.”
and “My Phast app” consistently; the chair should confirm those treatments.
The phrase “your Phast” names an app instance, so it becomes “your Phast app.”
+1 -1
View File
@@ -1 +1 @@
"""Phast application runtime."""
"""Phast app runtime."""
+5 -5
View File
@@ -4,8 +4,8 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="theme-color" content="#050505">
<meta name="description" content="Phast — make MCP apps phast.">
<title>phast</title>
<meta name="description" content="Phast app — make MCP apps phast.">
<title>Phast app</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Bangers&family=DM+Mono:wght@400;500&family=Inter:wght@500;700;900&display=swap" rel="stylesheet">
@@ -26,14 +26,14 @@
<h1><span class="make-line">MAKE SOMETHING</span><span class="phast-line">PHAST</span></h1>
<div class="sequence">
<div class="step"><b>01 CONNECT</b><span>add my.phast.app/mcp</span></div>
<div class="step"><b>02 MAKE</b><span>create your Phast</span></div>
<div class="step"><b>02 MAKE</b><span>create your Phast app</span></div>
<div class="step"><b>03 TUNE</b><span>tools + prefab widgets</span></div>
<div class="step"><b>04 RUN</b><span>use it from any agent</span></div>
</div>
</div>
<div class="copy">
<p><strong>Connect your tools once.</strong><br>Bring your tool belt anywhere. ChatGPT, Claude, Codex — same Phast, same tools, same home.</p>
<a class="cta" href="https://my.phast.app"><span>BUILD YOUR PHAST</span><span>→</span></a>
<p><strong>Connect your tools once.</strong><br>Bring your tool belt anywhere. ChatGPT, Claude, Codex — same Phast app, same tools, same home.</p>
<a class="cta" href="https://my.phast.app"><span>BUILD YOUR PHAST APP</span><span>→</span></a>
<p class="meta" style="margin-top:14px;color:#666">one connector // many personal MCPs</p>
</div>
</section>
+5 -5
View File
@@ -20,17 +20,17 @@
</head>
<body>
<main class="page">
<header class="top"><a class="brand" href="https://phast.app">PHAST.</a><span class="topnote">MY PHAST // CONTROL MCP</span></header>
<header class="top"><a class="brand" href="https://phast.app">PHAST APP.</a><span class="topnote">MY PHAST APP // CONTROL MCP</span></header>
<section class="hero">
<div><p class="kicker">START HERE // ONE CONNECTION</p><h1>YOUR MCP.<span>BUILT PHAST.</span></h1></div>
<div class="intro"><p>Add <strong>My Phast</strong> to your agent once. Then create personal MCPs, add tools, stream Prefab, and keep what works.</p><button class="connector" id="copy"><span>COPY YOUR PHAST APP MCP</span><span>↗</span></button><div class="endpoint">https://my.phast.app/mcp</div></div>
<div class="intro"><p>Add <strong>My Phast app</strong> to your agent once. Then create personal MCPs, add tools, stream Prefab, and keep what works.</p><button class="connector" id="copy"><span>COPY YOUR PHAST APP MCP</span><span>↗</span></button><div class="endpoint">https://my.phast.app/mcp</div></div>
</section>
<section class="lane">
<div class="lanehead"><h2>ZERO → PERSONAL MCP</h2><span class="mono">CHAT IS THE SETUP UI</span></div>
<div class="steps">
<article class="step" data-n="1"><span class="label">01 // CONNECT</span><h3>ADD MY PHAST</h3><p>Connect the management MCP in ChatGPT, Claude, Codex, or another MCP client. Authenticate once with Teahub.</p><div class="cmd"><b>MCP</b> my.phast.app/mcp</div></article>
<article class="step" data-n="2"><span class="label">02 // CREATE</span><h3>TELL YOUR AGENT</h3><p>No project wizard. Name it in chat. Wildcard DNS, TLS, home, and MCP are already waiting.</p><div class="cmd"><b>YOU</b> create me a phast called sunday</div></article>
<article class="step" data-n="3"><span class="label">03 // TUNE</span><h3>BUILD THE BELT</h3><p>Add providers, tools, and Prefab widgets. Your agent and your web home edit the same Phast.</p><div class="cmd"><b>YOU</b> add github + a PR widget</div></article>
<article class="step" data-n="1"><span class="label">01 // CONNECT</span><h3>ADD MY PHAST APP</h3><p>Connect the management MCP in ChatGPT, Claude, Codex, or another MCP client. Authenticate once with Teahub.</p><div class="cmd"><b>MCP</b> my.phast.app/mcp</div></article>
<article class="step" data-n="2"><span class="label">02 // CREATE</span><h3>TELL YOUR AGENT</h3><p>No project wizard. Name it in chat. Wildcard DNS, TLS, home, and MCP are already waiting.</p><div class="cmd"><b>YOU</b> create me a Phast app called sunday</div></article>
<article class="step" data-n="3"><span class="label">03 // TUNE</span><h3>BUILD THE BELT</h3><p>Add providers, tools, and Prefab widgets. Your agent and your web home edit the same Phast app.</p><div class="cmd"><b>YOU</b> add github + a PR widget</div></article>
</div>
</section>
<section class="what">
+1 -1
View File
@@ -2,7 +2,7 @@
"schema_version": 1,
"kind": "phast",
"slug": "my",
"name": "My Phast",
"name": "My Phast app",
"host": "my.phast.app",
"surfaces": {"human": "/", "mcp": "/mcp"},
"tools": {
+8 -8
View File
@@ -95,7 +95,7 @@ def path(value: str) -> Path:
def read(value: str) -> dict[str, Any]:
p = path(value)
if not p.exists():
raise KeyError("unknown Phast")
raise KeyError("unknown Phast app")
return json.loads(p.read_text())
@@ -120,7 +120,7 @@ def write(value: str, data: dict[str, Any]) -> dict[str, Any]:
def mine(value: str) -> dict[str, Any]:
data = read(value)
if data.get("owner") != actor():
raise PermissionError("not your Phast")
raise PermissionError("not your Phast app")
return data
@@ -180,14 +180,14 @@ def human(data: dict[str, Any]) -> str:
'<!doctype html><meta name="viewport" content="width=device-width">'
+ "<title>"
+ data["name"]
+ " - phast</title>"
+ " - Phast app</title>"
+ "<style>body{margin:0;background:#f5f3ee;color:#121211;font:14px system-ui}"
+ "main{max-width:1000px;margin:auto;padding:32px}header{display:flex;justify-content:space-between}"
+ "b{font-size:28px}em{color:#ff4d00}h1{font-size:72px;letter-spacing:-5px;margin:80px 0 40px}"
+ "section{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}"
+ "article{border:1px solid #d5d1c8;padding:18px;min-height:150px}p{color:#77746c}"
+ "@media(max-width:700px){section{grid-template-columns:1fr}}</style>"
+ "<main><header><b>phast<em>.</em></b><code>"
+ "<main><header><b>Phast app<em>.</em></b><code>"
+ data["host"]
+ "/mcp</code></header><h1>"
+ data["name"]
@@ -198,9 +198,9 @@ def human(data: dict[str, Any]) -> str:
m = FastMCP(
"My Phast",
"My Phast app",
version="0.2.0",
instructions="Create and manage portable Phast MCP tool belts and Prefab homes.",
instructions="Create and manage portable Phast app MCP tool belts and Prefab homes.",
auth=auth("https://my.phast.app"),
mask_error_details=True,
)
@@ -317,7 +317,7 @@ def inst(value: str):
personal = FastMCP(
data["name"],
version="0.2.0",
instructions="Portable personal Phast MCP.",
instructions="Portable personal Phast app MCP.",
auth=auth("https://my.phast.app", "https://" + data["host"]),
mask_error_details=True,
)
@@ -385,7 +385,7 @@ class Router:
try:
data = read(value)
except Exception:
await JSONResponse({"error": "unknown Phast"}, status_code=404)(scope, receive, send)
await JSONResponse({"error": "unknown Phast app"}, status_code=404)(scope, receive, send)
return
if request_path == "/" and method in {"GET", "HEAD"}: