nerdsystem 0.0.12 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/admin.js +2 -0
- package/dist/commands/init.js +1 -1
- package/dist/commands/org.d.ts +1 -1
- package/dist/commands/org.js +14 -4
- package/package.json +5 -1
- package/template/.claude/skills/nerdsystem/SKILL.md +3 -3
- package/template/.cursor/rules/nerdsystem.mdc +4 -4
- package/template/.github/copilot-instructions.md +4 -4
- package/template/AGENTS.md +4 -4
- package/template/GEMINI.md +4 -4
package/dist/commands/admin.js
CHANGED
|
@@ -25,6 +25,8 @@ export async function adminSuspend(opts) {
|
|
|
25
25
|
if (opts.json)
|
|
26
26
|
return printJson(r);
|
|
27
27
|
log.ok(`Suspended ${r.org} at ${r.suspendedAt}: ${r.projectsTrashed} project(s) trashed, ${r.usersSuspended} user(s) suspended, ${r.tokensRevoked} token(s) revoked.`);
|
|
28
|
+
if (r.stillBilling)
|
|
29
|
+
log.warn(`Stripe subscription ${r.stillBilling} is still billing, and the owner can no longer reach the portal. Cancel or refund it in the Stripe dashboard.`);
|
|
28
30
|
}
|
|
29
31
|
export async function adminUnsuspend(opts) {
|
|
30
32
|
if (!opts.org)
|
package/dist/commands/init.js
CHANGED
|
@@ -183,4 +183,4 @@ export async function init(dir, args) {
|
|
|
183
183
|
log.ok(`Ready. Next:\n cd ${dir}\n pnpm install\n nerd dev\n\nThen open the folder in your coding agent and ask it to build the first feature; the nerdsystem skill walks it through.\nDeploys go to ${project.url}`);
|
|
184
184
|
}
|
|
185
185
|
// Kept in sync with packages/sdk/package.json by the release script.
|
|
186
|
-
const SDK_VERSION = "0.0.
|
|
186
|
+
const SDK_VERSION = "0.0.13";
|
package/dist/commands/org.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export declare function domainsList(opts: {
|
|
|
17
17
|
export declare function domainsAdd(hostname: string | undefined, opts: {
|
|
18
18
|
json: boolean;
|
|
19
19
|
}): Promise<void>;
|
|
20
|
-
export declare function domainsRemove(
|
|
20
|
+
export declare function domainsRemove(idOrHostname: string | undefined, opts: {
|
|
21
21
|
json: boolean;
|
|
22
22
|
}): Promise<void>;
|
|
23
23
|
export declare function logs(opts: {
|
package/dist/commands/org.js
CHANGED
|
@@ -54,11 +54,21 @@ export async function domainsAdd(hostname, opts) {
|
|
|
54
54
|
return printJson(r);
|
|
55
55
|
log.ok(`Added ${r.domain.hostname}. Create this DNS record, then check with \`nerd domains\`:\n\n ${r.domain.hostname} CNAME ${r.cnameTarget}`);
|
|
56
56
|
}
|
|
57
|
-
export async function domainsRemove(
|
|
58
|
-
if (!
|
|
59
|
-
throw new CliError("Usage: nerd domains remove <
|
|
57
|
+
export async function domainsRemove(idOrHostname, opts) {
|
|
58
|
+
if (!idOrHostname)
|
|
59
|
+
throw new CliError("Usage: nerd domains remove <hostname or domain id>");
|
|
60
60
|
const nerd = readNerdJson(findProjectRoot());
|
|
61
|
-
const
|
|
61
|
+
const api = ApiClient.fromConfig();
|
|
62
|
+
// People (and agents) pass the hostname they added; the API deletes by id, so look it up.
|
|
63
|
+
let id = idOrHostname;
|
|
64
|
+
if (!idOrHostname.startsWith("dom_")) {
|
|
65
|
+
const { domains } = await api.get(projectPath(nerd, "/domains"));
|
|
66
|
+
const match = domains.find((d) => d.hostname === idOrHostname.toLowerCase());
|
|
67
|
+
if (!match)
|
|
68
|
+
throw new CliError(`No custom domain ${idOrHostname} on this project. \`nerd domains\` lists them.`);
|
|
69
|
+
id = match.id;
|
|
70
|
+
}
|
|
71
|
+
const r = await api.delete(projectPath(nerd, `/domains/${id}`));
|
|
62
72
|
if (opts.json)
|
|
63
73
|
return printJson(r);
|
|
64
74
|
log.ok("Removed.");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nerdsystem",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"description": "nerd: start, check, and deploy a web app on nerdsystem from the terminal or a coding agent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -40,6 +40,10 @@
|
|
|
40
40
|
"directory": "packages/cli"
|
|
41
41
|
},
|
|
42
42
|
"homepage": "https://nerdsystem.com",
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://nerdsystem.com/about",
|
|
45
|
+
"email": "support@nerdsystem.com"
|
|
46
|
+
},
|
|
43
47
|
"keywords": [
|
|
44
48
|
"cloudflare",
|
|
45
49
|
"deploy",
|
|
@@ -101,7 +101,7 @@ Then in `src/server/index.ts`: `app.route("/api/notes", notes);`
|
|
|
101
101
|
- Schema changes are migrations. Edit `schema.ts`, run `pnpm db:generate`, commit the new file in `migrations/`. Never hand-write SQL into production; `nerd deploy` applies migrations in name order and records which ran.
|
|
102
102
|
- Migrations are forward-only. To undo, write another migration.
|
|
103
103
|
- Prefer small, additive migrations. SQLite cannot alter columns in place.
|
|
104
|
-
- `nerd db export` downloads a SQL dump of the production database (`<slug>-<date>.sql`, or `--out file.sql`); use it before a risky migration or when the person wants their data.
|
|
104
|
+
- `nerd db export` downloads a SQL dump of the production database (`<slug>-<date>.sql`, or `--out file.sql`); use it before a risky migration or when the person wants their data. The live app's database requests wait while it runs, so run it at a quiet moment.
|
|
105
105
|
|
|
106
106
|
## Errors
|
|
107
107
|
|
|
@@ -134,8 +134,8 @@ Without MCP, `nerd check --json` returns the same shape, and `nerd check --rule
|
|
|
134
134
|
## Scheduled jobs and email
|
|
135
135
|
|
|
136
136
|
- **Scheduled jobs**: put the work in the `POST /api/cron` handler (already in `src/server/index.ts`, guarded by `verifyCron()`), then turn the schedule on with `nerd cron hourly` or `nerd cron daily`. The platform calls it; the app never needs its own timer.
|
|
137
|
-
- **Secrets** (Stripe keys, API tokens): never in code or in the client. Locally they live in `.dev.vars` (gitignored). For production, ask the person to run `nerd secret set NAME` and paste the value; it reaches the app as `c.env.NAME` on the next deploy. Pull request previews do not get it unless it was set with `--previews` (use that only for keys that are safe in a preview, such as a test-mode key). `nerd secret list` shows names only. Do not put a real secret value in any command you run yourself.
|
|
138
|
-
- **Email**: `sendEmail(c.env, { to, subject, text, html? })` from `@nerdsystem/sdk` sends through the platform. The relay only sends to addresses that have an account on this app (someone who signed up); any other recipient is refused with a 400, and the sender name is always the app's name. It is limited per day by plan (50 on Free, 1,000 on Pro at $39 a month, 2,000 on Studio at $99 a month), so use it for transactional mail such as receipts and notifications, not bulk. Plans can be paid monthly or yearly at ten times the monthly price.
|
|
137
|
+
- **Secrets** (Stripe keys, API tokens): never in code or in the client. Locally they live in `.dev.vars` (gitignored). For production, ask the person to add it under the app's Settings tab in the dashboard, or to run `nerd secret set NAME` and paste the value; it reaches the app as `c.env.NAME` on the next deploy. Pull request previews do not get it unless it was set with `--previews` (use that only for keys that are safe in a preview, such as a test-mode key). `nerd secret list` shows names only. Do not put a real secret value in any command you run yourself.
|
|
138
|
+
- **Email**: `sendEmail(c.env, { to, subject, text, html? })` from `@nerdsystem/sdk` sends through the platform. The relay only sends to addresses that have an account on this app (someone who signed up); any other recipient is refused with a 400, and the sender name is always the app's name. On the Free plan the recipient must also have confirmed their address by finishing a password reset (403 otherwise); paid plans can write to every signed-up user. It is limited per day by plan (50 on Free, 1,000 on Pro at $39 a month, 2,000 on Studio at $99 a month), so use it for transactional mail such as receipts and notifications, not bulk. Plans can be paid monthly or yearly at ten times the monthly price.
|
|
139
139
|
|
|
140
140
|
## Debugging production
|
|
141
141
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: How to build, run, and deploy this app on nerdsystem. Applies to server, database, auth, and deploy work.
|
|
3
3
|
alwaysApply: true
|
|
4
4
|
---
|
|
5
|
-
<!-- generated from .claude/skills/nerdsystem/SKILL.md (
|
|
5
|
+
<!-- generated from .claude/skills/nerdsystem/SKILL.md (497090779572); edit the skill, then run: nerd agents sync -->
|
|
6
6
|
|
|
7
7
|
# Building on nerdsystem
|
|
8
8
|
|
|
@@ -102,7 +102,7 @@ Then in `src/server/index.ts`: `app.route("/api/notes", notes);`
|
|
|
102
102
|
- Schema changes are migrations. Edit `schema.ts`, run `pnpm db:generate`, commit the new file in `migrations/`. Never hand-write SQL into production; `nerd deploy` applies migrations in name order and records which ran.
|
|
103
103
|
- Migrations are forward-only. To undo, write another migration.
|
|
104
104
|
- Prefer small, additive migrations. SQLite cannot alter columns in place.
|
|
105
|
-
- `nerd db export` downloads a SQL dump of the production database (`<slug>-<date>.sql`, or `--out file.sql`); use it before a risky migration or when the person wants their data.
|
|
105
|
+
- `nerd db export` downloads a SQL dump of the production database (`<slug>-<date>.sql`, or `--out file.sql`); use it before a risky migration or when the person wants their data. The live app's database requests wait while it runs, so run it at a quiet moment.
|
|
106
106
|
|
|
107
107
|
## Errors
|
|
108
108
|
|
|
@@ -135,8 +135,8 @@ Without MCP, `nerd check --json` returns the same shape, and `nerd check --rule
|
|
|
135
135
|
## Scheduled jobs and email
|
|
136
136
|
|
|
137
137
|
- **Scheduled jobs**: put the work in the `POST /api/cron` handler (already in `src/server/index.ts`, guarded by `verifyCron()`), then turn the schedule on with `nerd cron hourly` or `nerd cron daily`. The platform calls it; the app never needs its own timer.
|
|
138
|
-
- **Secrets** (Stripe keys, API tokens): never in code or in the client. Locally they live in `.dev.vars` (gitignored). For production, ask the person to run `nerd secret set NAME` and paste the value; it reaches the app as `c.env.NAME` on the next deploy. Pull request previews do not get it unless it was set with `--previews` (use that only for keys that are safe in a preview, such as a test-mode key). `nerd secret list` shows names only. Do not put a real secret value in any command you run yourself.
|
|
139
|
-
- **Email**: `sendEmail(c.env, { to, subject, text, html? })` from `@nerdsystem/sdk` sends through the platform. The relay only sends to addresses that have an account on this app (someone who signed up); any other recipient is refused with a 400, and the sender name is always the app's name. It is limited per day by plan (50 on Free, 1,000 on Pro at $39 a month, 2,000 on Studio at $99 a month), so use it for transactional mail such as receipts and notifications, not bulk. Plans can be paid monthly or yearly at ten times the monthly price.
|
|
138
|
+
- **Secrets** (Stripe keys, API tokens): never in code or in the client. Locally they live in `.dev.vars` (gitignored). For production, ask the person to add it under the app's Settings tab in the dashboard, or to run `nerd secret set NAME` and paste the value; it reaches the app as `c.env.NAME` on the next deploy. Pull request previews do not get it unless it was set with `--previews` (use that only for keys that are safe in a preview, such as a test-mode key). `nerd secret list` shows names only. Do not put a real secret value in any command you run yourself.
|
|
139
|
+
- **Email**: `sendEmail(c.env, { to, subject, text, html? })` from `@nerdsystem/sdk` sends through the platform. The relay only sends to addresses that have an account on this app (someone who signed up); any other recipient is refused with a 400, and the sender name is always the app's name. On the Free plan the recipient must also have confirmed their address by finishing a password reset (403 otherwise); paid plans can write to every signed-up user. It is limited per day by plan (50 on Free, 1,000 on Pro at $39 a month, 2,000 on Studio at $99 a month), so use it for transactional mail such as receipts and notifications, not bulk. Plans can be paid monthly or yearly at ten times the monthly price.
|
|
140
140
|
|
|
141
141
|
## Debugging production
|
|
142
142
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- generated from .claude/skills/nerdsystem/SKILL.md (
|
|
1
|
+
<!-- generated from .claude/skills/nerdsystem/SKILL.md (497090779572); edit the skill, then run: nerd agents sync -->
|
|
2
2
|
|
|
3
3
|
# Building on nerdsystem
|
|
4
4
|
|
|
@@ -98,7 +98,7 @@ Then in `src/server/index.ts`: `app.route("/api/notes", notes);`
|
|
|
98
98
|
- Schema changes are migrations. Edit `schema.ts`, run `pnpm db:generate`, commit the new file in `migrations/`. Never hand-write SQL into production; `nerd deploy` applies migrations in name order and records which ran.
|
|
99
99
|
- Migrations are forward-only. To undo, write another migration.
|
|
100
100
|
- Prefer small, additive migrations. SQLite cannot alter columns in place.
|
|
101
|
-
- `nerd db export` downloads a SQL dump of the production database (`<slug>-<date>.sql`, or `--out file.sql`); use it before a risky migration or when the person wants their data.
|
|
101
|
+
- `nerd db export` downloads a SQL dump of the production database (`<slug>-<date>.sql`, or `--out file.sql`); use it before a risky migration or when the person wants their data. The live app's database requests wait while it runs, so run it at a quiet moment.
|
|
102
102
|
|
|
103
103
|
## Errors
|
|
104
104
|
|
|
@@ -131,8 +131,8 @@ Without MCP, `nerd check --json` returns the same shape, and `nerd check --rule
|
|
|
131
131
|
## Scheduled jobs and email
|
|
132
132
|
|
|
133
133
|
- **Scheduled jobs**: put the work in the `POST /api/cron` handler (already in `src/server/index.ts`, guarded by `verifyCron()`), then turn the schedule on with `nerd cron hourly` or `nerd cron daily`. The platform calls it; the app never needs its own timer.
|
|
134
|
-
- **Secrets** (Stripe keys, API tokens): never in code or in the client. Locally they live in `.dev.vars` (gitignored). For production, ask the person to run `nerd secret set NAME` and paste the value; it reaches the app as `c.env.NAME` on the next deploy. Pull request previews do not get it unless it was set with `--previews` (use that only for keys that are safe in a preview, such as a test-mode key). `nerd secret list` shows names only. Do not put a real secret value in any command you run yourself.
|
|
135
|
-
- **Email**: `sendEmail(c.env, { to, subject, text, html? })` from `@nerdsystem/sdk` sends through the platform. The relay only sends to addresses that have an account on this app (someone who signed up); any other recipient is refused with a 400, and the sender name is always the app's name. It is limited per day by plan (50 on Free, 1,000 on Pro at $39 a month, 2,000 on Studio at $99 a month), so use it for transactional mail such as receipts and notifications, not bulk. Plans can be paid monthly or yearly at ten times the monthly price.
|
|
134
|
+
- **Secrets** (Stripe keys, API tokens): never in code or in the client. Locally they live in `.dev.vars` (gitignored). For production, ask the person to add it under the app's Settings tab in the dashboard, or to run `nerd secret set NAME` and paste the value; it reaches the app as `c.env.NAME` on the next deploy. Pull request previews do not get it unless it was set with `--previews` (use that only for keys that are safe in a preview, such as a test-mode key). `nerd secret list` shows names only. Do not put a real secret value in any command you run yourself.
|
|
135
|
+
- **Email**: `sendEmail(c.env, { to, subject, text, html? })` from `@nerdsystem/sdk` sends through the platform. The relay only sends to addresses that have an account on this app (someone who signed up); any other recipient is refused with a 400, and the sender name is always the app's name. On the Free plan the recipient must also have confirmed their address by finishing a password reset (403 otherwise); paid plans can write to every signed-up user. It is limited per day by plan (50 on Free, 1,000 on Pro at $39 a month, 2,000 on Studio at $99 a month), so use it for transactional mail such as receipts and notifications, not bulk. Plans can be paid monthly or yearly at ten times the monthly price.
|
|
136
136
|
|
|
137
137
|
## Debugging production
|
|
138
138
|
|
package/template/AGENTS.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- generated from .claude/skills/nerdsystem/SKILL.md (
|
|
1
|
+
<!-- generated from .claude/skills/nerdsystem/SKILL.md (497090779572); edit the skill, then run: nerd agents sync -->
|
|
2
2
|
|
|
3
3
|
# Building on nerdsystem
|
|
4
4
|
|
|
@@ -98,7 +98,7 @@ Then in `src/server/index.ts`: `app.route("/api/notes", notes);`
|
|
|
98
98
|
- Schema changes are migrations. Edit `schema.ts`, run `pnpm db:generate`, commit the new file in `migrations/`. Never hand-write SQL into production; `nerd deploy` applies migrations in name order and records which ran.
|
|
99
99
|
- Migrations are forward-only. To undo, write another migration.
|
|
100
100
|
- Prefer small, additive migrations. SQLite cannot alter columns in place.
|
|
101
|
-
- `nerd db export` downloads a SQL dump of the production database (`<slug>-<date>.sql`, or `--out file.sql`); use it before a risky migration or when the person wants their data.
|
|
101
|
+
- `nerd db export` downloads a SQL dump of the production database (`<slug>-<date>.sql`, or `--out file.sql`); use it before a risky migration or when the person wants their data. The live app's database requests wait while it runs, so run it at a quiet moment.
|
|
102
102
|
|
|
103
103
|
## Errors
|
|
104
104
|
|
|
@@ -131,8 +131,8 @@ Without MCP, `nerd check --json` returns the same shape, and `nerd check --rule
|
|
|
131
131
|
## Scheduled jobs and email
|
|
132
132
|
|
|
133
133
|
- **Scheduled jobs**: put the work in the `POST /api/cron` handler (already in `src/server/index.ts`, guarded by `verifyCron()`), then turn the schedule on with `nerd cron hourly` or `nerd cron daily`. The platform calls it; the app never needs its own timer.
|
|
134
|
-
- **Secrets** (Stripe keys, API tokens): never in code or in the client. Locally they live in `.dev.vars` (gitignored). For production, ask the person to run `nerd secret set NAME` and paste the value; it reaches the app as `c.env.NAME` on the next deploy. Pull request previews do not get it unless it was set with `--previews` (use that only for keys that are safe in a preview, such as a test-mode key). `nerd secret list` shows names only. Do not put a real secret value in any command you run yourself.
|
|
135
|
-
- **Email**: `sendEmail(c.env, { to, subject, text, html? })` from `@nerdsystem/sdk` sends through the platform. The relay only sends to addresses that have an account on this app (someone who signed up); any other recipient is refused with a 400, and the sender name is always the app's name. It is limited per day by plan (50 on Free, 1,000 on Pro at $39 a month, 2,000 on Studio at $99 a month), so use it for transactional mail such as receipts and notifications, not bulk. Plans can be paid monthly or yearly at ten times the monthly price.
|
|
134
|
+
- **Secrets** (Stripe keys, API tokens): never in code or in the client. Locally they live in `.dev.vars` (gitignored). For production, ask the person to add it under the app's Settings tab in the dashboard, or to run `nerd secret set NAME` and paste the value; it reaches the app as `c.env.NAME` on the next deploy. Pull request previews do not get it unless it was set with `--previews` (use that only for keys that are safe in a preview, such as a test-mode key). `nerd secret list` shows names only. Do not put a real secret value in any command you run yourself.
|
|
135
|
+
- **Email**: `sendEmail(c.env, { to, subject, text, html? })` from `@nerdsystem/sdk` sends through the platform. The relay only sends to addresses that have an account on this app (someone who signed up); any other recipient is refused with a 400, and the sender name is always the app's name. On the Free plan the recipient must also have confirmed their address by finishing a password reset (403 otherwise); paid plans can write to every signed-up user. It is limited per day by plan (50 on Free, 1,000 on Pro at $39 a month, 2,000 on Studio at $99 a month), so use it for transactional mail such as receipts and notifications, not bulk. Plans can be paid monthly or yearly at ten times the monthly price.
|
|
136
136
|
|
|
137
137
|
## Debugging production
|
|
138
138
|
|
package/template/GEMINI.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- generated from .claude/skills/nerdsystem/SKILL.md (
|
|
1
|
+
<!-- generated from .claude/skills/nerdsystem/SKILL.md (497090779572); edit the skill, then run: nerd agents sync -->
|
|
2
2
|
|
|
3
3
|
# Building on nerdsystem
|
|
4
4
|
|
|
@@ -98,7 +98,7 @@ Then in `src/server/index.ts`: `app.route("/api/notes", notes);`
|
|
|
98
98
|
- Schema changes are migrations. Edit `schema.ts`, run `pnpm db:generate`, commit the new file in `migrations/`. Never hand-write SQL into production; `nerd deploy` applies migrations in name order and records which ran.
|
|
99
99
|
- Migrations are forward-only. To undo, write another migration.
|
|
100
100
|
- Prefer small, additive migrations. SQLite cannot alter columns in place.
|
|
101
|
-
- `nerd db export` downloads a SQL dump of the production database (`<slug>-<date>.sql`, or `--out file.sql`); use it before a risky migration or when the person wants their data.
|
|
101
|
+
- `nerd db export` downloads a SQL dump of the production database (`<slug>-<date>.sql`, or `--out file.sql`); use it before a risky migration or when the person wants their data. The live app's database requests wait while it runs, so run it at a quiet moment.
|
|
102
102
|
|
|
103
103
|
## Errors
|
|
104
104
|
|
|
@@ -131,8 +131,8 @@ Without MCP, `nerd check --json` returns the same shape, and `nerd check --rule
|
|
|
131
131
|
## Scheduled jobs and email
|
|
132
132
|
|
|
133
133
|
- **Scheduled jobs**: put the work in the `POST /api/cron` handler (already in `src/server/index.ts`, guarded by `verifyCron()`), then turn the schedule on with `nerd cron hourly` or `nerd cron daily`. The platform calls it; the app never needs its own timer.
|
|
134
|
-
- **Secrets** (Stripe keys, API tokens): never in code or in the client. Locally they live in `.dev.vars` (gitignored). For production, ask the person to run `nerd secret set NAME` and paste the value; it reaches the app as `c.env.NAME` on the next deploy. Pull request previews do not get it unless it was set with `--previews` (use that only for keys that are safe in a preview, such as a test-mode key). `nerd secret list` shows names only. Do not put a real secret value in any command you run yourself.
|
|
135
|
-
- **Email**: `sendEmail(c.env, { to, subject, text, html? })` from `@nerdsystem/sdk` sends through the platform. The relay only sends to addresses that have an account on this app (someone who signed up); any other recipient is refused with a 400, and the sender name is always the app's name. It is limited per day by plan (50 on Free, 1,000 on Pro at $39 a month, 2,000 on Studio at $99 a month), so use it for transactional mail such as receipts and notifications, not bulk. Plans can be paid monthly or yearly at ten times the monthly price.
|
|
134
|
+
- **Secrets** (Stripe keys, API tokens): never in code or in the client. Locally they live in `.dev.vars` (gitignored). For production, ask the person to add it under the app's Settings tab in the dashboard, or to run `nerd secret set NAME` and paste the value; it reaches the app as `c.env.NAME` on the next deploy. Pull request previews do not get it unless it was set with `--previews` (use that only for keys that are safe in a preview, such as a test-mode key). `nerd secret list` shows names only. Do not put a real secret value in any command you run yourself.
|
|
135
|
+
- **Email**: `sendEmail(c.env, { to, subject, text, html? })` from `@nerdsystem/sdk` sends through the platform. The relay only sends to addresses that have an account on this app (someone who signed up); any other recipient is refused with a 400, and the sender name is always the app's name. On the Free plan the recipient must also have confirmed their address by finishing a password reset (403 otherwise); paid plans can write to every signed-up user. It is limited per day by plan (50 on Free, 1,000 on Pro at $39 a month, 2,000 on Studio at $99 a month), so use it for transactional mail such as receipts and notifications, not bulk. Plans can be paid monthly or yearly at ten times the monthly price.
|
|
136
136
|
|
|
137
137
|
## Debugging production
|
|
138
138
|
|