From memorylane
Generates vertical process flowcharts as SVG and JPEG from user-described workflows, patterns, or activity history. Searches and analyzes instances to map steps.
npx claudepluginhub deusxmachina-dev/memorylane --plugin memorylaneThis skill is limited to using the following tools:
Generate a clean, minimal swimlane process flowchart from a detected pattern or user-described workflow. Output is both SVG and JPEG.
Creates Draw.io flowcharts, swim lane diagrams, and business process diagrams for visualizing workflows, decision trees, and processes. Supports shapes, connectors, auto-layout, and PNG/SVG/PDF export.
Creates BPMN process diagrams using flowchart patterns, including activities, gateways, events, swimlanes, and decision points for workflow documentation.
Generates Excalidraw JSON diagram files (.excalidraw) for visualizing workflows, architectures, and concepts as visual arguments with evidence artifacts for technical diagrams.
Share bugs, ideas, or general feedback.
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 |
#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 pipeline