plugins/memorylane/skills/process-flowchart/SKILL.md
Generate clean, minimal vertical process flowcharts as SVG and JPEG from any workflow, pattern, or step-by-step process. Use this skill whenever the user asks to visualize a process, create a flowchart, diagram a workflow, map out steps, or turn a pattern into a visual. Also trigger when the user says things like "draw this process", "make a flowchart", "visualize these steps", "diagram this workflow", "process map", or references any multi-step procedure they want rendered visually. If a MemoryLane pattern is involved, use this skill to render it. Always produces both SVG and JPEG.
npx skillsauth add deusXmachina-dev/memorylane process-flowchartInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate a clean, minimal swimlane process flowchart from a detected pattern or user-described workflow. Output is both SVG and JPEG.
Determine which process to visualize:
/discover-patterns run), use that as the starting point.Cast a wide net across 30 days:
search_context(query="<process description + key apps>", startTime="30 days ago", endTime="now", limit=30)
Use the pattern name, key apps, and distinguishing actions as search terms. Try 2–3 query variations if the first returns sparse results.
Group returned activities by date proximity — activities within 60 minutes of each other likely belong to the same occurrence. Count distinct occurrences.
For the selected instances, fetch full details:
get_activity_details(ids=["id1", "id2", "id3", ...])
Use OCR text to understand exactly what happens at each step — what apps are used, what actions are taken, and where the process branches.
Privacy: never reproduce passwords, API keys, or personal messages from OCR in the output.
If fewer than 3 instances were found in Step 2:
browse_timeline around each known date with a ±2 hour window:browse_timeline(startTime="<known_date> - 2 hours", endTime="<known_date> + 2 hours", limit=50, sampling="uniform")
Cross-reference all deep-dived instances to build:
Anonymize by default — follow the anonymization rules below. Replace client names, person names, account numbers, and sensitive identifiers with generic labels.
Follow the rendering pipeline below:
pip install weasyprint pdf2image --break-system-packages
client-onboarding.svg and client-onboarding.jpg).Tell the user both files have been saved and show the file paths. If the JPEG conversion fails (missing dependencies), deliver the SVG and explain how to install the missing tools.
The default layout is vertical swimlane columns — one column per app/tool category. Steps are placed in their category's lane and connected by arrows that route across lanes.
MARGIN * 2 + N_LANES * 224 + (N_LANES - 1) * 10), height scales with step count#f1f5f9 at opacity="0.45". No per-lane colors — keep it non-intrusive.Georgia, serif at 13px, fill="#64748b", font-weight 600, centered at the top of each lanestroke="#e2e8f0", stroke-dasharray="4,4", opacity="0.6")rx="14")Helvetica, Arial, sans-serif at 13px bold. Subtitles at 10px regular. Variable badge at 9px italic.This is the single most important layout rule. Text that overflows the card boundary looks broken.
If the source text is longer, shorten it aggressively:
Cards are colored by category to pop against the uniform lane background:
| Category | Card Fill | Title Color | Subtitle Color |
| ------------ | --------- | ----------- | -------------- |
| Video call | #fef9c3 | #713f12 | #a16207 |
| AI notetaker | #d8d0e8 | #1a1a2e | #3b3666 |
| CRM | #d4edda | #14352a | #276749 |
| Task manager | #f5d5cc | #6b2020 | #8b4040 |
| Manual | #fef3c7 | #78350f | #92400e |
| Email | #dbeafe | #1e3a5f | #2563eb |
| Slack | #e8d5f5 | #4a1d6e | #6b3fa0 |
| Database | #cce5ff | #003366 | #0055aa |
| API | #d1fae5 | #064e3b | #047857 |
| Spreadsheet | #fce7f3 | #831843 | #be185d |
| Calendar | #fef9c3 | #713f12 | #a16207 |
| Browser | #e0e7ff | #312e81 | #4338ca |
| File nav | #e0e7ff | #312e81 | #4338ca |
| Accounting | #fef3c7 | #78350f | #92400e |
| Analytics | #d1fae5 | #064e3b | #047857 |
| Design | #ffe4e6 | #881337 | #be123c |
| Code | #f0fdf4 | #14532d | #166534 |
| Other | #f3f4f6 | #1f2937 | #4b5563 |
Unknown categories get a deterministic color from a fallback cycle.
Variable steps (what changes each time the process runs):
#fffbeb2px dashed #f59e0b"varies each month" in 9px italic #92400eDecision nodes (process branches):
<polygon>)#f0f9ff, stroke: 2px solid #38bdf8#0369a1#10b981 solid connector with arrow#94a3b8 dashed connector (stroke-dasharray="6,3")Constant steps (identical every time):
2px solid #cbd5e1<line> with arrowhead marker<path> — down from source, horizontal to target lane, down to target cardMARGIN + 16), then right to rejoin target card's left edge#6b7280<marker> with 8×6px triangle fill #6b7280Bottom of the canvas, three items:
Font: Helvetica 11px, fill #6b7280
Collect all unique categories from the steps (skip None for decision nodes). Each unique category becomes one lane, ordered left-to-right by first appearance in the process.
Build a list of steps, each with:
(lane_id, title, subtitle, is_variable, is_decision)
# Decision nodes use lane_id = None
Enforce text limits before rendering:
title: max 20 charssubtitle: max 28 charsdecision text: max 22 chars& → &, ' → ', < → <Write a Python script that:
<marker> in <defs>#f1f5f9), header text, dashed separatorsKey position helpers:
def lane_x(lane_id):
"""Center-x of a lane."""
idx = lane_index[lane_id]
return MARGIN + idx * (LANE_W + LANE_GAP) + LANE_W // 2
def row_y(row):
"""Top-y of a card at the given row."""
return TOP_PAD + HEADER_H + 20 + row * ROW_H
Use the weasyprint → pdftoppm pipeline. This produces pixel-identical output to the SVG:
import weasyprint, re
from pdf2image import convert_from_path
with open("flowchart.svg") as f:
svg = f.read()
w = int(re.search(r'width="(\d+)"', svg).group(1))
h = int(re.search(r'height="(\d+)"', svg).group(1))
html = f"""<!DOCTYPE html><html><head>
<style>
@page {{ size: {w}px {h}px; margin: 0; }}
body {{ margin: 0; padding: 0; background: white; }}
</style></head><body>{svg}</body></html>"""
weasyprint.HTML(string=html).write_pdf("/tmp/fc.pdf")
images = convert_from_path("/tmp/fc.pdf", dpi=200)
images[0].save("flowchart.jpg", "JPEG", quality=95)
DO NOT use cairosvg or ImageMagick convert for SVG → JPEG. They render fonts with different metrics than browsers and produce mismatched output. The weasyprint → pdftoppm pipeline matches the SVG exactly.
Dependencies (install once if missing):
pip install weasyprint pdf2image --break-system-packages
pdftoppm (from poppler-utils) must also be available — it usually is.
Flowcharts are often shared publicly. By default, always anonymize sensitive information:
The goal: someone who sees the flowchart should understand the process without being able to identify the client.
When the user gives you a process (as bullet points, a paragraph, or a MemoryLane pattern), parse it into the step structure:
Always deliver both files to the user:
{name}.svg — scalable, white background, suitable for embedding{name}.jpg — rasterized at 200 DPI, white background, pixel-matched to SVG via weasyprint pipelinetools
(new) Turn a process analysis into a polished, client-ready report, first an HTML deck you review, then a matching PDF. Use to package an analysis into an exec report or PDF. Shows the deck for approval before making the PDF, and never makes up numbers.
data-ai
(new) Find a person's repeated tasks from their screen activity, and what each one is worth automating, with the time and money saved. Outputs the numbers and data a report is built from, not the visual. Use to analyze processes, mine workflows, or see what is automatable and what it saves. Every figure is labelled and grounded, never made up.
tools
Write step-by-step automation instructions for a workflow, tailored to your tool (Claude, n8n or Zapier). Best run right after discover-patterns or process-analyst.
tools
Summarize what you've been doing in the last 30 minutes.