omnigraffle — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited omnigraffle (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Generate native .graffle files that open directly in OmniGraffle 7+ on macOS and iOS.
OmniGraffle files are ZIP archives containing a binary Apple plist (data.plist) and a preview JPEG. This skill uses Python's plistlib to assemble the document structure and zipfile to package it. The output matches OmniGraffle 7's native format (GraphDocumentVersion 16, zipped).
Before generating any file, copy the builder scripts to your working directory:
cp -r /path/to/this/skill/src/ /home/claude/omnigraffle-src/Then import:
import sys
sys.path.insert(0, '/home/claude/omnigraffle-scripts')
from src.graffle_builder import GraffleBuilder, create_network_diagram, COLORSAsk or infer:
For full control over every element:
from src.graffle_builder import GraffleBuilder
b = GraffleBuilder(title="My Diagram", creator="User Name")
# Clear default layer and add custom ones
b._layers = []
l_hw = b.add_layer("hardware")
l_net = b.add_layer("network")
# Add shapes (returns shape ID for connections)
srv = b.add_shape(x=100, y=100, w=120, h=40,
text="Server1", fill_color="blue",
layer=l_hw, name="Server1")
sw = b.add_shape(x=300, y=100, w=120, h=40,
text="Switch", fill_color="green",
layer=l_net, name="Switch")
# Connect shapes
b.add_line(from_id=srv, to_id=sw, color="blue", width=2.0,
layer=l_net, head_arrow="FilledArrow")
# Add floating text labels
b.add_text_label(100, 60, "Rack 1", font_size=14,
text_color=(0,0,0), bold=True)
# Group shapes together
group_id = b.add_group([srv, sw], layer=l_hw)
# Save
b.save("/mnt/user-data/outputs/diagram.graffle")For quick network/architecture diagrams from structured data:
from src.graffle_builder import create_network_diagram
builder = create_network_diagram(
title="Data Center Network",
layers=["servers", "switches", "storage"],
nodes=[
{"name": "Web-1", "x": 100, "y": 50, "color": "blue"},
{"name": "Web-2", "x": 250, "y": 50, "color": "blue"},
{"name": "LB", "x": 175, "y": 150, "w": 140, "color": "green"},
{"name": "DB", "x": 175, "y": 250, "color": "red", "layer": 2},
],
connections=[
{"from_name": "Web-1", "to_name": "LB", "color": "yellow", "width": 2},
{"from_name": "Web-2", "to_name": "LB", "color": "yellow", "width": 2},
{"from_name": "LB", "to_name": "DB", "arrow": True, "width": 2},
],
)
builder.save("/mnt/user-data/outputs/network.graffle")| Param | Default | Values |
|---|---|---|
| title | "Canvas 1" | Canvas name |
| creator | "Claude" | Author metadata |
| orientation | "landscape" | "landscape" or "portrait" |
| paper_size | "A4" | "A4", "letter", "A3" |
| Param | Default | Notes |
|---|---|---|
| text | "" | Label inside shape |
| fill_color | None | RGB (0-1) tuple or color name string |
| text_color | (255,255,255) | RGB (0-255) |
| font_size | 10 | Points |
| font | "HelveticaNeue" | Font name |
| layer | 0 | Layer index |
| name | None | Shape identifier |
| rotation | None | Degrees (e.g., 90.0) |
| magnets | True | Connection snap points |
| stroke | False | Draw border |
| stroke_color | None | Border RGB (0-1) |
| stroke_width | 1.0 | Border width |
| bold | False | Bold text |
| fit_text | False | Auto-resize to fit text |
Convenience for borderless/fillless text. Same params as add_shape minus fill/stroke.
| Param | Default | Notes |
|---|---|---|
| from_id/to_id | None | Shape IDs for connected lines |
| from_point/to_point | None | (x,y) for unconnected endpoints |
| color | None | RGB (0-1) or color name |
| width | 1.0 | Line width |
| layer | 0 | Layer index |
| head_arrow | None | "FilledArrow" for arrowhead |
| dashed | False | Dashed line style |
For multi-segment paths. points is a list of (x,y) tuples.
Groups existing shapes. Removes them from main list and nests under group.
Writes the .graffle ZIP file.
Use these strings for fill_color or color parameters:
blue, red, green, yellow, orange, purple, cyan, pink, brown, white, lightgray, darkgray, black, lightblue, lightgreen, lightcyan, lightpink, lightyellow, darkblue, darkgreen, darkred
Or pass any RGB tuple like (0.5, 0.8, 0.2) in the 0-1 range.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.