Skip to content

Guides & reference

Integrations and extensions

Living diagrams bound to GitHub and file sources, CI architecture tests and diff comments, embeds, MCP, Overleaf, reference managers and packaged tools status.
Sculptural study of connected forms and structured ideas

flowss connects to the rest of your toolchain in five ways that work today: living diagrams that stay bound to a source of truth in a public repository, architecture and quality tests that run in your CI through the REST API, embeds and clipboard exports for docs, wikis and chat, the MCP server for AI assistants, and hand-offs to LaTeX and reference managers. This page explains each one end to end, with the exact buttons, the limits and the errors you may see, plus ready-to-paste workflows for GitHub Actions and GitLab CI. It also says plainly which packaged tools (a GitHub Action, two command-line tools and a VS Code extension) exist but are not yet offered for you to install, and what to use instead.

At a glance

IntegrationWhat it doesWherePlansStatus
Living diagramsBinds a diagram to a public GitHub repo, compose file, SQL schema, OpenAPI spec or raw file, and flags drift/live and the Studio's Collaborate panelEvery signed-in account for checks; AI reconcile needs AIAvailable
CI architecture testsFails a pull request when a diagram no longer matches the codeYour CI, calling POST /api/v1/verifyEvery plan with an API keyAvailable
CI quality gates and diffsCritiques diagrams and posts structural diffs on pull requestsYour CI, calling /api/v1/critique and /api/v1/diffEvery plan with an API keyAvailable
EmbedsLive diagrams in Notion, Confluence, blogs, READMEs and any HTML pageShare menu and the Embed dialogsEvery plan from the Studio; from Weave on plans that include WeaveAvailable
ClipboardPaste a diagram into chat, docs or slides as PNG or SVG, or its source as textThe Studio's export menuEvery planAvailable
MCP serverLets AI assistants list engines, generate, check, convert, render and diff diagramshttps://www.flowss.ai/api/mcpSeveral tools without a key; generating, rendering, diffing and science checks with an API keyAvailable
OverleafOpens a figure's TikZ in a new Overleaf projectThe Studio's TikZ panelPlans with AI: the TikZ conversion is an AI call (hosted points on Plus and up, or your own key on Starter and up)Available
Reference managersImports search exports and exports bibliographiesThe Evidence studioStarter and up (plans that include Evidence)Available
Packaged GitHub Action, CLIs, VS Code extensionWrap the API for CI and editorsNot yet offered for installationNot available to install
Automatic pull requests on pushRegenerates committed diagrams and opens a PRRequires a GitHub AppNot offered on flowss.ai

Living diagrams

A living diagram is a figure in one of your cloud projects that is bound to its source of truth: the place where the real system is described. flowss reads that source, extracts its structure (services, tables, endpoints, nodes) and compares it with the diagram. When the source moves and the diagram does not, the binding shows Drift and lists exactly what is missing and what is stale. You can then reconcile the diagram with AI in one click, or fix it by hand.

The comparison itself uses no AI. It runs when you press Check, on a schedule, and in your CI.

