Coming soon. Depotex is in active development, so features and these docs may still change.

Events Reference

The events Depotex raises, for policies, automation and plugins

Depotex raises an event for each important operation. Policies, automation and plugins react to these events: a policy can stop an operation before it happens, and automation or a plugin can act after it has happened.

1. Before and after

PhaseWhenWhat subscribers can do
BeforeBefore the operation runsStop it with a message (on events marked *blocking*), or adjust the few fields the event allows. They have a few seconds at most.
AfterOnce the operation has succeededReact to it: send an alert, notify another system. They can't undo or slow down the operation.

Passwords, keys and similar secrets are never included in an event.

2. Delivery

  • After-events are saved in the database together with the change that caused them, so they are never lost when a server restarts, and each is delivered once across all servers of a cluster.
  • They usually arrive within a few seconds.
  • A subscriber that fails is retried with increasing delays (up to 8 times by default, over several hours); after that the delivery is marked as failed and kept for 30 days.
  • The same event can occasionally be delivered twice (for example after a server restart mid-delivery). Plugins and integrations must handle repeats.

Events marked policies accept organization policies.

3. Available events

EventPhasesBlockingWhen it happens
auth.loginbefore, afteryes · policiesA user signs in. Checked after the password is verified and before the session starts
auth.login.failedafternoA sign-in is refused (wrong credentials, inactive or locked account)
auth.logoutafternoA user signs out
auth.session.revokeafternoSessions are ended by a user, an admin or the system
user.createbefore, afteryes · policiesAn administrator creates a user
user.updatebefore, afteryes · policiesA user's email or name changes
user.disablebefore, afteryes · policiesA user is disabled and signed out everywhere
user.enablebefore, afteryes · policiesA disabled user is enabled again
user.role.changebefore, afteryes · policiesA user's role changes
user.password.resetbefore, afteryes · policiesAn administrator sets a user's password
user.password.changeafternoA user changes their own password
user.password.recoverafternoA user sets a new password from a password reset email
user.invitation.acceptafternoAn invited user chooses a password and their account becomes active
mail.settings.updatebefore, afteryesThe email settings change (SMTP server or Amazon SES API, sender, Depotex address)
storage.settings.updatebefore, afteryesThe storage settings change (location, credentials or upload limits)
backup.createbefore, afteryesA backup starts (manual or scheduled); after carries its SHA-256, path and size. See Backups
backup.verifyafternoA backup's integrity check finished: ok, the level reached and the signature result
backup.failafternoA backup couldn't be written (stage: write) or failed its check (stage: verify), with the reason
backup.updatebefore, afteryesA backup's Keep permanently or note changes
backup.deletebefore, afteryesA backup is deleted by a person or by the cleanup job (by); a refused cleanup deletion is skipped
backup.downloadbefore, afteryesA backup is downloaded (it holds the whole database)
backup.restorebefore, afteryesA backup is restored over the installation; after (raised in the database that is live afterwards) carries state (done, failed), step, reason, rolled_back and the safety backup
backup.uploadbefore, afteryesA backup is brought in: source (upload, import, cli), file name and size; after carries the backup it became
backup.settings.updatebefore, afteryesBackup encryption or row counting changes: encrypt, mode, recipients (public keys), passphrase_changed, row_counts; never the passphrase
backup.target.updatebefore, afteryesThe backup target changes: separate, backend, location, whether it was adopted; never credentials
backup.test_restorebefore, afteryesA test restore starts (trigger: person or schedule) and finishes: status, reason, tables, rows and mismatches
repository_settings.updatebefore, afteryesThe repository settings change (largest artifact, timeouts, retries, outbound proxy)
repository_settings.proxy_checksums.updatebefore, afteryesSettings → Security → Proxy checksums is turned on or off (previous_strict shows the old value, formats the formats whose new proxies start at it)
trusted_certificate.createbefore, afteryesA CA certificate is added to the trust store for remote registries
trusted_certificate.deletebefore, afteryesA CA certificate is removed from the trust store
vibe.settings.updatebefore, afteryesA vibe artifacts setting changes (Enterprise): turned on or off (turning off keeps what was published), whether secrets and hidden characters refuse a push, or the package list address
user.anonymizebefore, afteryes · policiesA disabled user is anonymized (GDPR erasure); subscribers should erase what they hold about the user ID
user.unlockafternoAn administrator unlocks an account locked after failed sign-ins
group.createbefore, afteryes · policiesAn administrator creates a group
group.updatebefore, afteryes · policiesA group is renamed or its description changes
group.deletebefore, afteryes · policiesAn administrator deletes a group (sync never deletes groups)
group.member.addbefore, afteryes · policiesAn administrator adds users to a group
group.member.removebefore, afteryes · policiesAn administrator removes a member added by hand
space.createbefore, afteryes · policiesA super admin creates a space (policies can, for example, forbid internal spaces or limit formats); the payload carries the storage quota asked for, absent when the installation default applies
space.updatebefore, afteryes · policiesA space's name, description, visibility or formats change (previous_visibility shows the old visibility)
space.deletebefore, afteryes · policiesA space is deleted, with everyone's roles in it
upstream.create, upstream.update, upstream.deletebefore, afteryesA super admin adds, changes or removes an upstream registry (never with its credentials)
space.upstreams.updatebefore, afteryesThe upstreams a space may proxy change (new and previous lists)
artifact.uploadbefore, afteryes · policiesA file is about to be stored in a repository (space, repository, format, path, size, version, overwrite, and the group it came through); space upload rules and policies can refuse it
vibe.checkin.pushbefore, afteryes · policiesA check-in is pushed to a vibe artifacts project (Enterprise): before, with the project, milestone, file count, size, screenshots and what the push check found (a policy can refuse it, for example on high findings); after, with the check-in's number, what it builds on, how many files changed and its link in the Vibe browser
vibe.milestone.updatebefore, afteryes · policiesA vibe artifacts check-in's milestone is named, renamed or cleared after its push, from the Vibe browser (Enterprise): space, repository, project, check-in, the new name and the previous one
vibe.project.deletebefore, afteryes · policiesA vibe artifacts project is deleted with all its check-ins (space, repository, project, number of check-ins)
depot.repository.updatebefore, afteryes · policiesA repository's settings change (online, write, version and layout policies, size limit, upstream, proxy settings), or a group's members and policies
depot.space.default_groupbefore, afteryes · policiesA group becomes a space's default for its format (its universal URL), or the default is removed (space, format, group, previous group)
repository.repairbefore, afteryes · policiesA repository's metadata is rebuilt from its stored files: asked for (before: space, repository, format, mode check or repair) and run (after: state and report of files checked, problems found and fixed)
tag.create, tag.update, tag.deletebefore, afteryes · policiesA space's tag is added, changed (description, attributes) or removed (space, name, description, attributes)
artifact.promotebefore, afteryes · policiesVersions are promoted (copied or moved) to another repository: source and target, move or copy, the tag used, each version with its tags (before), and how many were promoted or refused (after)
artifact.tagbefore, afteryes · policiesA tag is put on versions or taken off them (space, tag, add or remove, the versions; upload when it came with X-Depotex-Tag). Refusing it on upload refuses the upload
content_selector.create, .update, .deletebefore, afteryes · policiesA space's content selector (named path patterns) is created, changed or deleted
content_selector.grant, .revokebefore, afteryes · policiesA user or group gets, or loses, a repository role on the paths a content selector matches
artifact.integrity.brokenafternoThe integrity check found stored content missing or changed (counts); the files using it are hidden
artifact.integrity.repairbefore, afteryesThe integrity repair deletes broken files and orphaned content (counts, bytes freed)
upstream.blockedafternoA host of an upstream (its own, or one its files come from) failed repeatedly and is paused (key, host, failures, until); proxy repositories serve their cache from it meanwhile, and the upstream's other hosts keep working
proxy.cache.invalidatebefore, afteryes · policiesA repository admin makes a proxy repository ask its upstream again: forgets remembered “not found” answers (scope not_found) or also re-checks cached files (scope all), for one path, a folder or all (space, repository, path, how many answers were forgotten and files will be re-checked); policies can refuse it
proxy.artifact_withdrawnafternoA file cached from a linked Depotex is removed because that Depotex quarantined or blocked it (space, repository, upstream, path, status); alert or notify on it
artifact.quarantinebefore, afteryes · policiesA version is quarantined (space, repository, format, name, version, reason, rule, until): by hand (before and after), by a quarantine rule on upload or proxy fetch (after), or automatically when Depotex refuses unsafe content the version carries (after, source guard; see Browse); a vulnerable-version rule adds advisories, fixed_version and pending_check; notify on it with automation
artifact.releasebefore, afteryes · policiesA quarantined version is released (note, who): by hand (before, refused if a subscriber fails, and after) or when an age rule ends (after, release_source expired) or a version held until it was checked for vulnerabilities turns out clean (after, release_source checked)
quarantine.vulnerability.foundafternoNew advisories name a stored version a vulnerable-version rule would hold (space, repository, name, version, rule, advisories, fixed_version) and say what happened: action alert, quarantined, or pending with due_at; notify or open a ticket with automation
quarantine.rule.create, .update, .deletebefore, afteryes · policiesA quarantine rule of the installation or a space is added, changed or removed
blocklist.rule.create, .update, .deletebefore, afteryes · policiesA block-list rule of the installation or a space is added, changed or removed; a failing subscriber refuses the change
sbom.application.create, .deletebefore, afteryes · policiesAn application (software whose SBOMs are uploaded) is registered in a space or deleted with its versions (space, key, name, description)
sbom.document.upload, .deletebefore, afteryes · policiesAn SBOM is uploaded for an application version, after it was read (space, application, version, file name, size, format, spec version, tool, component count, truncated), or deleted; policies can refuse a format or a document with too few components
sbom.vulnerability_data.updatebefore, afteryesThe vulnerability data settings change (enabled, source, endpoint or data files address, recheck hours)
sbom.rescan.requestbefore, afteryesSomeone asks for components to be checked again now (re-check) or for versions to be read again (re-inspect: SBOMs rebuilt, images optionally scanned again), for one version, a repository or the installation (scope, mode, images, space, repository, version). Policies can refuse it
sbom.vulnerability_data.importafternoVulnerability data is imported: downloaded from the data files address (one ecosystem, whole or only the changes), from an uploaded file, or a distribution's advisories read from its repositories (source feed); how many advisories were stored and skipped. Automation can report when the data was last refreshed
sbom.vex.update, .deletebefore, afteryes · policiesA VEX statement about a vulnerability in one SBOM is made, changed or removed (space, document, owner, advisory, state, justification, response, detail); policies can require a justification for not_affected
sbom.document.evaluatebefore, afteryes · policiesAn SBOM is evaluated after an artifact version's SBOM was read, when an application SBOM is uploaded, and when new advisories match it (space, owner, repository, name, version, licenses, component counts, known vulnerabilities with VEX applied, max_severity, trigger, origin, coverage, coverage_score, version_coverage, documents, findings, not_covered: how many components no vulnerability data covers); also raised for a version without any SBOM (documents 0); a denial quarantines the version (source policy) or refuses the upload
sbom.share.createbefore, afteryes · policiesA link to an SBOM export that anyone can open is made (space, owner, name, version, format, with VEX, days); policies can forbid sharing or cap the days
sbom.vulnerability.foundafternoNew advisories match the components of one SBOM (space, owner, name, version, advisories worst first, max_severity, summary, open critical and high counts); space owners and maintainers get one alert per space and round of checks; forward it with automation
sbom.vulnerability.resolvedafternoAdvisories no longer affect one SBOM (space, owner, name, version, advisories, reason: no_longer_matches after a re-check, or vex); close what automation opened
sbom.scan.completeafternoEvery component of a newly stored version's SBOMs has been checked (space, repository, name, version, documents, coverage, counts by severity, checked, and not_covered: components no vulnerability data covers, so all counts 0 with not_covered above 0 means nothing could be checked, not a clean scan); raised once per version and inspection, not by daily re-checks
artifact.blockbefore, afteryes · policiesA quarantined version is blocked from quarantine (space, repository, format, name, version, note, scope, all_versions, rule_id, checksums, files): it stays stored and a block-list rule refuses it; policies can refuse it, for example to keep installation-wide blocks to a team
artifact.rejectbefore, afteryes · policiesA quarantined version is deleted and blocked (same fields as artifact.block); artifact.delete follows for each file; policies can refuse it
artifact.blockedafternoA request for a blocked version was refused (space, repository, path, name, version, rule, user); at most once per version and server every 10 minutes
pypi.release.yankbefore, afteryes · policiesA PyPI release is yanked or un-yanked (space, repository, project, version, yanked, reason); installers skip a yanked release unless it's pinned; policies can refuse it
nuget.package.listbefore, afteryes · policiesA NuGet package version is unlisted or relisted (space, repository, id, version, listed); unlisted versions leave search but still restore when referenced exactly; policies can refuse it
nuget.settings.updatebefore, afteryes · policiesA hosted NuGet repository's delete mode changes (space, repository, delete_mode: unlist or delete)
cargo.crate.updatebefore, afteryes · policiesA crate of a hosted Cargo repository changes (space, repository, crate, version, action, owners): a version yanked or unyanked (yank, unyank), owners added or removed (add_owners, remove_owners), its name reserved or released (reserve, unreserve), or a version's docs uploaded, built, removed or queued to build (docs, delete_docs, build_docs); policies can refuse it
huggingface.repo.updatebefore, afteryes · policiesA Hugging Face repository is created or deleted, its private flag changes, or a branch or tag is created or deleted
gitlfs.lock.createbefore, afteryes · policiesA file is locked in a Git LFS repository (git lfs lock)
gitlfs.lock.deletebefore, afteryes · policiesA Git LFS lock is released (git lfs unlock), with force when it was someone else's
composer.package.abandonbefore, afteryes · policiesA Composer package is marked abandoned (with an optional replacement) or no longer
composer.settings.updatebefore, afteryes · policiesA Composer repository's settings change (hosted packages hide upstream ones, keep git sources, whether a GitHub token is stored; never the token)
rubygems.gem.updatebefore, afteryes · policiesOne platform's file of a gem version in a hosted RubyGems repository is yanked or restored (space, repository, gem, version, platform, action: yank, unyank); policies can refuse it
rubygems.gem.ownershipbefore, afteryes · policiesA gem's owners change in a hosted RubyGems repository, or a gem name is reserved for its owners or released (space, repository, gem, action: add_owner, remove_owner, reserve, unreserve, owner id and user name, never an email); refused when policies can't be read
rubygems.settings.updatebefore, afteryes · policiesA RubyGems repository's settings change (space, repository, owners only, new names admin only, hosted gems hide upstream ones); refused when policies can't be read
conda.version.updatebefore, afteryes · policiesBuilds of a version in a hosted conda repository are yanked or restored (space, repository, package, version, files, action yank or unyank, reason); yanked builds leave the channel's index but stay downloadable; policies can refuse it
conda.settings.updatebefore, afteryes · policiesA conda repository's settings change (space, repository, whether it serves sharded repodata and, for a group, whether hosted packages hide upstream packages of the same name); refused when a subscriber can't be reached
conan.revision.publishbefore, afteryes · policiesA recipe revision or a binary's package revision is complete in a hosted Conan repository and about to become installable (space, repository, reference, recipe revision, and for a binary its package ID, package revision and settings; files, size, integrity); not raised again when a client uploads it again; policies can refuse it
conan.revision.deletebefore, afteryes · policiesA Conan recipe revision with its binaries, or one package revision, is deleted by a client or from the browser, also one a proxy has kept (same fields as conan.revision.publish, and cached: true for a proxy's; the upstream keeps it); artifact.delete follows for each file; policies can refuse it. Not raised when revisions go with their whole version (cleanup, the trash, a quarantined version deleted, the repository deleted), which raise their own events
conan.settings.updatebefore, afteryes · policiesA Conan group's settings change (space, repository, whether hosted recipes hide upstream recipes of the same name); refused when a subscriber can't be reached
cargo.settings.updatebefore, afteryes · policiesA Cargo repository's settings change (space, repository, owners only, new names admin only, hosted crates hide upstream ones, build docs, docs size limit)
apt.settings.updatebefore, afteryes · policiesAn APT repository's settings change: Release validity, a group's architectures, a proxy's upstream keys (space, repository, architectures, valid_days, upstream_keys)
yum.settings.updatebefore, afteryes · policiesA hosted YUM repository's or proxy's settings change (space, repository, repodata depth, trusted package keys, require signatures, require signed repodata); a new depth moves every package's address
repository.signing_key.updatebefore, afteryes · policiesAn APT, YUM or Terraform repository's signing key is rotated or replaced by an imported one, at once or after an overlap; a pending switch is brought forward, cancelled, or takes effect (activate, after only) (space, repository, format, action, fingerprint, previous fingerprint, activates_at); clients must trust the new key before it signs
npm.package.updatebefore, afteryes · policiesA published npm package changes: versions unpublished (or the whole package), deprecated, dist-tags moved, owners or stars changed (space, repository, package, action, versions, tag); policies can refuse it, for example to forbid unpublishing
artifact.deletebefore, afteryes · policiesA file is deleted from a repository (space, repository, path, size, SHA-256, version); policies can refuse it, for example to protect releases
space.upload_rules.updatebefore, afteryes · policiesA space's upload rules change (limits, default and number of rules)
space.cleanup_policy.create, .update, .deletebefore, afteryes · policiesA space's cleanup policy is added, changed or removed
cleanup.runafternoA cleanup policy ran: versions moved to the trash, bytes, the run's trash reason (to undo it), or the error
artifact.restorebefore, afteryes · policiesTrashed versions are restored (space, versions, bytes they add back); the space's quota and policies can refuse it
artifact.purgebefore, afteryes · policiesTrashed versions are deleted for good on request, before the trash is emptied (space, versions, bytes freed); policies can refuse it
space.quota.updatebefore, afteryesA super admin sets, changes or removes a space's storage quota
space.quota.warningafternoA space's storage passed its warning threshold or reached its quota (checked hourly; level warning or full)
access.grantbefore, afteryes · policiesA user or group is given a role on a space, or their role there changes (previous_role shows the old one). Policies can, for example, refuse the Owner role to groups
access.revokebefore, afteryes · policiesA user's or group's role on a space is removed
directory.createbefore, afteryesA directory is added (last in the order)
directory.updatebefore, afteryesA directory is renamed, enabled or disabled
directory.deletebefore, afteryesAn empty directory is deleted
directory.syncafternoA directory sync finished, failed or was blocked by a safety check
directory.reorderafternoDirectories are put in a new order
sso.provider.createbefore, afteryesAn identity provider for single sign-on is added
sso.provider.updatebefore, afteryesAn identity provider is changed, turned on or turned off
sso.provider.deletebefore, afteryesAn identity provider is removed
security.captcha.updatebefore, afteryesThe CAPTCHA settings change (provider, keys, which events ask)
system.check.completedafternoA system check run finished
system.check.changedafternoA system check found something worse than the previous run, or everything recovered
cluster.health.changedafternoThe cluster health status (ok, warning, problems) changed and held for two minutes
system_check.settings.updatebefore, afteryesWho is notified about system check changes, and how, changes
alert.silence.createbefore, afteryesA mute is added on Alert tuning
alert.silence.updatebefore, afteryesA mute's end or reason changes
alert.silence.endedafternoA mute ended: removed, expired, or its problem cleared
alert.tuning.updatebefore, afteryesA check's notification rule or thresholds change, or are reset
alert.incident.resolvedafternoA System health alert is OK again
log_alert_rule.create, log_alert_rule.update, log_alert_rule.deletebefore, afteryesA log alert rule is added, changed (including turned on or off) or removed
log.alert.firedafternoA log alert rule matched enough log lines and fired
logging.settings.updatebefore, afteryesThe logging settings change (levels, temporary levels, log file)
auth.session_policy.updatebefore, afteryesThe session settings change (inactivity limit, maximum length, Remember me, sessions per person)
sso.enforcement.updatebefore, afteryesRequiring single sign-on is turned on or off, or the super-admin password exception changes
security.anonymous_access.updatebefore, afteryesAnonymous access to public spaces is turned on or off (previous_enabled shows the old value)
security.rate_limits.updatebefore, afteryesThe installation's rate limits or download quotas change in Settings → Security → Rate limits
security.rate_limit_override.create, .update, .deletebefore, afteryesA rate limit override or download quota for a role, organization, user, API token, AI app or repository is added, changed or removed
security.download_quota.reachedafternoA person, token, AI app, organization or repository reached the warning level or the limit of a download quota (once per period and level)
site.settings.updatebefore, afteryesThe Depotex address (used in email links and single sign-on), the other addresses clients use, or whether package links use only these addresses changes
site.help.updatebefore, afteryesThe Help menu links change or are reset to the defaults
branding.updatebefore, afteryesThe app name, brand colors, logos or browser icons change
banner.createbefore, afteryesAn announcement banner is created
banner.updatebefore, afteryesA banner's title, text, kind, audience, schedule or switch changes
banner.deletebefore, afteryesA banner is deleted
oauth.client.createbefore, afteryesAn OAuth application is registered
oauth.client.updatebefore, afteryesAn OAuth application is changed, enabled, disabled or gets a new secret
oauth.client.deletebefore, afteryesAn OAuth application is removed
oauth.consent.grantbefore, afteryesA person allows an OAuth application (org policies can refuse it)
oauth.consent.revokeafternoA connection to an OAuth application ends
oauth.federation.createbefore, afteryesAn OAuth application starts trusting a CI system's identity tokens
oauth.federation.updatebefore, afteryesA workload identity trust rule changes or is turned off or on
oauth.federation.deletebefore, afteryesA workload identity trust rule is removed
applink.createbefore, afteryesA link with another Depotex installation is started here or accepted from the other side
applink.updatebefore, afteryesA link becomes active or gets new credentials
applink.deletebefore, afteryesA link with another installation is removed
applink.connectbefore, afteryesA person connects their own account on a linked installation
service_account.createbefore, afteryesA service account is created
service_account.updatebefore, afteryesA service account is renamed, gets another role, or is turned off or on
service_account.deletebefore, afteryesA service account is deleted
mcp.key.createbefore, afteryesA person makes an MCP key for an AI agent
mcp.key.revokebefore, afteryesAn MCP key is revoked by its owner or an administrator
ai_agents.mcp_keys.updatebefore, afteryesMCP keys are allowed or stopped for the installation (off stops every key)
ai_agents.settings.updatebefore, afteryesWrite tools for AI agents are allowed or stopped for the installation
plugin.settings.updatebefore, afteryesA plugin's settings, MCP mode (read-only or read-write) or switched-off tools change
plugin.data.deletebefore, afteryesA plugin's data is deleted: uninstalled with its data, restarted with its data reset, or its leftover data deleted
apitoken.createbefore, afteryes · policiesA user creates an API token
apitoken.updatebefore, afteryes · policiesA token is renamed or its IP allowlist changes
apitoken.rotatebefore, afteryes · policiesA token's secret is replaced
apitoken.revokeafternoTokens are revoked by their owner or an admin
apitoken.org_policy.updatebefore, afteryes · policiesThe organization's token rules change
avatar.updatebefore, afteryes · policiesA user sets a preset or uploads an avatar
avatar.deleteafternoA user removes their avatar
alert.createbefore, afteryes · policiesAn alert is sent to users
license.applyafternoAn admin applies a new license
cluster.node.renamebefore, afteryesAn admin renames a cluster node
scheduler.job.updatebefore, afteryesA job is enabled, disabled or rescheduled
scheduler.job.triggerbefore, afteryesA job is run by hand
scheduler.job.runbefore, afteryesA scheduled job runs; stopping it records the run as skipped
scheduler.job.unhealthyafternoA job failed several times in a row (SCHEDULER_UNHEALTHY_THRESHOLD)
scheduler.job.recoveredafternoA job that was failing ran successfully again
depot.repository.createbefore, afteryes · policiesA repository is created in a space
depot.repository.deletebefore, afteryes · policiesA repository is deleted: it disappears at once and can be restored until it is removed for good
depot.repository.restorebefore, afteryes · policiesA super admin restores a deleted repository, with its files, roles and settings
depot.repository.purgebefore, afteryes · policiesBefore: a super admin deletes a deleted repository permanently (a policy can refuse it). After: a deleted repository was removed for good, on request or after being kept long enough

Signing out, revoking sessions or tokens, and failed sign-ins can't be blocked: ending access always works.

4. What each event carries

EventFields
auth.loginBefore: user id, email, role, IP address, browser, remember me (policies may turn remember me off). After: also the session
auth.login.failedEmail, IP address, reason
user.createBefore: email, name, role, directory, whether a new password is required (policies may require one). After: user id, email, name, role, status, directory. Never the password
user.update, user.disable, user.enable, user.unlock, user.password.*User id, email, role (and the new email or name for updates)
user.role.changeUser id, email, old role, new role
user.anonymizeUser id and directory id only
user.password.recover, user.invitation.acceptUser id and kind
mail.settings.updateEnabled, provider, transport (smtp or ses_api), SES region and role ARN, host, port, security, from address, Depotex address (never the password)
storage.settings.updateBackend, location, endpoint, region, upload limit, part size, whether the location or credentials changed (never credentials)
repository_settings.updateLargest artifact, timeouts, retries, proxy on/off, proxy URL and username, no-proxy list (never the password)
repository_settings.proxy_checksums.updatestrict (the new value), previous_strict, formats
trusted_certificate.*Id, name, subject, issuer, SHA-256 fingerprint, expiry
vibe.settings.updateEnabled, refuse secrets, refuse hidden characters, package list address, each with its previous value
vibe.checkin.pushSpace, repository, project, whether it's new, milestone, what changed, file count, size, screenshots, test_passed, findings (counts per severity), max_finding_severity, finding_rules; after also the check-in number, parent, changed files and link
vibe.milestone.updateSpace, repository, project, check-in number, milestone (empty when cleared), previous_milestone
vibe.project.deleteSpace, repository, project, number of check-ins
group.create, group.update, group.deleteGroup id, name, description
group.member.*Group id and name, user ids
directory.createBefore: type, name. After: also id, enabled, position
directory.update, directory.deleteDirectory id, type, name, enabled, position
directory.syncDirectory id, run id, status (success, partial, failed, blocked), dry run, error, counts of users and groups created, updated, disabled, merged and removed
directory.reorderDirectory ids, highest first
sso.provider.create, sso.provider.update, sso.provider.deleteProvider id, type (oidc or saml), name, on or off, directory id, whether accounts are created on first sign-in. Never secrets
site.settings.updateThe Depotex address, the other addresses clients use (other_hosts), and whether package links use only these addresses (strict_links)
site.help.updateThe six links, your own links, and whether they were reset
branding.updateApp name, per-theme color, logo and icon, high-contrast switch
banner.*Banner, title, message, kind, audience, closable, start, end, on
oauth.client.*Application ID, client ID, name, kind (app or mcp), type, redirect addresses, scopes, approval, groups, enabled, token lifetimes, the plugins an AI agent may use, whether an AI agent's tools may change Depotex (mcp_access) (never the secret)
oauth.consent.grantApplication, user, scopes, whether pre-approved
oauth.consent.revokeConnection, application, user, and who revoked it (user, admin, app_deleted)
service_account.*ID, name, role, enabled
oauth.federation.*Rule, application, name, issuer, audience, conditions, enabled
applink.*Link, the other installation's name and address, directions, what it acts as, status (never credentials); applink.connect adds the person
mcp.key.*Key id, owner, plugin, name, permissions, read or read-and-change, IP allowlist, expiry, who acted (never the key)
ai_agents.mcp_keys.updateAllowed, and the previous value
ai_agents.settings.updateWhether write tools are allowed, and the previous value
plugin.settings.updatePlugin, setting values, read-write mode, tools switched off, each with its previous value
plugin.data.deletePlugin id and name, its data key, why (uninstall, reset or leftover), whether its database and key-value data are deleted, how many secrets
security.captcha.updateProvider, site key, puzzle size, the three switches and the failure count. Never the secret key
security.rate_limits.updateThe saved settings and the previous ones
security.rate_limit_override.*The override (scope, class, counts, budget or quotas, exempt, dry run, note); on update also the previous one
security.download_quota.reachedLevel (warning or exceeded), scope and its id, period (day or month) and which one, quota and bytes used, whether it is enforced, the person (when it's theirs)
system.check.completedRun id, scheduled or on demand, status (ok, warn, fail), counts
system.check.changedRun id, status, previous status, the changed checks with their old and new status
cluster.health.changedNew status, previous status, what needs attention (server, check, status, code)
system_check.settings.updateIn-app alert and email on or off, roles notified
alert.silence.*The mute (id, source, check, item, server, end, until the problem clears, reason, who made it); alert.silence.ended adds why it ended
alert.tuning.updateCheck, notify on, wait, reminders, thresholds, who changed it
alert.incident.resolvedAlert group, the severity it had before, the problems it last told
log_alert_rule.*Rule id, name, on or off, lowest level, pattern, severity, roles notified
log.alert.firedRule id and name, severity, number of matching lines, window in minutes, an example line
logging.settings.updateGlobal level, per-part levels (with end time for temporary ones), log file on or off, name pattern, format, size, rotation and retention
auth.session_policy.updateInactivity limit in minutes (0 = off), maximum length in hours, whether Remember me is offered, remembered length in days, sessions per person
sso.enforcement.updateWhether single sign-on is required, and whether super admins may still use a password
apitoken.*Token id, owner, name, permissions, expiry, IP allowlist — never the token itself
apitoken.org_policy.updateMaximum lifetime, maximum tokens per user, request limit, blocked permissions
avatar.updateUser, preset or upload, file type and size
alert.createcategory, severity, target, title, message, message keys and values, image, actions, expiry, creator
license.applyLicense id, licensee, tier, expiry, user and node limits
scheduler.job.*Job name; for updates the new settings; for runs the status, duration and any error
depot.repository.createBefore: name, format, description, space_id, space_key, type, upstream, checksum_policy (a proxy's starting Checksums: strict, warn, off or default for Use the Security setting; empty for other types), and for a group its members and policies (subscribers may adjust the description). After: id, name, format, space_id, space_key, type
depot.repository.deleteBefore and after: id, name, format, space_id, space_key
depot.repository.restore, depot.repository.purgeBefore and after: id, name, format, space_id, space_key, type, upstream

5. Failed deliveries

Settings → Advanced → Event deliveries (super admins) lists events that couldn't be delivered to a subscriber after every retry, with the last error. Retry once the problem is fixed, or Discard it. Failed deliveries are kept for 30 days (EVENT_DEAD_RETENTION_DAYS).

6. Performance

  • An event nobody listens to costs nothing measurable.
  • Before-subscribers (policies, plugins) run while the user waits: each adds to the time the action takes, up to the time limit below. Keep them simple.
  • Once something listens to an after-event, every occurrence writes to the database and is delivered in the background. On frequent events such as auth.login or busy scheduled jobs, many subscribers or slow ones add database load and delivery backlog. Subscribe only to the events you need.
  • Using an API token is deliberately not an event: a check on every request would slow down all API traffic. Use token settings and the organization's token rules instead.

On a busy installation, a slow or failing after-subscriber on a frequent event (for example every sign-in) builds up retries in the database. Watch the delivery settings below and keep such subscribers fast.

7. Time limits

VariableDefaultDescription
PLUGIN_PREHOOK_TIMEOUT5sHow long a before-subscriber may take before the operation is stopped (or the subscriber skipped, if it chose that)
PLUGIN_POSTHOOK_TIMEOUT30sHow long a plugin's after-hook may take before it is cancelled
EVENT_SUBSCRIBER_TIMEOUT30sHow long an after-subscriber may take per attempt

8. Delivery settings

VariableDefaultDescription
EVENT_DISPATCH_INTERVAL5sHow often pending events are delivered
EVENT_MAX_ATTEMPTS8Attempts before a delivery is marked as failed
EVENT_RETRY_BASE_DELAY / EVENT_RETRY_MAX_DELAY5s / 1hWait between attempts: doubles each time, up to the maximum
EVENT_DISPATCH_BATCH / EVENT_DISPATCH_CONCURRENCY100 / 4Events claimed per round, and processed in parallel per server
EVENT_DELIVERY_LEASE2mHow long a server reserves an event it is delivering; after that another server takes over
EVENT_OUTBOX_RETENTION_DAYS / EVENT_DEAD_RETENTION_DAYS7 / 30How long delivered and failed events are kept