{#if loading && !app}
Loading…
{:else if loadError && !app}{loadError}
Back to apps{app.description}
{/if}No scripts in this app yet.
{:else}
Hosts this app answers on. Routes inside this app can only bind to
these. Use app.example.com for exact, *.example.com for
wildcard, or {'{'}tenant{'}'}.example.com to bind a capture.
No domain claims yet.
{:else}{d.pattern}
— {d.shape}
Users with explicit access to this app. Instance owners and admins
already have implicit access — they are not listed here. Use the Users
page to invite a member first, then grant them app access
below.
No explicit members yet.
{:else}
Run an endpoint script on a schedule. Schedules are 6-field cron
expressions (with seconds): sec min hour day-of-month month day-of-week.
The timezone disambiguates schedules like "every weekday at 9am".
Subscribe an endpoint script to durable pub/sub messages. Topic
patterns are an exact topic (user.created), a prefix
wildcard (user.*), or * for every topic.
Fire an endpoint script when your email provider POSTs an inbound
message to PiCloud. Configure your provider (Mailgun / Postmark /
SendGrid / SES) to POST the generic JSON shape below to the trigger's
webhook URL. Set a shared secret to require an
X-Picloud-Signature HMAC-SHA256 (hex of the request body);
leave it blank to accept unsigned POSTs (URL secrecy only).
{`{
"from": "sender@external.com",
"to": ["alice@myapp.com"],
"cc": [],
"subject": "...",
"text": "...",
"html": "...",
"message_id": ""
}`}
Register a script as the consumer for a per-app durable queue. Exactly one consumer per queue is allowed — the registration will be rejected if another consumer already exists. Use the Queues tab for a read-only view of message depths.
Fires when any other trigger or route dead-letters. All filter fields are optional; leaving them blank routes every dead-letter to this script.
{#if triggers.length === 0}No triggers in this app yet.
{:else}{t.details.schedule}
— {t.details.timezone}
last fired: {t.details.last_fired_at ?? 'never'}
{:else if t.details.kind === 'kv' || t.details.kind === 'docs' || t.details.kind === 'files'}
{t.details.collection_glob}
— {t.details.ops.join(', ') || 'any op'}
{:else if t.details.kind === 'pubsub'}
{t.details.topic_pattern}
{:else if t.details.kind === 'email'}
{t.details.has_inbound_secret ? 'signed (HMAC)' : 'unsigned'}
{emailInboundUrl(t.id)}
{:else if t.details.kind === 'queue'}
{t.details.queue_name}
— vt {t.details.visibility_timeout_secs}s
last fired: {t.details.last_fired_at ?? 'never'}
{/if}
→ {t.script_id}
Pub/sub topics are internal-only by default — scripts
subscribe via triggers, browsers can't. Register a topic here and mark it
externally subscribable to let frontend clients connect over
SSE at /realtime/topics/<name>. public topics
need no auth; token topics require a subscriber token minted by a
script via pubsub::subscriber_token.
No registered topics in this app yet.
{:else}{t.name}
{#if t.external_subscribable}
external
{t.auth_mode}
{:else}
internal
{/if}
· {shortDate(t.created_at)}
Encrypted per-app configuration (API keys, OAuth tokens, webhook signing
keys), available to scripts as secrets::get("name"). Values are
encrypted at rest with the process master key and
never leave the server — this list shows names and
last-modified times only.
No secrets in this app yet.
{:else}{s.name}
· updated {shortDate(s.updated_at)}
Permanently removes the app along with all its scripts, routes, execution logs, and domain claims.
This will permanently delete everything inside {app.name}. There is no undo.
The following hosts will stop pointing at this app:
{d.pattern}{d.shape}
{deleteAppError}
{/if}
{app.name} will stop answering on
{domainToRemove.pattern}.
Routes already bound to this host are blocked from deletion by the API; if so, you’ll see an error here.
{#if removeDomainError}{removeDomainError}
{/if}{memberToRemove.username} will lose access to this app. Their other app memberships and account are untouched.
{#if removeMemberError}{removeMemberError}
{/if}This {triggerToRemove.kind} trigger will stop firing. The target script is not affected.
public) or anyone with a valid token can subscribe (if
auth_mode is token). Are you sure?
{editTopicError}
{/if}
Unregistering {topicToRemove.name} disconnects any live SSE
subscribers immediately. Scripts can still publish_durable to
it (internal triggers keep working) — it just won't be externally
subscribable.
The value you type will be shown in plain text on screen. Make sure no one is looking over your shoulder and that screen-sharing is off.
Deleting {secretToRemove.name} is permanent. Any script calling
secrets::get("{secretToRemove.name}") will get ()
until you set it again.