Skip to Main Content
DocsRunartifact sharing

artifact sharing link

Publish a single file or the entire artifact directory as an HTTPS link, supporting public, password, team or designated member access, as well as validity period, download times and online preview.

If your workflow generates a report (.md / .html / .xlsx / .pdf) and wants to send it to others, the most direct way is to let the Slack/mail module upload the file attachment. But large files will be slow, and messaging platforms usually have limits on the size of a single file and the number of attachments.

Public Artifact Sharing is another way: publish a single artifact as an HTTPS sharing link, only send the link in the message, and click it to access it. Files are still provided by Braidrun's artifact storage, which avoids repeated uploading of attachments on each message channel, and also supports direct preview of Markdown in the browser. When you want to share multiple files at one time, you can also publish the entire artifact directory as a link, see "Directory-level public link" below.

When To Use It

  • Reports/dashboards need to be sent to Slack/Feishu/email, and I don’t want everyone to save a 3MB xlsx each.
  • An external collaborator (no platform account) needs to see an app store data snapshot
  • You share a quick .md summary with a client who should read it as HTML in a mobile browser
  • You want the link to have an expiry, a download cap, or password protection
Where artifacts land in a multi-node deployment

Artifacts are scanned continuously during a run and uploaded to object storage; a file at the same path with the same size reuses its existing storage location instead of being re-uploaded on every monitor tick. That way a freshly created file does not queue behind tens of megabytes of redundant uploads, and other nodes never receive a card for an artifact that only exists locally.

How to Use It — From the UI

  1. Open a finished execution, switch to the Artifacts tab, and each artifact has a 🔗 Share button next to it
  2. Click 🔗 Share to open the share dialog
  3. Configure as needed:
    • Access scope: public (default) / password / team / specified members; see "Access scope and access requests" below
    • Validity period: Never expires / 1 hour / 24 hours / 7 days / 30 days. The system remembers the last saved default; deployment policies can also disable permanent links
    • Download cap: 0 = unlimited, >0 = the link expires automatically once used up
    • Access password (password mode): the browser prompts for a password when the link is opened
    • Online HTML rendering (.md only): when ticked, the link shows formatted HTML instead of downloading the .md source
  4. Click "Generate Link" → Get a URL in the form https://your deployment domain name/p/a/hN2kQ9..., click "Copy" to send it

When the workflow finishes, the artifact automatically becomes a public link and the link is pushed to Slack — no manual sharing at any point.

A Typical Three-Step Arrangement

  1. Write the artifact-producing step as usual, no special markers needed — for example:
    - step: build_report
      agent: reporter
      input: |
        生成今天的业务报表,写入 /tmp/.../daily.md。
      # 这一步完成后,引擎自动注册一个产物(execution 的 artifacts 列表里会出现)
  2. Attach the built-in artifact publish module and pass the previous step's name `from_step: build_report`. The module looks up the execution's artifact list, finds the file that step produced, and creates a public link:
    - step: share_report
      sub_workflow:
        name: dingyue-module-artifact-publish
        inputs:
          from_step: "build_report"          # ← 平时只用填这一个:引用上一步的步骤名
          ttl_minutes: "0"                   # 永不过期;如需限时可改成分钟数
          render_markdown_as_html: "true"    # .md 直接在线 HTML 预览
        # backend_url / api_token 不用填 —— 引擎自动注入运行时访问令牌
        outputs:
          share_url: public_url              # 下游可以用 {{var:share_url}} 引用
      depends_on: [build_report]
  3. Then attach a built-in Slack delivery module and pass public_url in → Slack receives just a text message with the link, no file upload:
    - step: notify
      sub_workflow:
        name: dingyue-module-slack-deliver
        inputs:
          slack_webhook_url: "{{var:slack_webhook_url}}"
          message_text: "📊 今日报表已生成"
          public_url: "{{var:share_url}}"   # ← 复用 share_report 的输出
      depends_on: [share_report]

What About Multiple Artifacts

If the build_report step produced several files (say both daily.md and metrics.json), filter with artifact_name:

- step: share_report
  sub_workflow:
    name: dingyue-module-artifact-publish
    inputs:
      from_step: "build_report"
      artifact_name: "daily.md"            # ← 精确挑选
      ttl_minutes: "0"
    outputs:
      share_url: public_url

Without artifact_name the module takes the first matching artifact and logs how many others were left unused.

A single-file link can share only one artifact at a time. If one execution produces a set of files (a report + data + images, or even a complete multi-page static site), you can publish the entire artifact directory as one link:

  • UI entry: on the execution details "Artifacts" tab, click "Share all artifacts" to generate a directory link covering all of this execution's artifacts; the options (access scope / lifetime / download quota / password / online rendering) are the same as for a single file, plus you can set a custom display name
  • The API can also share the artifacts of a single step. To share the whole run: POST /api/executions/{id}/directory-public-link; to share a single step: POST /api/executions/{id}/steps/{stepName}/directory-public-link
  • The link looks like https://braidrun.com/p/d/hN2kQ9.../, and visitors need no account (in public mode)

