Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 2 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,9 @@ Full setup, guides, and reference can be found at **[docs.piyaz.ai](https://docs

---

## Hosted (beta)

Piyaz is open for signup at **[app.piyaz.ai/sign-up](https://app.piyaz.ai/sign-up)**. Create an account and verify your email to get in.

Then install the plugin for your agent (Claude Code, Codex, Cursor, or Antigravity) and sign in once. Piyaz is then available in every project you open. Per-harness setup instructions can be found at **[docs](https://docs.piyaz.ai)**.

## Self-host

Self-hosting is free under AGPL-3.0. You can run the Piyaz server yourself and register an MCP server in your editor that points at it. You need [Bun](https://bun.sh) and [Docker](https://docs.docker.com/get-docker/) for PostgreSQL. Full setup and upgrade steps are in the [self-host guide](https://docs.piyaz.ai/docs/self-hosting/run-locally).
Piyaz is free under AGPL-3.0. You run the Piyaz server yourself and register an MCP server in your editor that points at it. You need [Bun](https://bun.sh) and [Docker](https://docs.docker.com/get-docker/) for PostgreSQL. Full setup and upgrade steps are in the [self-host guide](https://docs.piyaz.ai/docs/self-hosting/run-locally), and per-harness setup is in the [docs](https://docs.piyaz.ai).

---

Expand Down Expand Up @@ -95,7 +89,7 @@ For more details, see the docs:

## The MCP server

Piyaz is a remote MCP server at `https://app.piyaz.ai/api/mcp` (Streamable HTTP, OAuth 2.1, no API keys); the plugin wires it up for you, so the endpoint only matters when connecting a client by hand or pointing at your own instance. Nine ref-first tools cover the loop from planning to review: the full reference lives at [docs.piyaz.ai/docs/reference/mcp-overview](https://docs.piyaz.ai/docs/reference/mcp-overview/) and registry metadata in [`server.json`](server.json).
Piyaz is a remote MCP server at `<your-instance>/api/mcp` (Streamable HTTP, OAuth 2.1, no API keys). Nine ref-first tools cover the loop from planning to review: the full reference lives at [docs.piyaz.ai/docs/reference/mcp-overview](https://docs.piyaz.ai/docs/reference/mcp-overview/) and registry metadata in [`server.json`](server.json).

---

Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
"postbuild": "bun run scripts/postbuild.ts",
"start": "node --env-file-if-exists=.env.local scripts/start.mjs",
"build:cf": "DEPLOY_TARGET=cloudflare next build --webpack && DEPLOY_TARGET=cloudflare opennextjs-cloudflare build",
"preview:cf": "SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare next build --webpack && SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare opennextjs-cloudflare build && SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare opennextjs-cloudflare preview --env production",
"deploy:cf": "bun run scripts/assert-deploy-ready.ts && SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare next build --webpack && SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare opennextjs-cloudflare build && SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare opennextjs-cloudflare deploy --env production",
"preview:cf": "DEPLOY_TARGET=cloudflare next build --webpack && DEPLOY_TARGET=cloudflare opennextjs-cloudflare build && DEPLOY_TARGET=cloudflare opennextjs-cloudflare preview --env production",
"deploy:cf": "bun run scripts/assert-deploy-ready.ts && DEPLOY_TARGET=cloudflare next build --webpack && DEPLOY_TARGET=cloudflare opennextjs-cloudflare build && DEPLOY_TARGET=cloudflare opennextjs-cloudflare deploy --env production",
"deploy:cf:dev": "bun run scripts/turnstile-symmetry.ts --env dev && SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare next build --webpack && SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare opennextjs-cloudflare build && SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare opennextjs-cloudflare deploy --env dev",
"cf-typegen": "wrangler types --env production --env-interface CloudflareEnv cloudflare-env.d.ts",
"pretest": "[ -n \"$TEST_DATABASE_URL\" ] || bun run db:test:up",
Expand Down
30 changes: 20 additions & 10 deletions tests/config/env.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,19 +79,29 @@ test("signup disabled on a misconfigured hosted build (opt-in not 'true')", () =
});

/**
* Hosted scripts that must ship open signup. `signupsDisabled()` fails closed,
* so one of these losing `SIGNUPS_ENABLED=true` serves the invite-only waitlist
* instead of the sign-up form, with no build or deploy error to catch it.
* Hosted scripts and whether each ships open signup. `signupsDisabled()` fails
* closed, so a script losing `SIGNUPS_ENABLED=true` serves the invite-only
* waitlist instead of the sign-up form, with no build or deploy error to catch
* it. Production is closed to new signups.
*/
const OPEN_SIGNUP_SCRIPTS = ["deploy:cf", "deploy:cf:dev", "preview:cf"];

for (const name of OPEN_SIGNUP_SCRIPTS) {
test(`${name} carries the signup opt-in into next build`, () => {
const SIGNUP_SCRIPTS = {
"deploy:cf": false,
"preview:cf": false,
"deploy:cf:dev": true,
};

for (const [name, open] of Object.entries(SIGNUP_SCRIPTS)) {
test(`${name} ${open ? "carries" : "omits"} the signup opt-in`, () => {
// The flag is inlined as NEXT_PUBLIC_*, so only the build step decides the
// baked value; setting it on the deploy step alone would be a no-op.
expect(pkg.scripts[name as keyof typeof pkg.scripts]).toContain(
"SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare next build",
);
const script = pkg.scripts[name as keyof typeof pkg.scripts];
if (open) {
expect(script).toContain(
"SIGNUPS_ENABLED=true DEPLOY_TARGET=cloudflare next build",
);
} else {
expect(script).not.toContain("SIGNUPS_ENABLED");
}
});
}

Expand Down
Loading