diff --git a/example/backend/.env.example b/example/backend/.env.example index e538ffc..8c96c37 100644 --- a/example/backend/.env.example +++ b/example/backend/.env.example @@ -1,4 +1,4 @@ -PROCESS_NAME=actionhero-server +PROCESS_NAME=keryx PROCESS_NAME_TEST=test-server PROCESS_SHUTDOWN_TIMEOUT=30000 diff --git a/launch/README.md b/launch/README.md new file mode 100644 index 0000000..52e2eb0 --- /dev/null +++ b/launch/README.md @@ -0,0 +1,35 @@ +# Product Hunt launch — Keryx + +Working folder for the Keryx PH launch. Lives in git so the copy can be reviewed and revised before launch day. + +## What's here + +| File | Purpose | +|---|---| +| `tagline.md` | The shortlist of taglines (60-char cap). Pick one before submitting. | +| `description.md` | The PH description (256 chars). Final, ready to paste. | +| `maker-comment.md` | First comment from the maker. Posts as soon as the listing goes live. | +| `topics.md` | The 4 PH topics to pick when submitting. | +| `gallery-spec.md` | What each of the 5 gallery slots is, current state, and what's still needed. | +| `runbook.md` | Pre-launch timeline, launch-morning playbook, comment-response templates, cross-post copy. | + +## Gallery assets + +| Slot | Status | Files | +|---|---|---| +| 1 — Thumbnail (one action, every transport) | Done | `producthunt-thumbnail.svg` + `.png` | +| 2 — Quickstart (terminal) | Done | `producthunt-slot2-quickstart.svg` + `.png` | +| 3 — Claude Desktop calling MCP | Done | `producthunt-slot3-claude.svg` + `.png` (sources real screenshot `screenshot-claude-desktop.png`) | +| 4 — Typed frontend | Open | needs editor screenshot | +| 5 — Demo gif | Optional | needs short loom or gif | + +## Regenerating PNGs + +```bash +cd launch +rsvg-convert -w 1270 producthunt-thumbnail.svg -o producthunt-thumbnail.png +rsvg-convert -w 1270 producthunt-slot2-quickstart.svg -o producthunt-slot2-quickstart.png +rsvg-convert -w 1270 producthunt-slot3-claude.svg -o producthunt-slot3-claude.png +``` + +Requires `librsvg` (`brew install librsvg`). diff --git a/launch/description.md b/launch/description.md new file mode 100644 index 0000000..7d21eab --- /dev/null +++ b/launch/description.md @@ -0,0 +1,16 @@ +# Description + +Product Hunt soft limit: ~260 characters. + +## Final + +> Keryx is a TypeScript framework built on Bun where one action class is your HTTP endpoint, your WebSocket handler, your CLI command, your background task, and your MCP tool. Same logic, validation, middleware, and response type. MCP and OAuth 2.1 are built in. + +**260 chars.** Right at the PH soft limit. + +## Why this version + +- Leads with the mechanic — one action class is five things — same hook as the thumbnail. +- Names the stack (Bun, TypeScript) so dev-tools browsers know what they're looking at. +- "Same logic, validation, middleware, and response type" generalizes the promise (not specific to Zod) — broader than the previous version. +- Closes on MCP/OAuth, the differentiator vs. any other Node framework on PH. diff --git a/launch/gallery-spec.md b/launch/gallery-spec.md new file mode 100644 index 0000000..c83e12a --- /dev/null +++ b/launch/gallery-spec.md @@ -0,0 +1,53 @@ +# Gallery spec + +PH supports up to 5 media items in the gallery. First slot is the thumbnail; it does ~80% of the work. + +All slots are 1270×760 PNG, dark background, matching visual language (Inter + JetBrains Mono, horn logo top-left, "keryxjs.com" top-right, footer stack line). + +## Slot 1 — Thumbnail: One action. Every transport. + +**Status:** Done. +**Files:** `producthunt-thumbnail.svg`, `producthunt-thumbnail.png` + +Headline: *One action. Every transport.* +Subhead: *The TypeScript framework where your API is also your MCP server.* + +Code block on the left showing a single `UserCreate` action class. Five arrows fanning out to five transport pills on the right: HTTP / WebSocket / CLI / Task / MCP tool. The MCP pill is visually emphasized (blue border, blue accent text on "+ OAuth 2.1") since that's the differentiator. + +## Slot 2 — Quickstart: From zero to MCP server in 248ms. + +**Status:** Done. +**Files:** `producthunt-slot2-quickstart.svg`, `producthunt-slot2-quickstart.png` + +Headline: *From zero to MCP server in 248ms.* +Subhead: *Five commands. HTTP, WebSocket, MCP, background tasks, and a Postgres-backed API.* + +Single full-width terminal mockup showing `bunx keryx new my-app` → `cd && cp .env` → `bun install` → `bun dev` → the dev-server output listing all the URLs (HTTP, WebSocket, MCP, OpenAPI, Workers, Database). URLs render in blue to look clickable. + +## Slot 3 — Claude Desktop calling MCP + +**Status:** Done. +**Files:** `producthunt-slot3-claude.svg`, `producthunt-slot3-claude.png`, `screenshot-claude-desktop.png` (source) + +Headline: *Claude calls your API directly.* +Subhead: *Add Keryx to Claude Desktop. Every action becomes an MCP tool with OAuth 2.1.* + +Real Claude Desktop screenshot on the left showing two tool calls in one turn (status check + message creation, with "Loaded tools, used keryx-local integration" badges visible). Four annotation bullets on the right: Discovered, OAuth 2.1, Read AND write, No second server. + +## Slot 4 — Typed frontend + +**Status:** Done. +**Files:** `producthunt-slot4-types.svg`, `producthunt-slot4-types.png`, `screenshot-frontend-types.png` (source) + +Headline: *Typed end-to-end. No codegen.* +Subhead: *Your backend action becomes the frontend type. Hover any response — the shape is there.* + +Side-by-side screenshot of `message.ts` (backend `MessagesList` action) and `ChatPage.tsx` (frontend), with a VS Code tooltip showing the inferred `Message` type via `ActionResponse["messages"][number]`. Four annotation bullets on the right: Backend is the source, No generated client, ActionResponse<T>, Refactor-safe. + +## Slot 5 — Demo gif (optional) + +**Status:** Open. Skip for first launch if pressed for time. + +Idea: 20–30 second loop showing the full quickstart — `bunx keryx new` → `bun dev` → `curl` hitting the new action → same action being called from Claude Desktop. Loom or gif format. If gif, keep under 5MB. + +PH supports MP4 / Loom embeds, which look better than gifs in the gallery. diff --git a/launch/maker-comment.md b/launch/maker-comment.md new file mode 100644 index 0000000..4000244 --- /dev/null +++ b/launch/maker-comment.md @@ -0,0 +1,51 @@ +# Maker comment + +First comment under the launch listing. Posts the moment the launch goes live. + +## Final + +> Hey — I'm Evan, the maker. +> +> If you've shipped an MCP server in the last year, you've probably noticed you're writing your API twice. Your REST endpoints have Zod schemas, auth middleware, error handling, logging. Then you write a parallel MCP server that re-declares all of it with slightly different shapes, a different auth model, and its own way of returning errors. The two drift. Bugs only show up in one. It's the same duplication problem REST and WebSocket had a decade ago. +> +> Keryx is the framework I wanted for that. You write one **action** class, and it's automatically your HTTP endpoint, your WebSocket handler, your CLI command, your background task, and your MCP tool. Same Zod inputs, same middleware chain, same response shape. The only thing that changes is how the request arrives. +> +> ```ts +> export class UserCreate implements Action { +> name = "user:create"; +> inputs = z.object({ name: z.string().min(3), email: z.string().email() }); +> web = { route: "/user", method: HTTP_METHOD.PUT }; +> task = { queue: "default" }; +> async run(params) { return { user: await createUser(params) }; } +> } +> ``` +> +> That class is now a `PUT /api/user` endpoint, a WebSocket action, a CLI command with `--name` and `--email` flags generated from the schema, a Resque-backed background job, and an MCP tool that Claude Desktop discovers and calls with OAuth 2.1 — no extra wiring, no second server. +> +> The stack underneath: Bun for runtime (native TS, no build step, fast test runner), Zod for validation, Drizzle for the database with auto-migrations, Resque for jobs, and a Vite + React example frontend with end-to-end typed responses via `ActionResponse`. First-party plugins for OpenTelemetry tracing and a Resque admin UI ship in the same repo. +> +> Quick start: +> +> ```bash +> bunx keryx new my-app +> cd my-app && bun install && bun dev +> ``` +> +> v0.30 — pre-1.0 but real. I'm running it in production, the docs at keryxjs.com are complete, and the example app is a working chat with channels, files, sessions, and the React frontend wired up. (For the Node.js old-timers: this is the spiritual successor to ActionHero, rewritten ground-up on Bun with MCP as a first-class transport.) +> +> Happy to answer anything in the comments — especially curious to hear from people who've hit the "writing MCP twice" wall. +> +> — Evan ([@evantahler](https://x.com/evantahler)) + +## Why this version + +- Leads with the **duplicated-MCP-server pain**, not ActionHero history. New visitors care about today's problem. +- Code block early so the mechanic lands before anyone scrolls past. +- ActionHero is one parenthetical sentence near the end, framed as credentialing for Node old-timers rather than the lead. +- ~370 words — long but every paragraph is doing work. Don't trim unless the listing is getting low engagement. + +## Quick stats + +- Word count: ~370 +- Code blocks: 2 (one for the action class, one for quickstart) +- Links: 1 (X handle at the end) diff --git a/launch/producthunt-slot2-quickstart.png b/launch/producthunt-slot2-quickstart.png new file mode 100644 index 0000000..2926d8b Binary files /dev/null and b/launch/producthunt-slot2-quickstart.png differ diff --git a/launch/producthunt-slot2-quickstart.svg b/launch/producthunt-slot2-quickstart.svg new file mode 100644 index 0000000..e638c18 --- /dev/null +++ b/launch/producthunt-slot2-quickstart.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Keryx + + + keryxjs.com + + + From zero to MCP server in 248ms. + + + Five commands. HTTP, WebSocket, MCP, background tasks, and a Postgres-backed API. + + + + + + + + ~/my-app — zsh + + + $ bunx keryx new my-app + + Scaffolded my-app + $ cd my-app && cp .env.example .env + $ bun install + + 247 packages installed in 1.2s + $ bun dev + Keryx v0.30.0 + HTTP http://localhost:8080 + WebSocket ws://localhost:8080/ws + MCP http://localhost:8080/mcp (OAuth 2.1) + OpenAPI http://localhost:8080/swagger + Workers Resque - default queue + Database keryx@localhost:5432 - 12 migrations applied + + + + + MCP and OAuth 2.1 ship in the box. No second server. No duplicated schemas. + diff --git a/launch/producthunt-slot3-claude.png b/launch/producthunt-slot3-claude.png new file mode 100644 index 0000000..94828a3 Binary files /dev/null and b/launch/producthunt-slot3-claude.png differ diff --git a/launch/producthunt-slot3-claude.svg b/launch/producthunt-slot3-claude.svg new file mode 100644 index 0000000..fe59656 --- /dev/null +++ b/launch/producthunt-slot3-claude.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Keryx + + + keryxjs.com + + + Claude calls your API directly. + + + Add Keryx to Claude Desktop. Every action becomes an MCP tool with OAuth 2.1. + + + + + + + + + + + Discovered + Every action shows up as a typed + MCP tool. No registration step. + + + + + + OAuth 2.1 + First connect opens a browser for + sign-in. PKCE under the hood. + + + + + + Read AND write + Same Zod schemas, same middleware. + Claude actually mutates your data. + + + + + + No second server + MCP is built into Keryx. Your API + is the MCP server. + + + + + Bun · TypeScript · Zod · Drizzle · MCP · OAuth 2.1 + diff --git a/launch/producthunt-slot4-types.png b/launch/producthunt-slot4-types.png new file mode 100644 index 0000000..16a0480 Binary files /dev/null and b/launch/producthunt-slot4-types.png differ diff --git a/launch/producthunt-slot4-types.svg b/launch/producthunt-slot4-types.svg new file mode 100644 index 0000000..e9182b3 --- /dev/null +++ b/launch/producthunt-slot4-types.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Keryx + + + keryxjs.com + + + Typed end-to-end. No codegen. + + + Your backend action becomes the frontend type. Hover any response — the shape is there. + + + + + + + + + + + Backend is the source + Action classes are your contract. + Zod + Drizzle define the shape. + + + + + + No generated client + No OpenAPI client. No build step. + No contract file to keep in sync. + + + + + + ActionResponse<T> + Indexes into the response. Use + ["messages"][number] and infer. + + + + + + Refactor-safe + Rename a field in the backend, + the frontend fails in tsc. + + + + + Bun · TypeScript · Zod · Drizzle · MCP · OAuth 2.1 + diff --git a/launch/producthunt-thumbnail.png b/launch/producthunt-thumbnail.png new file mode 100644 index 0000000..d913f9e Binary files /dev/null and b/launch/producthunt-thumbnail.png differ diff --git a/launch/producthunt-thumbnail.svg b/launch/producthunt-thumbnail.svg new file mode 100644 index 0000000..b6de0d4 --- /dev/null +++ b/launch/producthunt-thumbnail.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Keryx + + + keryxjs.com + + + One action. Every transport. + + + The TypeScript framework where your API is also your MCP server. + + + + + + + + UserCreate.ts + + + export class UserCreate implements Action { + name = "user:create"; + inputs = z.object({ + name: z.string().min(3), + email: z.string().email(), + }); + web = { route: "/user", method: HTTP_METHOD.PUT }; + task = { queue: "default" }; + async run(params) { + return { user: await createUser(params) }; + } + } + + + + + + + + + + + + + + + + + + HTTP + PUT /user + + + + + WebSocket + action msg + + + + + CLI + --flags from Zod + + + + + Task + Resque queue + + + + + MCP tool + + OAuth 2.1 + + + + + Bun · TypeScript · Zod · Drizzle · MCP · OAuth 2.1 + diff --git a/launch/runbook.md b/launch/runbook.md new file mode 100644 index 0000000..0d57e4a --- /dev/null +++ b/launch/runbook.md @@ -0,0 +1,153 @@ +# Launch-day runbook + +Pre-launch + launch-day playbook for the Keryx Product Hunt launch. + +## Pick the launch day + +- **Best days:** Tuesday, Wednesday, Thursday. Avoid Mondays (overcrowded PH feed) and Fridays (low traffic). +- **Avoid:** US holidays, the week of a major OpenAI / Anthropic announcement (the "MCP" hook gets buried in their news cycle), the week before / after major dev conferences. +- **Launch time:** 12:01 AM Pacific. The PH day starts at midnight PT and the algorithm front-loads — being live for the full 24 hours is the difference between top 5 and top 20. + +## T-7 days: pre-launch page + +- Set up the [PH "coming soon" page](https://www.producthunt.com/posts/new) at least a week ahead. +- Fill in: name, tagline, gallery thumbnail (`producthunt-thumbnail.png`), short description, link to keryxjs.com. +- The "coming soon" page collects email signups that auto-fire a notification the moment the listing goes live. Free upvote multiplier. +- Share the coming-soon link in: personal Slack, Bun discord (if you participate), a tweet, LinkedIn post. Don't ask for upvotes — ask for "notify me when it's live." + +## T-3 days: warm the network + +- Personal DMs / texts to 20–30 people in your dev-tools network. Specific people, not a blast list. Script: *"I'm launching Keryx on Product Hunt Tuesday. Would mean a lot if you took a look and left a comment if you have a take. No need to upvote unless you actually like it."* +- Why a comment, not just an upvote: PH's algorithm weighs comment engagement more than raw upvotes, and a real comment about *what's interesting* signals organic discussion to subsequent visitors. +- People to prioritize: framework / runtime maintainers (Bun, Drizzle, Zod authors), MCP early adopters, ActionHero alumni, anyone who's publicly shipped an MCP server in the last 6 months. + +## T-1 day: final checks + +- [ ] All 4 gallery PNGs render correctly when uploaded to PH preview +- [ ] Tagline pasted into PH form (`launch/tagline.md`) +- [ ] Description pasted (`launch/description.md`) +- [ ] Topics selected (`launch/topics.md`) +- [ ] Maker comment ready to paste the moment the listing goes live (`launch/maker-comment.md`) +- [ ] Keryx repo: `main` is green, latest published version on npm matches what the docs claim +- [ ] keryxjs.com: working, no broken links, the OpenGraph image renders (PH sometimes hot-links it for previews) +- [ ] `bunx keryx new test-app` from a fresh shell works (the quickstart MUST work — first thing visitors will try) +- [ ] Twitter / LinkedIn drafts staged in Buffer or similar (see *Cross-posts* below) + +## Launch morning + +### 12:01 AM PT — go live + +- Hit "Submit" on PH. +- Within 60 seconds: paste the maker comment from `launch/maker-comment.md` as the first comment. +- Tweet from `@evantahler`: *"Keryx is live on Product Hunt. [link]"* — short, no marketing language. The thread can have more detail if you want. + +### First hour (12:01 – 1:00 AM PT) + +This hour decides where you finish on the day. PH's algorithm weighs the first hour's engagement disproportionately. + +- Send a personal DM to your warmed list — *"Live now: [link]"*. Three lines max. No "would love your support" pleading. Just the link. +- Reply to every comment within 5 minutes. Even short comments. Engagement signals matter. +- Pin the maker comment if PH lets you. +- DO NOT post in any public channel asking for upvotes. PH actively deboosts listings caught doing this. + +### Rest of the day + +- Stay on the listing page in a browser tab. Refresh every 15 min for new comments. +- Reply to every comment, no exceptions. +- Around 9 AM PT: post on LinkedIn (US dev audience is at desks). +- Around 12 PM PT: a second tweet — usually a screenshot of a specific gallery slot with a one-line explanation. Different angle than the morning post. +- Around 3 PM PT: if a specific gallery slot is getting comments (e.g. Claude Desktop screenshot drawing questions), tweet that screenshot directly with context. +- Around 6 PM PT: a final tweet thanking commenters by handle. + +### Don't + +- Don't post in Slack or Discord asking for upvotes (PH deboosts). +- Don't reply to negative comments defensively. Acknowledge the point, link to docs or repo if relevant, move on. +- Don't post on Hacker News the same day. Two top-of-page launches split your attention and your audience. Save HN for the following Tuesday (see *Cross-posts* below). +- Don't refresh PH's leaderboard obsessively — it spikes your blood pressure for no useful information. + +## Comment-response templates + +Real responses from you will outperform any template, but here are scaffolds for common patterns. + +### "How is this different from [X]?" (Elysia, Hono, NestJS, tRPC, etc.) + +> Good question. The short version: most TypeScript frameworks today either focus on HTTP (Elysia, Hono) or on RPC-style type sharing (tRPC). Keryx's pitch is that the *same* action class also serves WebSocket, CLI, background tasks, and MCP tools — without rewriting the validation, middleware, or response shape for each transport. +> +> If you only need HTTP, [X] is probably the lighter pick. If you're shipping an MCP server, the duplication-vs-Keryx tradeoff is the whole point. + +### "Why Bun and not Node?" + +> Two reasons. (1) Native TypeScript with no build step — the dev loop is faster, and there's no transpiler config to maintain. (2) Bun ships `fetch`, a fast test runner, and a packager out of the box — half the framework code you'd otherwise write is just there. +> +> Keryx could theoretically run on Node, but starting from Bun let me delete a lot of code that exists in older frameworks just to paper over Node's gaps. + +### "Where do I host this in production?" + +> Anywhere that runs a Bun process. We ship a `Dockerfile` for the example app and a `docker-compose.yml` showing how the pieces (backend + Postgres + Redis + frontend) fit together. Beyond that: Fly.io, Railway, Render, your own VM — all work. The framework doesn't require a specific host. + +### "Is this production-ready?" + +> v0.30, so pre-1.0 — but I'm running it in production myself. The example app is a working Slack-like chat (channels, files, sessions, real-time PubSub). The API surface is stable; what's changing pre-1.0 is mostly internals and ergonomics. + +### Generic enthusiasm ("nice work", "looks cool") + +Short, specific, in-your-voice. *"Thanks! What part of the API are you most likely to hit first?"* Asking a question keeps the thread alive, which the algorithm weighs. + +### Negative ("yet another framework", "MCP is overhyped") + +Acknowledge, redirect to the duplication argument, don't argue. + +> Fair — the framework space is crowded. The duplication problem with MCP servers isn't unique to me, though; if you've shipped one alongside an existing REST API, the divergence between schemas / auth / errors is real. Keryx is one answer to that, not the only one. + +## Cross-posts + +### X / Twitter — morning thread (12:01 AM PT) + +Three posts in a thread: + +1. *"Keryx is live on Product Hunt. [link]"* +2. Code screenshot of the `UserCreate` action with the caption: *"One class. HTTP, WebSocket, CLI, background tasks, MCP tool. Same Zod schema, same middleware."* +3. *"The thing I actually built this for: MCP and OAuth 2.1 are built in. Your API is automatically an MCP server — Claude Desktop discovers and calls every action. No bridge, no second server."* + the slot 3 Claude Desktop screenshot. + +### LinkedIn — 9 AM PT + +One post, ~200 words. Same hook as the maker comment but tuned for the LinkedIn dev-tools audience (which skews older, more conservative, more impressed by "production-grade"). + +> If you've shipped an MCP server next to an existing REST API in the last year, you've probably noticed you're writing the same controller twice. Different schemas, different auth, different error shapes. They drift. +> +> Keryx is a TypeScript framework I've been building on Bun where one action class is your HTTP endpoint, your WebSocket handler, your CLI command, your background task, and your MCP tool. Same Zod inputs. Same middleware. Same response type. The transport just changes. +> +> Going live on Product Hunt today — would love thoughts from anyone who's hit the MCP-duplication wall: [link] + +### Hacker News — *the following Tuesday* (T+7), 9 AM ET as a "Show HN" + +> Show HN: Keryx — a TypeScript framework where every API action is also an MCP tool +> +> [link to keryxjs.com] + +Body of the post: a tighter version of the maker comment, but adjusted for HN's voice — less marketing, more "here's what I built and why." + +> Hi HN. I've been building Keryx for the last several months, and it just went live on Product Hunt last week. It's a TypeScript framework on Bun where one action class becomes your HTTP endpoint, your WebSocket handler, your CLI command, your background task, and your MCP tool — all from the same Zod schema and middleware chain. +> +> The thing I actually wanted from this was: if you've shipped an MCP server alongside an existing REST API, you've noticed you're writing the controller twice. Keryx is one answer to that. The "your API is automatically an MCP server" part is the differentiator — agents authenticate via built-in OAuth 2.1, get typed errors, and call the same validated endpoints your HTTP clients use. +> +> Spiritual successor to ActionHero (which I started in 2013), ground-up rewrite on Bun, Zod, Drizzle. v0.30, pre-1.0 but real — I'm running it in production. +> +> Happy to answer questions. + +Why HN on T+7 instead of launch day: launching simultaneously splits your attention and your audience. HN engagement will be different (more skeptical, more technical questions) and you want a clean day for it. + +## Post-launch (T+1) + +- Reply to any comments that came in overnight. +- Screenshot the final PH ranking for the day. Tweet it: *"Made it to #X today on PH. Thanks to everyone who tried it and left feedback."* +- Compile commenter handles for a thank-you list (helps future launches). +- If a critique surfaced twice in comments, file it as a GitHub issue with the `launch-feedback` label. + +## Useful links + +- Product Hunt: https://www.producthunt.com +- PH submission form: https://www.producthunt.com/posts/new +- Keryx docs: https://keryxjs.com +- Keryx repo: https://github.com/actionhero/keryx diff --git a/launch/screenshot-claude-desktop.png b/launch/screenshot-claude-desktop.png new file mode 100644 index 0000000..36b1379 Binary files /dev/null and b/launch/screenshot-claude-desktop.png differ diff --git a/launch/screenshot-frontend-types.png b/launch/screenshot-frontend-types.png new file mode 100644 index 0000000..f714430 Binary files /dev/null and b/launch/screenshot-frontend-types.png differ diff --git a/launch/tagline.md b/launch/tagline.md new file mode 100644 index 0000000..7e3b47b --- /dev/null +++ b/launch/tagline.md @@ -0,0 +1,17 @@ +# Tagline + +Product Hunt cap: **60 characters.** + +## Final + +> **The Fullstack TypeScript Framework for MCP and APIs** + +52 chars. Matches the framing on keryxjs.com and the GitHub README, so the launch reads consistently across surfaces. Trades the "one action, five transports" mechanic for clean positioning. + +## Alternates considered + +| Tagline | Chars | Notes | +|---|---|---| +| One TypeScript action: HTTP, WebSocket, CLI, MCP tool. | 54 | Mechanic-led. Punchier but doesn't match keryxjs.com framing. | +| Write the API once. It's also your MCP server. | 47 | Punchline-led. Strong if the MCP story needs to be the lead. | +| Stop writing your MCP server twice. | 35 | Pain-led. Risk: assumes the reader has hit the "MCP duplication" wall. | diff --git a/launch/topics.md b/launch/topics.md new file mode 100644 index 0000000..5c18a69 --- /dev/null +++ b/launch/topics.md @@ -0,0 +1,24 @@ +# Topics + +PH lets you pick up to **four** topics. Topics control which "best of" rankings the listing appears in and influence the algorithm's audience match. + +## Picks + +1. **Developer Tools** +2. **Open Source** +3. **Artificial Intelligence** +4. **GitHub** + +## Why these + +- **Developer Tools** is the home topic — non-negotiable. Largest dev-audience pool on PH. +- **Open Source** signals "this is freely available" and pulls in the OSS-curious browsers. +- **Artificial Intelligence** is where the MCP hook lands. Without it, the AI-shopping audience won't see this. +- **GitHub** maps to the framework's distribution (GitHub repo, GitHub releases, etc.). Also pulls in the "what's hot on GitHub" cohort. + +## Rejected + +- **SaaS** — wrong audience. Keryx is a framework, not a hosted product. +- **Productivity** — too generic; would dilute the dev-tools signal. +- **API** — too narrow; Developer Tools already covers it. +- **TypeScript** — not actually a topic on PH (it's a tag in some places but not a topic). diff --git a/packages/keryx/.env.example b/packages/keryx/.env.example index c8ab2a3..e46fd20 100644 --- a/packages/keryx/.env.example +++ b/packages/keryx/.env.example @@ -1,4 +1,4 @@ -PROCESS_NAME=actionhero-server +PROCESS_NAME=keryx PROCESS_NAME_TEST=test-server PROCESS_SHUTDOWN_TIMEOUT=30000