What Visitors See

  • By default, a file-listing page: file name, size, and type, plus the link's lifetime and download quota
  • When there's an index.html at the directory root, it opens as a static site — a multi-page HTML report generated by a workflow can be shared as a whole site; add ?listing=1 to the URL to force back to the file-listing view
  • When online rendering is enabled, .md files in the directory are shown as formatted HTML
  • The files in the directory will be returned according to the correct Content-Type, and static resources such as HTML / CSS / JS can be loaded normally by the browser
  • The download quota accumulates across the whole directory, and the link expires automatically once it's used up

Access Scope and Access Requests

Single-file links and directory links share the same set of access scopes:

ModeWho Can Open It
PUBLIC PublicAnyone with the link
PASSWORD Password AccessAnyone with the link who knows the password; the browser prompts for it, and script clients use the Authorization: Basic or X-Artifact-Password header
TEAM Within the TeamRequires a signed-in Braidrun account that belongs to the specified team
USERS Designated MembersRequires sign-in and being on the member list; the list can only be chosen from members of the selected team

In team or specified-member mode, the link becomes a "sign-in-required deep link": accessing it while signed out redirects to login; signed in but not on the list shows a "no access" page.

Access request flow (optional in team or specified-member mode):

  1. When creating the link, check "Allow signed-in users to submit a request when they lack access"
  2. A visitor without access opens the link, fills in a request form on the "no access" page (a note can be attached); submitting again updates the original request
  3. The sharer or a link administrator approves / rejects under "Account → Share management"; before approving, confirm the person already belongs to the selected team
  4. Once approved, the person is added to the access list and can open the original link directly
  • "Account → Share management" manages single-file and directory links together: change the access scope, change the lifetime, revoke, and view access counts and access logs (time, account identity, IP, User-Agent)
  • The corresponding management API — list / update / revoke — is: GET /api/directory-public-links · PATCH /api/directory-public-links/{token} · DELETE /api/directory-public-links/{token}
  • The creator is the link administrator by default and can designate additional administrators to jointly handle access requests and revocations

Check before use

  • Sharing capabilities are determined by the currently deployed policy. If there is no share button in the execution details, please contact the platform administrator to confirm whether it is enabled.
  • The link depends on the original execution and artifact. Deleting the execution also invalidates the link.
  • Directory links are suitable for sharing a set of associated files or static sites; when index.html exists in the root directory, the site will be opened by default. Use ?listing=1 to switch back to the file list.
  • Large files and multi-file sites should be tried on the target network and browser before being officially sent; if a 410 occurs or the download fails, please ask the administrator to check whether the artifact still exists and the current storage policy.

Security & Compliance

  • Tokens are not enumerable —— Token is generated using 24 bytes of secure random number and encoded to 48 characters with 192 bits of random entropy and cannot be guessed by sequential enumeration
  • Crawler indexing protection —— The response contains X-Robots-Tag: noindex, nofollow and Referrer-Policy: no-referrer, which is used to request search engines not to include it and reduce source leakage. It is not access control, sensitive content should still use password, team or named member mode
  • Rate Limiting —— Public access routes can be configured by the deployer to control access frequency; each link can also use maxDownloads to limit the cumulative number of downloads. maxDownloads is the total amount protection of a single link, which is not equivalent to the request frequency limit by IP.
  • Password protection (optional) —— Argon2id hashing; the browser prompts on access, and script clients use the Authorization: Basic or X-Artifact-Password header. The password is not placed in the URL query string, to keep it out of access logs
  • Audit Log —— Every create / access / revoke writes an audit_log entry with client IP, User-Agent, and timestamp
  • GDPR Compliant —— Related sharing links are removed when the account is deleted. Account data exports include sharing records and required metadata, but never plaintext passwords.
  • Instant Revocation —— Clicking Revoke in share management takes effect immediately; revoked links return 410 Gone (not 404, to avoid confusion with "does not exist")

Go to Account → Share management (or call GET /api/public-links) to see every link you created, its access count, and whether it is revoked. Clicking Revoke disables the link immediately.

FAQ

  • The link has expired (its validity period ended)
  • The link was revoked by its creator or an administrator
  • The download count has hit its limit (the link expires automatically once the quota is used up)
  • The password was wrong (before you've entered one, you'll see the browser's password prompt rather than a 410)

Yes, provided the current deployment policy allows it. Permanent links will remain valid until manually revoked or the corresponding execution is deleted; it is still recommended to set a clear validity period and access scope for sensitive content.

The platform requests the search engine not to include it through the noindex, nofollow and no-referrer response headers, and the standard gateway template will also add noindex. But this is not a guarantee of absolute confidentiality: a publicly posted URL may still be discovered or forwarded by others. Please use password, team or designated member mode for sensitive content, and set an expiration date.

Q: what file sizes are appropriate?

There is no fixed cap that applies to all deployments. The actual available size depends on the package storage quota, the upload and download limits of the current site, and the network environment. Before officially sharing large files, please use the target access method to test open and download them; if it fails, please contact the platform administrator to confirm the current site restrictions.

No. Deleting an execution cascades a revoke to every link pointing at it; later visits get 410 Gone.

Q: IS This feature enabled by default?

Not necessarily. Whether it is available is determined by the current deployment strategy; if there is no share button in the execution details, please contact the platform administrator for confirmation.

Last Updated · 2026-08-06

Was this page helpful?