{#if app}
{#if activeTab === 'scripts'}
No scripts in this app yet.
Hosts this app answers on. Routes inside this app can only bind to
these. Use No domain claims yet.
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 No explicit members yet.
Run an endpoint script on a schedule. Schedules are 6-field cron
expressions (with seconds):
Subscribe an endpoint script to durable pub/sub messages. Topic
patterns are an exact 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
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.
No triggers in this app yet.
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 No registered topics in this app yet.
Encrypted per-app configuration (API keys, OAuth tokens, webhook signing
keys), available to scripts as No secrets in this app yet.
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: {deleteAppError}
{app.name} will stop answering on
Routes already bound to this host are blocked from deletion by the
API; if so, you’ll see an error here.
{removeDomainError}
{memberToRemove.username} will lose access to this
app. Their other app memberships and account are untouched.
{removeMemberError}
This {triggerToRemove.kind} trigger will stop firing. The target
script is not affected.
{editTopicError}
Unregistering
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 Scripts
{#if canWrite}
{/if}
{#each scripts as script (script.id)}
{/if}
Domain claims
app.example.com for exact, *.example.com for
wildcard, or {'{'}tenant{'}'}.example.com to bind a capture.
{#each domains as d (d.id)}
{/if}
{d.pattern}
— {d.shape}
Members
member first, then grant them app access
below.
Cron triggers
sec min hour day-of-month month day-of-week.
The timezone disambiguates schedules like "every weekday at 9am".
Pub/Sub triggers
user.created), a prefix
wildcard (user.*), or * for every topic.
Email triggers
X-Picloud-Signature HMAC-SHA256 (hex of the request body);
leave it blank to accept unsigned POSTs (URL secrecy only).
Expected inbound JSON shape
{`{
"from": "sender@external.com",
"to": ["alice@myapp.com"],
"cc": [],
"subject": "...",
"text": "...",
"html": "...",
"message_id": "
Queue:receive trigger (v1.1.9)
Create kv:event trigger
Create docs:event trigger
Create files:event trigger
Create dead_letter trigger
{#each triggers as t (t.id)}
{/if}
{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}
Realtime topics
/realtime/topics/<name>. public topics
need no auth; token topics require a subscriber token minted by a
script via pubsub::subscriber_token.
{#each topics as t (t.name)}
{/if}
{t.name}
{#if t.external_subscribable}
external
{t.auth_mode}
{:else}
internal
{/if}
· {shortDate(t.created_at)}
Secrets
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.
{#each secrets as s (s.name)}
{/if}
{s.name}
· updated {shortDate(s.updated_at)}
Settings
Delete app
{#if domains.length > 0}
{#each domains as d (d.id)}
{/if}
{#if deleteAppError}
{d.pattern}{d.shape}
{domainToRemove.pattern}.
public) or anyone with a valid token can subscribe (if
auth_mode is token). Are you sure?
{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.
{secretToRemove.name} is permanent. Any script calling
secrets::get("{secretToRemove.name}") will get ()
until you set it again.