diff --git a/CHANGELOG.md b/CHANGELOG.md index 0eb7487..28fee9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,24 @@ All notable changes to wpide-server will be documented in this file. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning is [SemVer](https://semver.org/spec/v2.0.0.html). +## [0.7.0] — 2026-05-26 + +### Added +- **Marketing landing page at `/`** (`src/routes/landing.ts`). Dark-theme, + single-file HTML/CSS (same self-contained pattern as `/app`). Sections: + sticky nav, hero with value-prop + CTAs to `/app`, model trust-strip + (DeepSeek/Anthropic/OpenAI/xAI), 6-card features grid, 3-step "how it + works" with an inline chat preview, final CTA, footer. +- **Quick docs page at `/docs`** — setup steps, brain-split explainer, + model-routing tiers, minimal API surface reference. +- **Brand name read from `BRAND_NAME` env** (default `WP IDE Server`) so + the customer-facing name can be changed without touching code. +- No `/pricing` yet — deliberately deferred until tiers are finalised. + +### Notes +- `/app` (the existing dashboard) is unchanged and reachable from the new + nav. The landing nav links: Docs · Sign in · Get started. + ## [0.6.3] — 2026-05-26 ### Changed diff --git a/package.json b/package.json index b07804e..0775bff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wpide-server", - "version": "0.6.3", + "version": "0.7.0", "private": true, "description": "Closed orchestrator server for the WordPress IDE plugin", "type": "module", diff --git a/src/routes/landing.ts b/src/routes/landing.ts new file mode 100644 index 0000000..e270e07 --- /dev/null +++ b/src/routes/landing.ts @@ -0,0 +1,284 @@ +import type { FastifyInstance } from 'fastify'; + +/** + * Marketing landing pages served at /, /docs, and /pricing. + * Self-contained inline HTML/CSS (same pattern as dashboard.ts). + * Brand name is read from BRAND_NAME env (default below) so it's + * trivial to rebrand without redeploying. + */ +export async function landingRoutes(app: FastifyInstance): Promise { + app.get('/', async (_req, reply) => { + reply.header('content-type', 'text/html; charset=utf-8'); + return LANDING; + }); + app.get('/docs', async (_req, reply) => { + reply.header('content-type', 'text/html; charset=utf-8'); + return DOCS; + }); + // /pricing intentionally deferred — owner is still deciding tiers. +} + +const BRAND = process.env.BRAND_NAME || 'WP IDE Server'; + +const SHELL = (title: string, body: string): string => ` + + +${title} — ${BRAND} + + + +${body} + +`; + +const LANDING = SHELL('AI brain for your WordPress IDE', ` +
+
+ Closed orchestrator · Open client +

The AI brain behind your WordPress IDE.

+

Stop wrangling API keys and orchestration. One subscription, every top model, full session memory — running on a server you don't have to operate. Drop the plugin in WordPress, point it here, ship.

+ +
+
+ +
+ DeepSeek v4 · flash + thinking + pro max + Anthropic · Sonnet / Opus + OpenAI · GPT-5 / 4o + xAI · Grok 4 + realtime +
+ +
+
+

Everything you wanted from agentic WordPress.

+

Built for developers and agencies running real sites on shared hosting, multisite, or anything in between.

+
+
+
+
🔑
+

Every model, one bill

+

DeepSeek, Anthropic, OpenAI, xAI behind a single subscription. No more juggling provider keys per machine.

+
+
+
🧠
+

Server-side memory

+

Conversations remember themselves across runs and devices. The plugin sends little; the brain fills in the rest.

+
+
+
+

Cap-immune transport

+

Browser-direct streaming bypasses your hosting's ~120s proxy cap. Long agentic runs survive on Hostinger, LiteSpeed, anything.

+
+
+
🛠️
+

95+ WordPress tools

+

File ops, DB queries, WP-CLI, snapshots, post mutation, theme/plugin install — every one of them governed by your local capability policy.

+
+
+
👥
+

Teams & seat-sharing

+

Org owner pays once, seats inherit the tier. Multi-tenant out of the box.

+
+
+
🔒
+

Your data stays yours

+

The brain orchestrates; tool execution runs locally against your WordPress. The server never touches your files or database.

+
+
+
+ +
+
+

How it works

+

Three steps from I want AI in WordPress to I'm shipping changes from chat.

+
+
+
+ 1 +

Install the plugin

+

Drop the open-source wordpress-ide plugin into any WP site. Standard ZIP upload — works on shared hosting, multisite, anywhere.

+
+
+ 2 +

Sign up here, copy your license key

+

Free tier gives you flash-tier models out of the box. Upgrade when you want thinking models or the big context windows.

+
+
+ 3 +

Paste, save, chat

+

WordPress IDE → AI Brain (Server) → paste the key, hit Save, start chatting. Tools run locally; the brain is here.

+
+
+
+
~ chat in WordPress admin
+
// You
+list every inactive plugin and tell me which haven't been updated in a year
+
+// AI brain (deepseek-v4-flash, 744ms)
+You have 14 inactive plugins. Of those:
+  • classic-editor — last updated 11 months ago
+  • akismet          — last updated 3 weeks ago
+  • hello-dolly      — last updated 4 years ago  ⚠ stale
+  …
+
+
+ +
+

Start free. Upgrade when you outgrow it.

+

Free tier is open-ended for personal projects. Pro/Max tiers when you're shipping at scale.

+ Create your account → +
+`); + +const DOCS = SHELL('Docs', ` +
+

${BRAND} — Quick docs

+

The minimum you need to wire the WordPress IDE plugin into this server and start running agentic chats.

+ +

1 · Set up

+
    +
  1. Install the WordPress IDE plugin (ZIP upload in WP admin → Plugins → Add New).
  2. +
  3. Create an account on this server at /app. You get a license key on signup.
  4. +
  5. In WP admin: WordPress IDE → AI Brain (Server). Paste your license key, set Server URL to ${process.env.PUBLIC_BASE_URL || 'https://this-server'}, toggle the mode on, hit Save.
  6. +
  7. Open the WP IDE chat and say hello. The first reply confirms the connection.
  8. +
+ +

2 · How the brain split works

+

The plugin holds your local capability policy (file ops, DB queries, etc.). The server holds the orchestrator, system prompts, and LLM credentials. Every tool the agent calls runs on your WordPress host; every reasoning step runs here.

+ +

Two transports

+

Relay mode (default): WP plugin POSTs the goal here, then polls our async run. Works everywhere; bounded by your host's max request time.

+

Browser-direct mode (cap-immune): the chat opens an EventSource straight to this server. The WP host is removed from the long-lived connection entirely, so a 120s proxy cap on shared hosting can no longer cut a long agentic run. Toggle it in AI Brain (Server) → Browser-direct streaming.

+ +

3 · Model routing

+

Your subscription tier caps which models the router may pick:

+
    +
  • basic → deepseek-v4-flash and equivalents
  • +
  • pro → +thinking-mode models
  • +
  • max → +deepseek-v4-pro max-thinking, frontier models from each provider
  • +
+

You can request a specific model in the chat composer; the server downgrades to your tier ceiling if it's outside your plan.

+ +

4 · API surface (if you want to poke it)

+
// health
+GET  /v1/health
+
+// start an async agentic run (browser-direct mode)
+POST /v1/runs/start
+     { goal, context, options, tools_manifest, browser_tools:true }
+     → { run_id, session_id }
+
+// the live SSE event stream for that run
+GET  /v1/runs/:id/stream
+
+// deliver a tool result (in browser-direct mode)
+POST /v1/runs/:id/tool_result
+     { call_id, ok, result, error }
+
+// sync run (non-browser callers; bounded by host timeout)
+POST /v1/runs
+     { goal, context, options, tools_manifest, callback_url, callback_secret }
+
+ +

5 · Need help?

+

Open the chat in WP admin and ask. The brain knows about itself.

+
+`); diff --git a/src/server.ts b/src/server.ts index 3fabb6e..840cfe4 100644 --- a/src/server.ts +++ b/src/server.ts @@ -10,6 +10,7 @@ import { billingRoutes } from './routes/billing.js'; import { oauthRoutes } from './routes/oauth.js'; import { dashboardRoutes } from './routes/dashboard.js'; import { teamRoutes } from './routes/teams.js'; +import { landingRoutes } from './routes/landing.js'; async function main(): Promise { if (config.ALLOW_INSECURE_TLS) { @@ -53,6 +54,7 @@ async function main(): Promise { await app.register(oauthRoutes); await app.register(teamRoutes); await app.register(dashboardRoutes); + await app.register(landingRoutes); // GET /, /docs — marketing pages app.setErrorHandler((err: FastifyError, _req, reply) => { logger.error({ err }, 'Request failed');