Before you start

  • You must be signed in.
  • The diagram must be a figure in a cloud project. A diagram that lives only in your browser cannot be bound. To put your current Studio workspace in the cloud, open the Collaborate panel in the Studio and click Share this workspace as a live project. (The Live dashboard's hint calls this step "Move to cloud".)
  • To bind, reconcile or remove a binding you need the editor role (or owner) on the project. Any member of the project can see its bindings, run Check and read the history.
  • The source must be public. flowss reads repositories and files anonymously, the same way a visitor without an account would.

The sources you can bind

Source typeLabel in the binding dialogWhat you enterWhat becomes the model
A GitHub repositoryGitHub repoowner/repo or owner/repo@branch (a tag or commit also works after @; a https://github.com/owner/repo address is accepted too)A whole-repo architecture scan: the services and depends_on links in a docker-compose file, or, if there is none, one node per package in a package.json workspaces monorepo with links for dependencies between them
A raw fileRaw file URLAn https:// link to a fileThe file is read in the bound figure's own engine. A Mermaid flowchart, D2, Graphviz, DBML, Structurizr, ERD, SQL or OpenAPI file is compared structurally; any other file is tracked for changes only (see Tracking below)
A compose filedocker-composeAn https:// link to a compose fileServices become the architecture model
An API specificationOpenAPI specAn https:// link to an OpenAPI or Swagger fileEndpoints and schemas become the model
A database schemaSQL schemaAn https:// link to a DDL fileTables and foreign keys become the model

For a GitHub repository scan, flowss looks for files named like docker-compose*.yml or compose*.yaml anywhere in the repository, tries the shallowest ones first (up to twelve), and uses the first that describes at least two services. A compose file wins over workspaces when both exist; a workspaces monorepo needs at least two packages. Once a binding has been checked, it remembers which file it was based on and reads only that file afterwards, so a new compose file elsewhere in the repository never silently changes what the diagram is compared with. Without @branch, the repository's default branch is scanned.

Where a file may live

File sources are fetched with strict rules:

RuleDetail
Hostsraw.githubusercontent.com, gist.githubusercontent.com, gitlab.com, bitbucket.org, codeberg.org
Page linksA GitHub …/blob/… link is turned into its raw file link automatically, and so are GitLab /-/blob/, Bitbucket /src/ and Codeberg /src/branch/ (or tag, commit) links
Protocolhttps:// only
SizeUp to 256 KB. A larger file is refused rather than compared in part
TimeThe file must arrive within 8 seconds
ContentText only. Images, archives, PDFs and other binary files are refused, and so is an HTML page (use the host's Raw button). An empty file is refused too
RedirectsUp to 3, and every hop must stay on the allowed hosts

For a repository scan, compose and package.json files are read through GitHub's API, up to 128 KB each, with a 10-second limit per request. A repository with more than about 100,000 files is too large for a whole-repo scan; bind its compose file by URL instead. Repository scans are anonymous, so GitHub's limit on anonymous requests applies; when it is used up, the check says when it can run again.

Bind a diagram from the Live dashboard

  1. Open /live (you need to be signed in). The page header reads Living Diagrams and Diagrams that stay true.
  2. Click Bind a diagram (or Bind your first diagram if you have none yet; that empty page also links to CI architecture tests — API docs, the self-describing GET /api/v1/verify).
  3. In the dialog Bind a diagram to a source of truth, under 1 · The diagram, choose a project in the first list (Pick a project…) and a figure in the second (Pick a diagram…). Each figure is listed with its engine in brackets.
  4. Under 2 · The source of truth, choose one of GitHub repo (selected when the dialog opens), Raw file URL, docker-compose, OpenAPI spec or SQL schema. A one-line hint below the buttons explains the choice.
  5. Type the repository or the URL in the field. The placeholder shows the expected shape, for example owner/repo or owner/repo@branch.
  6. Click Bind & run first check (it stays disabled until a diagram is picked and the field is filled). You see Diagram bound — first check recorded, and the binding appears as a card with its first verdict.

Cancel closes the dialog without binding. A figure can have one binding: binding it again replaces the source. The figure's engine is recorded with the binding when you bind it.

Note: The Diagram bound — first check recorded message appears even when that first check could not run (for example the file could not be fetched). In that case the card shows Error; open Runs to read why, fix the source and press Check.

Bind a diagram from the Studio

The Studio's Collaborate panel has a Living source section for the figure that is open, when you are working in a cloud project.

  1. Open the figure in the Studio, inside its cloud project.
  2. Open Collaborate and find Living source.
  3. Paste a file URL into the field (placeholder: Bind this diagram to a source URL (GitHub raw/blob…) and keep it in sync).
  4. Press Enter or click Bind & sync.
Note: Bind & sync binds a raw file URL (compared in the figure's current engine) and then immediately runs a sync, which reconciles with AI if the diagram differs from the source (see the costs below). The sync needs AI even when it turns out to cost nothing, so on Free, or without enough points, the binding is created but the sync is refused with a message about AI points. To bind without AI, or to bind a repository, compose file, spec or schema, use the Live dashboard, whose first step is an AI-free check.

Once bound, the section shows the host of the source (or just source for a repository binding made on the Live dashboard), checked … with how long ago (or not checked yet), · error if the last attempt failed, a Sync now button (it reads Syncing… while working) and an × button titled Unbind. After a sync, a line under the binding says what changed, or In sync — source unchanged., and a notice at the bottom of the panel reads Synced — … or Already in sync with the source. When a sync returns a diagram, its source is loaded into the editor. Errors appear in a red notice at the bottom of the panel. Sync now in the Studio, like Reconcile on the Live dashboard, uses an AI key saved to your account but not a key kept only in your browser.

The binding card

Each binding on the Live dashboard is a card showing a status badge, the figure's title, the project (in …), the source (owner/repo@ref for a repository, the host and the last two parts of the path for a file), and checked … (for example checked just now, checked 3h ago, checked 2d ago, or checked never). After a Check or a Reconcile, a line under the card shows that run's one-sentence summary. Its buttons:

ButtonTooltipWhat it doesUses AI
CheckDeterministic drift check — no AIRe-reads the source and compares it with the figure. Shows the verdict and, if there is drift, the What drifted panelNo
ReconcileAI reconcile — smallest layout-preserving updateUpdates the figure to match the source with the smallest change it can, keeping your layoutOnly if needed (see below)
RunsOpens the history of checks and syncsNo
CIGitHub Action snippet for CI architecture testsOpens a ready-made GitHub Actions workflow for this bindingNo
Bin iconRemove bindingRemoves the binding after you confirm. The diagram itself is untouchedNo

The strip at the top of the dashboard counts your bindings by status (for example 2 in sync, 1 drift), and Refresh reloads them.

Status badges

BadgeMeaning
In syncThe last check compared the figure with the source structurally and found no difference, a reconcile has just brought the figure to the source, or the source is unchanged since the diagram was last reconciled
DriftThe source and the figure disagree
ErrorThe last check or sync failed. Runs shows why
Working…A reconcile is running
TrackingThe source is watched for changes, but this figure cannot be compared with it structurally (for example a raw file in an engine without a structural reader). The first check records a baseline; if the source changes after that, the binding moves to Drift. The figure is never declared verified

After a Check, a short message confirms the verdict: Verified in sync, Drift detected, Source unchanged since the last reconcile, or Source tracked — this diagram can't be verified against it structurally. After a Reconcile, it reads Diagram reconciled with its source or Already in sync; if a check or reconcile fails, the message is the error itself and the badge turns to Error.

For a figure that cannot be compared structurally, the summary line explains what was recorded, for example Baseline recorded. This diagram can't be compared with its source structurally, so future checks track source changes only. or The source has changed since the last sync — run a sync to reconcile.

What drifted

When a check finds drift, the card opens a What drifted panel with the share of the source's entities found in the diagram (coverage 67%) and up to four lists:

ListMeaning
Missing from the diagramThings in the source the diagram does not show
No longer in the sourceThings the diagram shows that the source no longer has (struck through)
Missing connectionsRelations in the source the diagram lacks
Stale connectionsRelations the diagram shows that the source no longer has

Each list shows its first eight items and a +N more count. Reconcile with AI — apply these edits at the bottom runs a reconcile.

Entities are matched by name: lower-cased, with parenthetical notes removed, with everything that is not a letter or a digit (spaces included) dropped, and with the affixes service, svc, server and the removed from the start or end of longer names. Connections are compared only between entities found on both sides. A node labelled API service matches a compose service named api; a node labelled Postgres does not match a service named db.

Reconcile and what it costs

Reconcile works in three steps and stops at the first that settles the matter:

  1. If the binding is In sync and the source is byte-for-byte unchanged since it was last confirmed, nothing happens: Already in sync — the source hasn't changed.
  2. If a structural comparison shows the figure already matches, nothing is rewritten: Verified structurally: the diagram matches the source.
  3. Otherwise the flowss Studio Agent makes the smallest layout-preserving update to the figure and saves it.
Cost
Steps 1 and 2Free
Step 3 on hosted AI8 AI points (an agent run), charged when the AI reconcile runs and returns a result, even if that result turns out to need no change. A failed run is not charged
Step 3 on your own AI keyNo points; counts toward your daily own-key requests

On hosted AI, Reconcile needs at least 8 points available before it starts, even if it turns out to be free. An AI key saved to your account (the Bring-your-own key card on your account page, Starter and up) is used before points. Free includes no AI, so on Free use Check and fix the diagram by hand. On Starter, which has no hosted points, Reconcile works only with a key saved to your account; a key kept only in your browser is not used here. See AI points and limits and Bring your own AI key.

A step 3 run that did change the figure leaves a summary of what changed (for example Added 1 node (worker). followed by the AI's own account); one that did not reads No change — the diagram already matches the source.

If somebody edits the figure while a reconcile runs, flowss does not overwrite their edit: you see The bound diagram was edited while the sync ran, so the reconciled version was not written over it. Run the sync again to reconcile the edited diagram. and the card returns to Drift.

Run history

Runs lists the latest 25 checks and syncs, newest first, each with a coloured dot (green in sync, amber drift, red error), what triggered it, its summary or error, and when it ran. If there are none: No runs yet — hit Check to baseline this binding. Click Runs again to close the list; it is loaded once per visit, so reload the page to see runs added since.

TriggerMeaning
checkSomebody pressed Check, or the binding was just created
manualSomebody pressed Reconcile, Sync now or Bind & sync
scheduleThe automatic sweep

Automatic checks

flowss re-checks bindings automatically. Every hour a sweep checks bindings that have not been checked for at least six hours, oldest first. It keeps going for up to about four and a half minutes and checks at most 240 bindings in one run; whatever it does not reach waits for the next hour. Automatic checks never use AI and never change your diagram: they only update the status, so the dashboard and your Library show drift the next time you look. With many bindings across the platform, an individual binding may wait longer than six hours between automatic checks; press Check whenever you need a fresh verdict.

Drift in your Library

Cloud projects in your Library carry a badge with the worst status of their bindings: Drift, Error, Syncing, Tracking or In sync.

What counts toward your limits

ActionSpends
Check, including the first check after bindingOne call from your daily allowance of 60 deterministic calls, shared with the REST API and the headless render API
Automatic checksNothing
Reconcile, Sync now, Bind & syncNothing when the source is unchanged or already matches; otherwise 8 AI points or one request on your own key, when the AI reconcile runs
CI verification through the APIOne deterministic call per request

Removing a binding

On the Live dashboard, click the bin icon and confirm Unbind "…" from …? The diagram itself is untouched. You see Binding removed. In the Studio, click × (Unbind) in the Living source section; this removes the binding without asking, and if you lack the editor role it silently leaves the binding in place. Either way the figure stays exactly as it is.

Architecture tests and quality gates in CI

Anything that can make an HTTPS request can use the REST API, so every CI system can run flowss checks. All of them are deterministic: no AI, no cost surprises, and the same input always gives the same verdict. Each request spends one call from your account's daily allowance of 60.

Set up once

  1. Create an API key on your account page: API keys, then Create key (full steps on The REST API).
  2. In your repository settings, add the key as a secret named GLYPH_API_KEY.
  3. Add a variable named GLYPH_URL with the value https://www.flowss.ai.

The workflows on this page use those two names because the Live dashboard's CI button does too, so one secret serves every workflow.

Note: Pull requests opened from forks do not receive your repository's secrets, so these workflows can only run on pull requests from branches of the same repository.

The workflow from the CI button

On the Live dashboard, click CI on a binding. The dialog Architecture test — fail the PR when this diagram lies shows a complete workflow with your project and figure ids filled in, under a reminder to add a GLYPH_API_KEY secret (created in Account, API keys) and a GLYPH_URL variable; Copy workflow copies it and confirms Workflow copied. It looks like this:

# .github/workflows/architecture-test.yml
name: Architecture test
on: [pull_request]
jobs:
  verify-diagram:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Verify "System context" still matches this repo
        run: |
          RES=$(curl -sS -X POST "${{ vars.GLYPH_URL }}/api/v1/verify" \
            -H "Authorization: Bearer ${{ secrets.GLYPH_API_KEY }}" \
            -H "Content-Type: application/json" \
            -d '{"projectId":"<project id>","figureId":"<figure id>"}')
          echo "$RES" | jq .
          [ "$(echo "$RES" | jq -r .pass)" = "true" ] || {
            echo "::error::Architecture drift — the diagram no longer matches the code."; exit 1; }

With no truth in the request, flowss re-fetches the binding's own source on its servers. That means the check compares the diagram with the source as it is published (for example on your default branch), not with the pull request's changes. To test the pull request itself, send the changed file as inline truth, as in the next workflow.

Test a pull request's own changes

This version reads the compose file and the diagram from the checked-out pull request and sends both inline, so it needs no binding and no stored figure:

# .github/workflows/architecture-test.yml
name: Architecture test
on: pull_request
jobs:
  verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: The architecture diagram must match docker-compose.yml
        env:
          GLYPH_URL: ${{ vars.GLYPH_URL }}
          GLYPH_API_KEY: ${{ secrets.GLYPH_API_KEY }}
        run: |
          set -euo pipefail
          jq -n --rawfile d docs/architecture.mmd --rawfile c docker-compose.yml \
            '{diagram: {engine: "mermaid", code: $d}, truth: {kind: "compose", content: $c}}' > body.json
          curl -sS --fail-with-body -X POST "$GLYPH_URL/api/v1/verify" \
            -H "Authorization: Bearer $GLYPH_API_KEY" \
            -H "Content-Type: application/json" \
            --data-binary @body.json > result.json
          jq . result.json
          if [ "$(jq -r .pass result.json)" != "true" ]; then
            echo "::error::$(jq -r .summary result.json)"
            exit 1
          fi

truth.kind may be compose, sql, openapi, or a diagram engine (mermaid, d2, graphviz, dbml, structurizr, erd). The diagram must be in one of the structural engines. --fail-with-body makes the job fail with the error message if the request itself is refused (a bad key, a used-up allowance), which keeps "the diagram drifted" and "the check could not run" distinguishable in your logs.

Gate on diagram quality

Every Mermaid file under docs/diagrams/ must at least be sound (nothing mechanically broken). Raise gate to reviewed or publishable for stricter rules; the levels are explained on The REST API.

# .github/workflows/figure-quality.yml
name: Figure quality
on: pull_request
jobs:
  critique:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Every figure in docs/diagrams must be sound
        env:
          GLYPH_URL: ${{ vars.GLYPH_URL }}
          GLYPH_API_KEY: ${{ secrets.GLYPH_API_KEY }}
        run: |
          set -euo pipefail
          for f in docs/diagrams/*.mmd; do
            jq -n --rawfile c "$f" '{engine: "mermaid", code: $c, gate: "sound"}' > body.json
            curl -sS --fail-with-body -X POST "$GLYPH_URL/api/v1/critique" \
              -H "Authorization: Bearer $GLYPH_API_KEY" \
              -H "Content-Type: application/json" \
              --data-binary @body.json > result.json
            echo "$f: $(jq -r '.readiness.level + " — " + .readiness.reason' result.json)"
            if [ "$(jq -r .pass result.json)" != "true" ]; then
              echo "::error file=$f::$(jq -r '.readiness.blocking[0] // .readiness.reason' result.json)"
              exit 1
            fi
          done

Each file is one call, so this suits a handful of diagrams. With more, critique only the files the pull request changed.

Comment a structural diff on every pull request

This workflow sends every diagram file the pull request changed to POST /api/v1/diff in one batch (one call, however many files), writes the Markdown summary to the job summary and posts it as a pull-request comment.

# .github/workflows/diagram-diff.yml
name: Diagram diff
on: pull_request
permissions:
  contents: read
  pull-requests: write
jobs:
  diagram-diff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Diff the diagrams this pull request changes
        env:
          GLYPH_URL: ${{ vars.GLYPH_URL }}
          GLYPH_API_KEY: ${{ secrets.GLYPH_API_KEY }}
          GH_TOKEN: ${{ github.token }}
          BASE: ${{ github.event.pull_request.base.sha }}
          HEAD: ${{ github.event.pull_request.head.sha }}
          PR: ${{ github.event.pull_request.number }}
        run: |
          set -euo pipefail
          MB=$(git merge-base "$BASE" "$HEAD")
          PATTERNS=('*.mmd' '*.mermaid' '*.d2' '*.dot' '*.gv' '*.dbml' '*.sql')
          git diff --name-only "$MB" "$HEAD" -- "${PATTERNS[@]}" > changed.txt
          if [ ! -s changed.txt ]; then echo "No diagram files changed."; exit 0; fi
          echo '[]' > batch.json
          while IFS= read -r f; do
            case "$f" in
              *.mmd|*.mermaid) eng=mermaid ;;
              *.d2) eng=d2 ;;
              *.dot|*.gv) eng=graphviz ;;
              *.dbml) eng=dbml ;;
              *.sql) eng=sql ;;
            esac
            git show "$MB:$f" > before.txt 2>/dev/null || : > before.txt
            git show "$HEAD:$f" > after.txt 2>/dev/null || : > after.txt
            jq --arg p "$f" --arg e "$eng" --rawfile b before.txt --rawfile a after.txt \
              '. + [{path: $p, engine: $e, before: $b, after: $a}]' batch.json > batch.tmp
            mv batch.tmp batch.json
          done < changed.txt
          jq '{files: .}' batch.json > body.json
          curl -sS --fail-with-body -X POST "$GLYPH_URL/api/v1/diff?format=markdown" \
            -H "Authorization: Bearer $GLYPH_API_KEY" \
            -H "Content-Type: application/json" \
            --data-binary @body.json > result.json
          jq -r '.markdown' result.json > diff.md
          cat diff.md >> "$GITHUB_STEP_SUMMARY"
          gh pr comment "$PR" --body-file diff.md

Things to know about this workflow:

  • It posts a new comment on every push to the pull request. Remove the last line if you prefer only the job summary.
  • A batch holds up to 100 files and 4 MB of source; split larger pull requests.
  • A file that was added or deleted has an empty side, so the API compares it as text and reports The source changed. rather than a node-by-node breakdown.
  • To block merges that remove things, append these lines to the end of the same step's run script (they reuse MB, HEAD and PATTERNS from it), so the job fails when any result lists removed nodes or edges, or when a diagram file was deleted:
removed=$(jq '[.results[] | select(((.diff.removedNodes // []) | length) > 0 or ((.diff.removedEdges // []) | length) > 0)] | length' result.json)
deleted=$(git diff --name-only --diff-filter=D "$MB" "$HEAD" -- "${PATTERNS[@]}" | wc -l)
if [ "$removed" -gt 0 ] || [ "$deleted" -gt 0 ]; then
  echo "::error::This pull request removes parts of the architecture. Review the diagram diff."
  exit 1
fi

Other CI systems

The same requests work anywhere. A GitLab CI job that runs the architecture test on merge requests:

architecture-test:
  image: alpine:3.20
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  before_script:
    - apk add --no-cache curl jq
  script:
    - |
      jq -n --rawfile d docs/architecture.mmd --rawfile c docker-compose.yml \
        '{diagram: {engine: "mermaid", code: $d}, truth: {kind: "compose", content: $c}}' > body.json
      curl -sS --fail-with-body -X POST "$GLYPH_URL/api/v1/verify" \
        -H "Authorization: Bearer $GLYPH_API_KEY" \
        -H "Content-Type: application/json" \
        --data-binary @body.json > result.json
      jq . result.json
      test "$(jq -r .pass result.json)" = "true"

Define GLYPH_API_KEY as a masked CI/CD variable and GLYPH_URL as a plain one. In Jenkins, CircleCI or Buildkite, run the same curl and jq commands in a shell step with the key from your secret store.

Keep generated diagrams up to date

POST /api/v1/generate turns a SQL schema, an OpenAPI spec or a DBML, D2, Graphviz, Structurizr, ERD or Mermaid flowchart source into a Mermaid diagram, byte-for-byte the same every time for the same input. A CI job can regenerate a committed Mermaid file from its source and fail when the committed copy is stale:

jq -n --rawfile c db/schema.sql '{engine: "sql", code: $c}' > body.json
curl -sS --fail-with-body -X POST "$GLYPH_URL/api/v1/generate" \
  -H "Authorization: Bearer $GLYPH_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @body.json | jq -j .mermaid > /tmp/db.mmd
diff -u docs/db.mmd /tmp/db.mmd || { echo "docs/db.mmd is stale: regenerate it."; exit 1; }

jq -j writes the mermaid value exactly as returned, with no extra newline, so commit the file produced the same way. A source that cannot be parsed answers HTTP 422, which --fail-with-body turns into a failed job.

Embedding diagrams in docs, wikis and chat

Live embeds

An embed is a link to the /embed page that carries the whole diagram, so it renders anywhere an iframe or a link works, with no account: Notion, Confluence, blogs, READMEs and any HTML page.

FromHow
The Studio toolbarShare (tooltip Share — link, embed, or the whole project), then Copy share link, Copy embed <iframe>, or Copy project link (N) when the workspace has several figures (it reads Too large — split it when the project will not fit in one link)
The Studio's File menu, Send to (also in the command palette, ⌘K)Embed — copy iframe / Markdown snippet opens the dialog Embed this figure, with Copy iframe (for Notion, Confluence and any HTML page) and Copy Markdown (for READMEs and docs; a link, not an image)
WeaveEmbed — iframe / Markdown snippet opens Embed this flow, with Copy link, Copy iframe and Copy Markdown
The REST APIPOST /api/v1/diagram returns a ready embed_url
Your own siteThe embed.js script turns marked-up elements, or a source file in a public repository, into live diagrams

How the two embed dialogs differ:

DialogWhere the diagram travelsWhat to watch
Embed this figure (Studio)In the link's query string. flowss keeps no copy, but the source reaches flowss's servers each time the embed renders, and can appear in access logs, both flowss's and the host page'sLinks over 8,000 bytes trigger a warning: many hosts truncate or refuse long links, which breaks the embed silently. Trim the source if the paste target mangles it
Embed this flow (Weave)In the link's # fragment, which browsers do not send to serversThe dialog shows the link's size and warns when it is too long for common hosts

The embed script, live embeds from a repository file, themes, sizes and the headless render API are covered on Embedding and the render API.

Pasting into chat, docs and slides

In the Studio's export menu, under Copy to clipboard:

ItemUse it for
Copy as PNG (also the command Copy diagram as PNG, ⌥⌘P)Pasting a picture into Slack, Teams, email, Google Docs, Word or slides
Copy as SVGPasting a crisp, scalable picture into tools that accept SVG
Copy sourcePasting the diagram's text. GitHub, GitLab and many wikis render a Mermaid code block natively, so a Mermaid figure's source pasted into a fenced mermaid block draws itself in a README
Download sourceSaving the source as a file to commit beside your code

Every export format is listed on Exporting your work.

Connecting AI assistants (MCP)

flowss runs a Model Context Protocol server at https://www.flowss.ai/api/mcp (JSON-RPC 2.0 over HTTP; a plain GET lists its tools). Point any MCP client that speaks HTTP at it and send your API key as Authorization: Bearer glyp_…. Without a key, the assistant can list engines and templates, detect an engine, verify and critique diagrams, and convert between engines that have a built-in converter. With your key it can also generate, render and diff diagrams, convert with AI and run the science checks; those calls are metered to your account exactly as the REST API is. Setup, the tool list and the limits are on The flowss MCP server.

LaTeX and Overleaf

  • The Studio's TikZ panel turns a figure into LaTeX when you press Convert (later Regenerate). The conversion is an AI call, so it needs hosted AI points (Plus and up) or your own AI key (Starter and up); conversions on hosted AI also have a per-plan daily limit of their own. Once there is LaTeX, Copy LaTeX and Download .tex save it, and Open in Overleaf (tooltip Open this LaTeX directly in a new Overleaf project) sends it to Overleaf, which opens it as a new project. You need an Overleaf account. See Data, timeline, TikZ and the diagram tools.
  • The Evidence studio exports a bibliography as BibTeX (.bib) for LaTeX and Overleaf.

Reference managers

The Evidence studio reads and writes the formats reference managers use:

DirectionWhereFormats
ImportThe References button in the sources panel (tooltip: Import a search export from PubMed, Embase, Scopus, Zotero or EndNote — RIS, BibTeX or .nbib. Records without an abstract are looked up by DOI where possible.)RIS, BibTeX, .nbib
ExportThe export menuRIS (.ris) for Zotero, Mendeley and EndNote; BibTeX (.bib) for LaTeX and Overleaf

There is no live connection to a reference manager's library; you move files between them. More on Screening, extraction and synthesis.

Packaged tools that are not yet available

flowss has built several tools that wrap the REST API for particular places, but none of them is offered for you to install from flowss yet (the diff runner, for example, is not published to npm). Everything they do is available through the API, and the equivalents below work now.

ToolWhat it doesUse this today instead
GitHub Action "Flow Systems Diagram Diff"Posts a single, updating structural-diff comment on each pull request, adds file annotations, and can fail the check on any change or only on removalsComment a structural diff on every pull request
glyph-diff command-line toolThe same diff, plus regeneration of committed diagrams from a config file, for any CI or a git hookThe diff and generate recipes on this page
glyph command-line toolRenders diagrams to SVG or PNG from a terminal through the headless render API (with an API key)curl to POST /api/render with Authorization: Bearer glyp_…, described on Embedding and the render API
VS Code extension "Flow Systems Diagram Preview"Live preview of diagram files in the editor through the /embed pageThe Studio, or an embed link
Automatic pull requests on pushRegenerates committed diagrams when their sources change and opens a pull requestThe stale-diagram check in Keep generated diagrams up to date

Automatic pull requests depend on a GitHub App that flowss.ai does not offer for installation, so that feature is not available on flowss.ai. There is also no webhook you can add to your own repository to trigger checks on push; use the automatic checks, the Check button and your CI instead.

Tips

  • Bind the file that is the real source of truth (the compose file, the DDL, the spec), not a copy of the diagram, so drift means "the system changed".
  • Name diagram nodes after the services, tables or endpoints in the source; matching is by name.
  • On Free, bind from the Live dashboard rather than with Bind & sync in the Studio, so binding never asks for AI.
  • One schema or one spec per binding keeps each file under the 256 KB limit.
  • Batch diffs into one request per pull request; each request spends one of your 60 daily calls, however many files it carries.
  • Give each CI pipeline its own API key, named after it, so you can see which ones run and revoke one without breaking the others.
  • Keep a GLYPH_URL variable rather than hard-coding the address, so every workflow changes in one place.

Limits and known constraints

  • Only public repositories and publicly reachable files on the five allowed hosts can be bound. Private repositories, self-hosted Git servers and other hosts are not supported.
  • File sources must be 256 KB or smaller; repository manifests 128 KB or smaller.
  • A figure can have one binding.
  • Automatic checks run once an hour (at most 240 bindings a run) and only for bindings not checked in the last six hours, so they are not instant.
  • Reconcile needs AI: hosted points (8, only when the AI rewrites the figure) or an AI key saved to your account. Free cannot reconcile.
  • Check and API checks share your account's 60 deterministic calls a day with the rest of the REST API and the render API.
  • Reconcile, Sync now and Bind & sync need AI, even when the result turns out to be free, and they use a key saved to your account, never one kept only in your browser.
  • Opening a figure in Overleaf requires a TikZ conversion, which is an AI call.
  • verify passes a diagram that draws extra connections the source lacks; they are reported as stale connections but do not fail the check.
  • The packaged GitHub Action, command-line tools and VS Code extension are not yet published, and automatic pull requests on push are not offered on flowss.ai.
  • Studio embed links carry the source in the address, so very large diagrams make links some hosts will not accept.
  • There is no two-way sync with Notion, Confluence, Slack or reference managers: you embed, paste or move files.

Troubleshooting

Message or symptomCauseFix
No cloud projects yet in the binding dialog, with the hint about the StudioThe diagram is not in a cloud projectIn the Studio, Collaborate, then Share this workspace as a live project
Editor access is required to bind a diagram to a source. or Editor access is required.Your role on the project is below editorAsk an owner to make you an editor
Repo must look like "owner/repo" or "owner/repo@branch".The repository field is malformedUse owner/repo, optionally @branch
Source must be an https:// URL. or Only https URLs are supported.The link is not https://Use the host's https link
For now you can import a public file from GitHub (raw or blob URL), a Gist, GitLab, Bitbucket, or Codeberg.The host is not allowedPublish the file on one of those hosts
That URL is a web page, not a file — point me at the raw file (the host's "Raw" button).The link opens a page around the fileUse the Raw link
That URL looks like a binary file — point me at a text/code file.The link is an image, archive or PDFLink to the text source
Couldn't fetch the file (HTTP 404). (or another number)The file is missing, private or movedCheck the link in a private browser window
That doesn't look like a valid URL. or This source needs a file URL.The field is empty or not a web addressPaste the full https:// link
A GitHub source needs a repo like "owner/repo". or That branch, tag or commit name isn't valid.The repository or the part after @ was refused when bindingUse owner/repo or owner/repo@branch
The file is empty.The link returns no contentLink to the file that holds the source
Fetching the file timed out.The host did not answer within 8 secondsTry Check again later
Too many redirects. or The file redirected off the allowed hosts.The link redirects more than three times, or to another hostUse the final raw link on an allowed host
… is larger than 128 KB — too large to scan. Bind a smaller file by URL instead.A compose or package.json file in a repository scan is over 128 KBBind the file by URL instead (files up to 256 KB)
GitHub refused the request for … (HTTP 403 …).GitHub blocked access to the repositoryCheck that the repository is public, or bind a file by URL
The source is larger than 256 KB, and a drift check needs the whole file — bind a smaller file (for example one schema or one spec per binding).The file is over 256 KBSplit it and bind each part to its own figure
… was not found. Only public repositories can be scanned — check the owner, the name and the branch.The repository is private, misspelled, or the branch does not existCheck the name, or bind a public file by URL
No architecture manifests found — the repo needs a docker-compose file or package.json workspaces. (Bind a specific file by URL instead.)Nothing in the repository describes servicesBind a schema, spec or diagram file by URL
… has too many files for a whole-repo scan. Bind its compose file by URL instead.The repository is very largeBind the compose file by URL
GitHub's API rate limit for this service is used up; the check can run again after HH:MM UTC.GitHub is limiting anonymous readsTry again after the time shown
Daily check quota reached (60/day).Your 60 deterministic calls for the day are usedWait for midnight UTC
A 402 message about AI points or your own key when you press Reconcile, Sync now or Bind & syncNo AI on your plan, fewer than 8 points left, or no saved key on StarterCheck by hand, buy points, or save your AI key on the Bring-your-own key card of your account page
The project kept changing while the sync tried to save, so nothing was written. Run the sync again.Collaborators kept saving the project during the reconcilePress Reconcile again when the project is quiet
The bound diagram was edited while the sync ran, …Somebody changed the figure during the reconcilePress Reconcile again
Tracking never turns into In syncThe figure's engine cannot be compared structurally with this sourceUse a structural engine for the figure, or accept tracking-only
A CI job fails with 401The key is wrong, revoked or missing from the secretsRecreate the secret; on fork pull requests secrets are not available
A CI job fails with 429The account's daily allowance is usedBatch requests, check only changed files, or run less often
verify fails although the diagram looks rightNode names differ from the source's namesRename the nodes to match
verify with projectId and figureId reports drift your pull request already fixedWithout inline truth, the bound source is read as published (usually the default branch), not from the pull requestSend the changed file as inline truth, as in Test a pull request's own changes
422 from verify: Engine "…" has no structural parser …The figure is in an engine verify cannot read, or a Mermaid diagram that is not a flowchartVerify a Mermaid flowchart, D2, Graphviz, DBML, Structurizr, ERD, SQL or OpenAPI figure

Something unclear or out of date on this page? Tell us from the Support link in any studio — the flowss team reads every report.

© 2026 Voranox Inc. flowss — Flow Systems Studio. All rights reserved.

This documentation, its text and its examples are protected by copyright. Engine and format names are trademarks of their respective owners — see the terms and copyright and licences.