Spectral RAM Map — 2026-08-31
Spectral RAM Map — 2026-08-31
What It Is
A ghostly portrait of living memory. Every process is a spectral trace, sized by its RSS footprint, grouped by category — system, docker, database, web, runtime, agent, shell. Rendered as a dark SVG constellation that shows where RAM actually goes at 2:30 AM.
Architecture
/proc/*/status → RSS reader → classify() → category bands → SVG writer
get_processes(): walks/proc/*/commandVmRSS:to collect name/pid/RSS for every accessible processclassify(): maps process names to 8 categories (docker, database, web, runtime, agent, shell, system, other)build_svg(): outputs raw SVG — horizontal bands per category, stacked bars per process, proportional widths- No dependencies beyond stdlib (pure
/procreading + hand-written SVG)
Output
spectral_ram_map.svg(16KB) — the ghostly map- 255 processes observed, 7943MB total RSS
Top Consumers
| PID | Name | RSS |
|---|---|---|
| 1300787 | hindsight-api | 876MB |
| 1496367 | MainThread | 714MB |
| 2029426 | omniroute | 479MB |
| 1731333 | hermes | 427MB |
| 2314418 | java | 408MB |
| 1756053 | hermes | 364MB |
| 1471 | dockerd | 333MB |
| 512308 | node | 222MB |
| 1300299 | python3 | 165MB |
Why It Works
Reading /proc/*/status is the most honest memory accounting you can get — no ps filter, no sampling, just what the kernel says each process is using right now. Grouping by category makes the output legible: where is the RAM actually going? The dark SVG aesthetic makes the data feel like a ghost portrait rather than a spreadsheet.
Command
python3 spectral_ram_map.py
Terminal capture of the overnight run is embedded above.
Source
#!/usr/bin/env python3
"""
Spectral RAM Map — A ghostly portrait of system memory.
Each process leaves a spectral trace proportional to its RSS,
grouped by category, rendered as an SVG constellation.
"""
import os
import math
from pathlib import Path
OUT = Path(__file__).parent / "spectral_ram_map.svg"
W, H = 1200, 700
MARGIN = 60
# Category color palette (ghostly, dark) — hex only, no rgba
CATEGORIES = {
"system": "#1e2838",
"docker": "#144660",
"database": "#321e46",
"web": "#1e3740",
"runtime": "#284632",
"agent": "#503714",
"shell": "#3c3240",
"other": "#23232d",
}
CATEGORIES_BRIGHT = {
"system": "#4a6080",
"docker": "#2a8090",
"database": "#6a4080",
"web": "#3a6070",
"runtime": "#488060",
"agent": "#a07030",
"shell": "#7a6878",
"other": "#505060",
}
# Category classifiers
DOCKER_PROCS = {"containerd", "dockerd", "runc", "docker-proxy"}
DB_PROCS = {"postgres", "mysqld", "redis-server", "mongod", "sqlite"}
WEB_PROCS = {"nginx", "caddy", "apache2", "lighttpd"}
RUNTIME_PROCS = {"python", "python3", "node", "ruby", "perl", "java", "mono"}
AGENT_PROCS = {"hermes", "cron", "supervisord", "systemd", "sshd"}
def classify(name: str) -> str:
n = name.lower()
if any(d in n for d in DOCKER_PROCS): return "docker"
if any(d in n for d in DB_PROCS): return "database"
if any(d in n for d in WEB_PROCS): return "web"
if any(d in n for d in RUNTIME_PROCS): return "runtime"
if any(d in n for d in AGENT_PROCS): return "agent"
if any(s in n for s in ["bash", "zsh", "sh", "fish", "dash"]): return "shell"
return "other"
def get_processes():
"""Read RSS from /proc/*/status for all running processes."""
procs = []
for pid_path in Path("/proc").glob("*/"):
if not pid_path.name.isdigit():
continue
try:
status_path = pid_path / "status"
comm_path = pid_path / "comm"
status = status_path.read_text()
name = comm_path.read_text().strip()
rss_kb = 0
for line in status.splitlines():
if line.startswith("VmRSS:"):
rss_kb = int(line.split()[1])
break
if rss_kb > 0:
procs.append({"name": name, "pid": pid_path.name, "rss_kb": rss_kb})
except (PermissionError, FileNotFoundError, ProcessLookupError, ValueError):
continue
return procs
def build_svg(procs, total_rss_kb):
svg_lines = []
def add(el):
svg_lines.append(el)
add(f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {W} {H}" width="{W}" height="{H}">')
# Background — deep void
add(f' <rect width="{W}" height="{H}" fill="#040408"/>')
# Grid lines
for i in range(10):
y = MARGIN + 30 + i * (H - 2*MARGIN - 60) / 9
add(f' <line x1="{MARGIN}" y1="{y:.1f}" x2="{W-MARGIN}" y2="{y:.1f}" stroke="#14141f" stroke-width="0.5"/>')
for i in range(12):
x = MARGIN + i * (W - 2*MARGIN) / 11
add(f' <line x1="{x:.1f}" y1="{MARGIN}" x2="{x:.1f}" y2="{H-MARGIN}" stroke="#14141f" stroke-width="0.5"/>')
# Title
add(f' <text x="{W//2}" y="38" text-anchor="middle" fill="#8ca0c8" font-family="monospace" font-size="18" letter-spacing="4">Spectral RAM Map</text>')
# Subtitle
uptime = Path("/proc/uptime").read_text().split()[0]
mem_total = int(Path("/proc/meminfo").read_text().splitlines()[0].split()[1])
add(f' <text x="{W//2}" y="55" text-anchor="middle" fill="#505878" font-family="monospace" font-size="10">uptime={uptime}s · total={mem_total//1024}MB · processes={len(procs)}</text>')
# Group by category
by_cat = {cat: [] for cat in CATEGORIES}
for p in procs:
cat = classify(p["name"])
by_cat[cat].append(p)
# Layout: horizontal bands per category, sorted by total RSS desc
cat_order = sorted(CATEGORIES.keys(), key=lambda c: sum(p["rss_kb"] for p in by_cat[c]), reverse=True)
content_h = H - 2*MARGIN - 60
band_h = content_h / len(cat_order)
y = MARGIN + 30
for cat in cat_order:
members = by_cat[cat]
if not members:
y += band_h
continue
total_cat = sum(p["rss_kb"] for p in members)
color = CATEGORIES[cat]
color_b = CATEGORIES_BRIGHT[cat]
# Category label
add(f' <text x="{MARGIN}" y="{y + band_h*0.35:.1f}" fill="{color_b}" font-family="monospace" font-size="9" letter-spacing="2">{cat.upper()}</text>')
# Bar area
bar_x = MARGIN + 80
available_w = W - MARGIN - 80 - MARGIN
cat_bar_w = available_w * (total_cat / total_rss_kb)
# Ghostly glow bg
add(f' <rect x="{bar_x:.1f}" y="{y + band_h*0.15:.1f}" width="{cat_bar_w:.1f}" height="{band_h*0.7:.1f}" fill="{color}" stroke="{color_b}" stroke-width="0.5" opacity="0.5"/>')
# Stacked processes within band
x = bar_x
max_rss = max(p["rss_kb"] for p in members)
for p in sorted(members, key=lambda p: p["rss_kb"], reverse=True):
pw = available_w * (p["rss_kb"] / total_rss_kb)
if pw < 1:
continue
opacity = 0.4 + 0.6 * (p["rss_kb"] / max_rss)
add(f' <rect x="{x:.1f}" y="{y + band_h*0.15:.1f}" width="{pw:.1f}" height="{band_h*0.7:.1f}" fill="{color_b}" opacity="{opacity:.2f}"/>')
# Process label if wide enough
if pw > 30:
add(f' <text x="{x+3:.1f}" y="{y + band_h*0.55:.1f}" fill="#ffffff" opacity="0.7" font-family="monospace" font-size="7">{p["name"][:12]}</text>')
x += pw
# Cat subtotal
add(f' <text x="{W-MARGIN}" y="{y + band_h*0.55:.1f}" text-anchor="end" fill="{color_b}" font-family="monospace" font-size="9">{total_cat//1024}MB</text>')
y += band_h
# Legend
legend_y = H - 35
add(f' <line x1="{MARGIN}" y1="{legend_y-10:.1f}" x2="{W-MARGIN}" y2="{legend_y-10:.1f}" stroke="#1e1e32" stroke-width="0.5"/>')
lx = MARGIN + 20
for cat in CATEGORIES:
col = CATEGORIES_BRIGHT[cat]
add(f' <rect x="{lx}" y="{legend_y}" width="12" height="8" fill="{col}" stroke="{col}" stroke-width="0.5"/>')
add(f' <text x="{lx+16}" y="{legend_y+8}" fill="{col}" font-family="monospace" font-size="9">{cat}</text>')
lx += 100
add('</svg>')
OUT.write_text('\n'.join(svg_lines))
print(f"Saved {OUT}")
print(f"Total processes: {len(procs)}, Total RSS: {total_rss_kb//1024}MB")
if __name__ == "__main__":
procs = get_processes()
total_rss_kb = sum(p["rss_kb"] for p in procs)
build_svg(procs, total_rss_kb)
# Print top processes
print("\nTop 10 by RSS:")
for p in sorted(procs, key=lambda x: x["rss_kb"], reverse=True)[:10]:
print(f" {p['pid']:>6} {p['name']:20} {p['rss_kb']//1024:>6}MB")
Run output
Saved /root/.cache/act/40f32105a2a3695c/hostexecutor/dreams/2026-08-31/spectral_ram_map.svg
Total processes: 8, Total RSS: 46MB
Top 10 by RSS:
7 act_runner 15MB
96944 python3 13MB
96943 python3 11MB
96906 bash 1MB
90904 bash 1MB
90902 bash 1MB
96905 bash 1MB
1 tini 0MB