diff --git a/assets/readme/cognitum.svg b/assets/readme/cognitum.svg
index c5a7615ae..ac939dbd8 100644
--- a/assets/readme/cognitum.svg
+++ b/assets/readme/cognitum.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/feature-agents.svg b/assets/readme/feature-agents.svg
index 7cd6197bc..a1cc7cec7 100644
--- a/assets/readme/feature-agents.svg
+++ b/assets/readme/feature-agents.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/feature-automation.svg b/assets/readme/feature-automation.svg
index 8104d37ab..90599c6d6 100644
--- a/assets/readme/feature-automation.svg
+++ b/assets/readme/feature-automation.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/feature-edge.svg b/assets/readme/feature-edge.svg
index d3c589cc1..b0221bfbe 100644
--- a/assets/readme/feature-edge.svg
+++ b/assets/readme/feature-edge.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/feature-pose.svg b/assets/readme/feature-pose.svg
index eeaa9cb20..d1c606962 100644
--- a/assets/readme/feature-pose.svg
+++ b/assets/readme/feature-pose.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/feature-presence.svg b/assets/readme/feature-presence.svg
index 910d9d0d8..5d72b0028 100644
--- a/assets/readme/feature-presence.svg
+++ b/assets/readme/feature-presence.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/feature-vitals.svg b/assets/readme/feature-vitals.svg
index c2cb41c03..ff2eab093 100644
--- a/assets/readme/feature-vitals.svg
+++ b/assets/readme/feature-vitals.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/header-docs.svg b/assets/readme/header-docs.svg
index 50e9885e7..63d2989cd 100644
--- a/assets/readme/header-docs.svg
+++ b/assets/readme/header-docs.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/header-edge.svg b/assets/readme/header-edge.svg
index 1c989c9f9..53e4a07e2 100644
--- a/assets/readme/header-edge.svg
+++ b/assets/readme/header-edge.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/header-evidence.svg b/assets/readme/header-evidence.svg
index 2b8a102b0..ea4c6fc3b 100644
--- a/assets/readme/header-evidence.svg
+++ b/assets/readme/header-evidence.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/header-features.svg b/assets/readme/header-features.svg
index 8eb839430..f2b26dc39 100644
--- a/assets/readme/header-features.svg
+++ b/assets/readme/header-features.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/header-learning.svg b/assets/readme/header-learning.svg
index ee40ae04e..6e87da6d8 100644
--- a/assets/readme/header-learning.svg
+++ b/assets/readme/header-learning.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/hero.svg b/assets/readme/hero.svg
index 51e0d1d44..22e95393e 100644
--- a/assets/readme/hero.svg
+++ b/assets/readme/hero.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/nav-agents.svg b/assets/readme/nav-agents.svg
index 5b427af96..baee746a7 100644
--- a/assets/readme/nav-agents.svg
+++ b/assets/readme/nav-agents.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/nav-hardware.svg b/assets/readme/nav-hardware.svg
index ab83aa8ad..3dba35673 100644
--- a/assets/readme/nav-hardware.svg
+++ b/assets/readme/nav-hardware.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/nav-home.svg b/assets/readme/nav-home.svg
index 1ef980672..92d79328c 100644
--- a/assets/readme/nav-home.svg
+++ b/assets/readme/nav-home.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/nav-models.svg b/assets/readme/nav-models.svg
index 41f538a74..bfd2e3f63 100644
--- a/assets/readme/nav-models.svg
+++ b/assets/readme/nav-models.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/nav-seed.svg b/assets/readme/nav-seed.svg
index 0788f4381..4e665f0bc 100644
--- a/assets/readme/nav-seed.svg
+++ b/assets/readme/nav-seed.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/nav-start.svg b/assets/readme/nav-start.svg
index 2e911f115..ae9588436 100644
--- a/assets/readme/nav-start.svg
+++ b/assets/readme/nav-start.svg
@@ -1 +1,19 @@
-
+
diff --git a/assets/readme/overview.svg b/assets/readme/overview.svg
index 27d98d2b8..b5957733f 100644
--- a/assets/readme/overview.svg
+++ b/assets/readme/overview.svg
@@ -1 +1,19 @@
-
+
diff --git a/docs/readme-visual-system.md b/docs/readme-visual-system.md
index ad6fcd740..5a6c2f16c 100644
--- a/docs/readme-visual-system.md
+++ b/docs/readme-visual-system.md
@@ -1,6 +1,12 @@
# RuView README visual system
-The README uses a Cognitum-inspired palette: midnight backgrounds, cyan gradients, wireframe geometry and restrained signal motion. It includes a hero, six feature cards, six navigation icons, an overview, five chapter headings and a Cognitum destination banner.
+The README uses a Cognitum-inspired palette: midnight backgrounds, cyan gradients,
+layered isometric geometry, moving scan planes, orbital markers and floating
+icons. It includes a hero, six feature cards, six navigation icons, an overview,
+five chapter headings and a Cognitum destination banner. Headlines use a heavier
+Avenir Next / Segoe UI / Helvetica stack, with tighter spacing and a dedicated
+system monospace stack for labels. Fonts remain local fallbacks so the images
+also render without a network connection.
## Rebuild and check
@@ -27,7 +33,14 @@ The committed SVGs are the deployment artifacts. The manifest in
GitHub renders SVGs as images, so image-internal links are not used. Each SVG has an outer Markdown or HTML link in the README. Each card and navigation icon also has a plain text link for narrow screens and assistive technology. Source headings remain intact so existing README anchors still work.
-Animation uses CSS only. All copy and essential geometry are visible without animation, JavaScript, remote fonts or remote images. `prefers-reduced-motion` disables decorative movement. The original GIF remains available in an expandable demo section; the existing ruOS promotion remains linked.
+Animation uses CSS only. Depth is projected directly into SVG geometry rather
+than relying on a WebGL canvas or CSS perspective. Translation is applied to
+inner groups so it cannot overwrite the outer icon placement. Orbital motion
+uses an explicit transform origin; scan planes sweep the wireframe volumes.
+All copy and essential geometry are visible without animation, JavaScript,
+remote fonts or remote images. `prefers-reduced-motion` disables decorative
+movement. The original GIF remains at the top; the existing ruOS promotion
+remains linked. Existing asset dimensions and README links are preserved.
## Content boundaries
diff --git a/scripts/render-readme-visuals.py b/scripts/render-readme-visuals.py
index e37a9c58b..16ae8b12f 100644
--- a/scripts/render-readme-visuals.py
+++ b/scripts/render-readme-visuals.py
@@ -7,7 +7,8 @@ from readme_visuals_xml import parse_svg
ROOT=Path(__file__).resolve().parents[1];OUT=ROOT/'assets/readme';OUT.mkdir(parents=True,exist_ok=True)
C='#72eee0';BLUE='#70b6ff';INK='#041117';WHITE='#ecfafb';MUTED='#9abac5'
def text(x,y,value,size=16,color=MUTED,anchor='start',extra=''):
- return f'{escape(value)}'
+ weight='font-weight="650" letter-spacing="-0.6"' if size>=25 else 'font-weight="500"'
+ return f'{escape(value)}'
def path(d,color=C,width=1.5,extra=''):
return f''
def circle(x,y,r,color=C,extra=''):
@@ -42,9 +43,45 @@ def icon(kind,x,y,scale=1):
s+=path('M-15 1L-5 11L17 -12',BLUE,2,extra='class="trace"')
else:
for j in range(3):s+=path(f'M-38 {j*14-20}L0 {j*14-38}L38 {j*14-20}L0 {j*14-2}Z',extra='class="breathe"')
+ base=''
+ base+=path('M-43 48L0 27L43 48L0 69Z','#285c68',1)
+ return f'{base}{s}'
+
+def spatial(x,y,scale=1):
+ """Projected geometry gives depth without scripts or CSS 3D dependencies."""
+ s=''
+ s+=''
+ s+=''
+ for px,py in [(-40,6),(0,-15),(40,6),(-20,30),(20,30),(0,49)]:
+ s+=circle(px,py,2,BLUE,extra='fill="#70b6ff" class="spark"')
+ s+=''
return f'{s}'
-def frame(w,h,title,desc,body):
+def _frame(w,h,title,desc,body):
return f''''''
+MOTION=''''''
+
+def frame(w,h,title,desc,body):
+ value=_frame(w,h,title,desc,body)
+ return value[:value.index('')+8:]
+
manifest=[]
def save(name,w,h,title,desc,body,target):
s=frame(w,h,title,desc,body);raw=(s+'\n').encode('utf-8');parse_svg(raw);(OUT/(name+'.svg')).write_bytes(raw);manifest.append({'file':'assets/readme/'+name+'.svg','title':title,'target':target,'width':w,'height':h})
@@ -55,7 +92,11 @@ s+=text(49,419,'RF SENSING / EDGE MODELS / LOCAL ACTION',11,MUTED,extra='cla
s+=''
for i in range(9):s+=path(f'M{750+i*40} 282L{610+i*80} 443','#12343d',1)
for y in [306,336,372,418]:s+=path(f'M680 {y}H1168','#12343d',1)
-s+=path('M803 157L1008 106L1137 177L930 236ZM803 157V314L930 391L1137 324V177M930 236V391M1008 106V268L803 314M1008 268L1137 324','#4b9ba4',1.5)
+s+=''+path('M803 157L1008 106L1137 177L930 236ZM803 157V314L930 391L1137 324V177M930 236V391M1008 106V268L803 314M1008 268L1137 324','#4b9ba4',1.5)+''
+s+=''
+s+=''
+for i in range(24):
+ s+=circle(849+(i%6)*44,198+(i//6)*35,1.7,BLUE,extra=f'fill="#70b6ff" class="spark" style="animation-delay:-{i%7/2}s"')
s+=icon('presence',976,265,1.35)+icon('edge',780,349,.7)
for i in range(4):s+=path(f'M{794+i*12} {333-i*9}Q{830+i*25} {245-i*24} {896+i*29} {207-i*3}',C,1.4,extra=f'class="flow" style="animation-delay:-{i}s" opacity="{.8-i*.12}"')
for x,y in [(803,157),(1008,106),(1137,177),(930,236),(930,391),(803,314),(1137,324)]:s+=circle(x,y,3,extra='fill="#72eee0" class="breathe"')
@@ -68,14 +109,14 @@ for k,label,target in nav:save('nav-'+k,180,116,label,'Open '+label+'. Animated
cards=[('presence','01','Presence & motion','Explore changes in room occupancy.','Inspect motion features from CSI.','SENSING GUIDE','docs/user-guide.md'),('vitals','02','Breathing & vital signals','Inspect phase-derived signal trends.','Validate estimates on your hardware.','SIGNAL PIPELINE','v2/crates/wifi-densepose-signal/README.md'),('pose','03','Pose research','Train and compare body keypoints.','Live accuracy differs from benchmarks.','READ THE EVIDENCE','docs/benchmarks/pose-estimation-cog.md'),('edge','04','Edge sensor mesh','Provision, capture and calibrate.','Explore ESP32 firmware and runbooks.','HARDWARE GUIDE','firmware/esp32-csi-node/README.md'),('automation','05','Local automation','Connect rooms to your smart home.','Home Assistant, MQTT and Matter.','INTEGRATION GUIDE','docs/integrations/home-assistant.md'),('agents','06','A guided AI operator','Source-cited setup and verification.','CLI, MCP and agent workflows.','TOOLKIT GUIDE','harness/ruview/README.md')]
for k,num,title,l1,l2,cta,target in cards:
s=text(30,39,'RUVIEW / '+num,11,C,extra='class="mono"')+text(30,94,title,29,WHITE)+text(30,136,l1,16)+text(30,164,l2,16)
- s+=''+icon(k,474,168,.83)+path('M30 204H550','#245360',1)+path('M30 204H550',C,1,extra='class="flow" opacity=".5"')
+ s+=''+spatial(480,161,.53)+icon(k,474,155,.68)+path('M30 204H550','#245360',1)+path('M30 204H550',C,1,extra='class="flow" opacity=".5"')
s+=text(30,245,cta,12,C,extra='class="mono"')+path('M510 239H540M532 231L540 239L532 247',C,1.5)
save('feature-'+k,580,276,title,l1+' '+l2+' Conceptual animation; follow the linked source for capability limits.',s,target)
# Overview uses three clearly labelled stages rather than fabricated telemetry.
s=text(36,44,'SIGNAL TO CONTEXT',12,C,extra='class="mono"')+text(36,89,'A sensing loop you can inspect.',34,WHITE)
for i,(label,sub,kind,tail) in enumerate([('Capture RF','CSI from supported hardware','signal','Provision and calibrate'),('Extract context','Signal processing and models','models','Compare against real data'),('Act locally','Events, APIs and integrations','automation','Apply rules and review outputs')]):
x=36+i*396;s+=f''
- s+=text(x+24,153,f'0{i+1}',12,C)+text(x+24,188,label,26,WHITE)+text(x+24,216,sub,15)+icon(kind,x+269,281,.62)+text(x+24,311,tail,13)
+ s+=text(x+24,153,f'0{i+1}',12,C)+text(x+24,188,label,26,WHITE)+text(x+24,216,sub,15)+spatial(x+269,278,.35)+icon(kind,x+269,270,.5)+text(x+24,311,tail,13)
if i<2:s+=path(f'M{x+344} 229H{x+384}M{x+376} 221L{x+384} 229L{x+376} 237',C,2,extra='class="flow"')
s+=text(36,373,'CONCEPTUAL PIPELINE / HARDWARE AND ENVIRONMENT VALIDATION MATTER',11,MUTED,extra='class="mono"')
save('overview',1200,396,'RuView sensing overview','Conceptual sequence: capture RF, extract context, act locally. Links to architecture and user documentation.',s,'docs/user-guide.md')
@@ -83,13 +124,13 @@ save('overview',1200,396,'RuView sensing overview','Conceptual sequence: capture
headers=[('features','Explore the capabilities','SENSING / MODELS / AUTOMATION','presence','docs/user-guide.md'),('edge','Intelligence at the edge','SENSORS / FIRMWARE / MODULES','edge','firmware/esp32-csi-node/README.md'),('learning','From recordings to models','CAPTURE / TRAIN / EVALUATE','models','docs/user-guide.md'),('evidence','Evidence before accuracy claims','BENCHMARKS / REPRODUCERS / LIMITS','evidence','docs/benchmarks/pose-estimation-cog.md'),('docs','Choose your next step','GUIDES / HARDWARE / INTEGRATIONS','agents','docs/user-guide.md')]
for k,title,sub,kind,target in headers:
s=icon(kind,76,75,.75)+text(140,63,title,34,WHITE)+text(142,99,sub,12,C,extra='class="mono"')
- for i in range(4):s+=path(f'M865 {44+i*17}Q960 {10+i*28} 1124 {52+i*17}',C,1,extra=f'class="flow" opacity="{.65-i*.1}"')
+ s+=spatial(1012,84,.55)
s+=path('M1140 70H1160M1152 62L1160 70L1152 78',C,2)
save('header-'+k,1200,148,title,'Animated section heading. '+sub,s,target)
# Brand destination; original ruOS promotion remains in the README.
s=text(44,42,'COGNITUM ONE',12,C,extra='class="mono"')+text(44,99,'Ambient Intelligence.',42,WHITE)+text(44,147,'At the edge of the physical world.',25,C)+text(44,190,'Explore the platform behind the ecosystem.',16)
s+=''+text(65,254,'Explore Cognitum',18,INK)+path('M263 247H284M277 240L284 247L277 254',INK,2)
-s+=''+icon('seed',945,150,2.4)
+s+=''+spatial(945,173,1.55)+icon('seed',945,145,1.65)
for j in range(3):s+=f''
save('cognitum',1200,304,'Explore Cognitum One','Ambient Intelligence at the edge of the physical world. Open cognitum.one.',s,'https://cognitum.one')
(OUT/'manifest.json').write_bytes((json.dumps({'schema_version':1,'style':'Cognitum cyan on midnight','motion':'Decorative CSS; prefers-reduced-motion supported; no script or remote dependencies','assets':manifest},indent=2)+'\n').encode('utf-8'))