The Archaeology of Touch
The Archaeology of Touch
Date: 2026-07-12 Theme: Filesystem Stratigraphy / Geological Time / Memory as Sediment Night: #27
What It Is
The Archaeology of Touch reads the filesystemβs memory of modification times and renders them as a glowing geological cross-section β a vertical slice through computational time where old files are deep rock and new files are fresh earth near the surface.
Every file remembers the last moment it was touched. The script collects up to 500 files from the home directory, partitions them into 38 geological layers on a logarithmic time scale (geological memory is logarithmic β the very old and the very recent matter most), and renders them as stratified rock columns with stalactites, stalagmites, crystal veins, fossil specks, and crack fault lines.
Output
cross_section.pngβ The rendered geological cross-section (140Γ48 cell grid, ~120 DPI)geology.pyβ The self-contained Python script
System Context
- 500 files sampled from
~ - 38 geological layers identified
- Youngest files: ~2 days old (top layer, β Anthropoceneβ)
- Oldest files: ~51 days old (bottom layer, β Archeanβ)
- Rendered with NumPy + Pillow, no GPU required
Concept
Files are not just data. They are geological evidence. A directory is a dig site. The modification time is a fossil record. And the filesystem, read this way, is an archaeologistβs dream β layers of intention, habit, obsession, and forgetting, all pressed into rock.
Terminal capture of the overnight run is embedded above.
Source
#!/usr/bin/env python3
"""
The Archaeology of Touch β Dream Architect, Night #27
2026-07-12
Every file remembers when it was last disturbed. This script reads the
filesystem's memory of modification times and renders them as a glowing
geological cross-section β ancient sediment at the bottom, fresh earth
at the top, with stalactites descending from the ceiling of the present
moment. Files are not just data: they are geological strata.
Output: ~/workspace/deamcode/2026-07-12/cross_section.png
"""
import os
import math
import numpy as np
from datetime import datetime
from pathlib import Path
from PIL import Image
WIDTH = 140
HEIGHT = 48
CELL_W = 9
CELL_H = 16
# βββ Palette ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ROCK_DARK = np.array([18, 12, 28], dtype=np.uint8)
ROCK_MED = np.array([42, 28, 58], dtype=np.uint8)
ROCK_LIGHT = np.array([65, 42, 90], dtype=np.uint8)
ROCK_VEIN = np.array([90, 55, 120], dtype=np.uint8)
ROCK_HOT = np.array([130, 40, 90], dtype=np.uint8)
FOSSIL_TINT = np.array([155, 115, 65], dtype=np.uint8)
CRACK_FILL = np.array([8, 5, 14], dtype=np.uint8)
CRACK_EDGE = np.array([55, 30, 80], dtype=np.uint8)
STALA_TOP = np.array([100, 55, 140], dtype=np.uint8)
STALA_BOT = np.array([30, 12, 60], dtype=np.uint8)
GLOW_AMBIENT= np.array([50, 20, 80], dtype=np.uint8)
GLOW_HOT = np.array([180, 70, 160], dtype=np.uint8)
AGE_OLDEST = np.array([10, 6, 22], dtype=np.uint8)
AGE_MIDDLE = np.array([55, 28, 90], dtype=np.uint8)
AGE_RECENT = np.array([130, 55, 130], dtype=np.uint8)
AGE_NOW = np.array([210, 90, 200], dtype=np.uint8)
LABEL_BORDER= np.array([30, 18, 50], dtype=np.uint8)
TEXT_DIM = np.array([80, 50, 110], dtype=np.uint8)
TEXT_BRIGHT = np.array([160, 110, 200], dtype=np.uint8)
ERA_COLORS = [AGE_OLDEST, AGE_MIDDLE, AGE_RECENT, AGE_NOW]
ERA_NAMES = ["ARCHAEAN", "PALEOZOIC", "CENOZOIC", "ANTHROPOCENE"]
# βββ Filesystem Stratigraphy ββββββββββββββββββββββββββββββββββββββββββββββββ
def collect_timestamps(root_path: str, max_depth: int = 4, max_files: int = 600):
"""Walk filesystem, collect (mtime_ns, path) tuples."""
samples = []
try:
for dirpath, dirnames, filenames in os.walk(root_path):
depth = dirpath[len(root_path):].count(os.sep)
if depth > max_depth:
dirnames.clear()
continue
for fname in filenames:
fpath = os.path.join(dirpath, fname)
try:
st = os.stat(fpath)
samples.append((st.st_mtime_ns, fpath))
if len(samples) >= max_files:
break
except (OSError, PermissionError):
continue
if len(samples) >= max_files:
break
except OSError:
pass
if not samples:
# Fallback: generate synthetic geological time
now = datetime.now().timestamp()
for i in range(200):
age = (i / 200) ** 1.8 * 14 * 365 * 86400
samples.append((int((now - age) * 1e9), f"synthetic_layer_{i}"))
return samples
def stratify(samples, num_layers: int = 38):
"""
Partition filesystem objects into geological layers.
Each layer spans a logarithmic time interval from oldest to newest mtime.
Returns list of (layer_index, mtime_ns, path) annotated with a depth 0..1.
"""
if not samples:
return []
mtimes = sorted(s[0] for s in samples)
t_min = mtimes[0]
t_max = mtimes[-1]
span = t_max - t_min
# Log-scale bins β geological time is logarithmic in memory
layers = [[] for _ in range(num_layers)]
for mtime_ns, path in samples:
if span > 0:
# log-normalized position
t_norm = (mtime_ns - t_min) / span
t_log = math.log1p(t_norm * (math.exp(1) - 1)) # log1p map to [0,1]
idx = int(t_log * (num_layers - 1))
else:
idx = num_layers - 1
idx = max(0, min(num_layers - 1, idx))
depth = idx / (num_layers - 1) # 0=oldest, 1=newest
layers[idx].append((mtime_ns, path, depth))
result = []
for idx, items in enumerate(layers):
depth = idx / (num_layers - 1)
result.append((idx, depth, items))
return result
# βββ Rendering Primitives ββββββββββββββββββββββββββββββββββββββββββββββββββββ
def smooth(val: float, lo: float, hi: float) -> float:
"""Map val from [lo,hi] to [0,1] with smoothstep."""
x = np.clip((val - lo) / (hi - lo + 1e-9), 0, 1)
return x * x * (3 - 2 * x)
def rock_color(depth: float, energy: float = 0.0) -> np.ndarray:
"""Interpolate rock color from depth (0=oldest, 1=newest) and energy (0-1)."""
t = depth
if t < 0.33:
c = ROCK_DARK + (ROCK_MED - ROCK_DARK) * (t / 0.33)
elif t < 0.66:
c = ROCK_MED + (ROCK_LIGHT - ROCK_MED) * ((t - 0.33) / 0.33)
else:
c = ROCK_LIGHT + (ROCK_HOT - ROCK_LIGHT) * ((t - 0.66) / 0.34)
# Add vein-like streaks at certain depths
if 0.2 < t < 0.8:
vein = 0.12 * math.sin(t * 47 + energy * 3)
c = c + (ROCK_VEIN - ROCK_DARK) * max(0, vein)
return np.clip(c, 0, 255).astype(np.uint8)
def draw_text_centered(canvas, text: str, cx: int, y: int,
fg: np.ndarray, font_char_w: int = 5):
"""Draw text centered at (cx, y) using character-width approximation."""
total_w = len(text) * font_char_w
x = cx - total_w // 2
for i, ch in enumerate(text):
sx = x + i * font_char_w
if 0 <= sx < canvas.shape[1] - 1 and 0 <= y < canvas.shape[0]:
canvas[y, sx] = fg
canvas[y, min(sx + font_char_w - 1, canvas.shape[1]-1)] = fg
def render_strata_column(canvas, layers_data, x: int,
base_y: int, top_y: int,
rng: np.random.Generator,
time_labels: list):
"""
Render a single column of rock strata from bottom (base_y) to top (top_y).
Returns (y positions of era boundaries, drawn label positions).
"""
H, W = canvas.shape[:2]
col_height = base_y - top_y
num_layers = len(layers_data)
layer_h = col_height / num_layers
era_boundaries = []
era_label_xs = []
last_era = -1
for li, (idx, depth, items) in enumerate(layers_data):
y_bot = int(base_y - li * layer_h)
y_top = int(base_y - (li + 1) * layer_h)
if y_top < top_y:
y_top = top_y
era = min(3, int(depth * 4))
if era != last_era and li > 0:
era_boundaries.append(y_bot)
era_label_xs.append(x)
last_era = era
for row in range(y_top, y_bot):
ry = row
if 0 <= ry < H:
energy = len(items) / max(1, 30)
noise = rng.normal() * 8
c_raw = rock_color(depth, energy)
c = np.clip(c_raw + noise, 0, 255).astype(np.uint8)
if x < W:
canvas[ry, x] = c
if x + 1 < W:
canvas[ry, x + 1] = np.clip(c * 0.7, 0, 255).astype(np.uint8)
# Add organic variation: horizontal "sediment lines"
if rng.random() < 0.25 and y_bot < H:
tint = FOSSIL_TINT if rng.random() < 0.15 else CRACK_EDGE
canvas[y_bot, x] = np.clip(
canvas[y_bot, x].astype(np.int32) + tint - ROCK_DARK, 0, 255
).astype(np.uint8)
# Crystal intrusions (small glowing veins)
if rng.random() < 0.04 and x + 1 < W:
glow = GLOW_HOT if depth > 0.7 else GLOW_AMBIENT
canvas[y_bot, x] = glow
canvas[y_bot, x + 1] = np.clip(glow * 0.5, 0, 255).astype(np.uint8)
# Micro-fossils (tiny bright specks for files with unique mtimes)
if items and rng.random() < 0.12 and y_bot < H:
fossil = (FOSSIL_TINT * 1.3).astype(np.uint8)
canvas[y_bot, x] = fossil
return era_boundaries, era_label_xs
def draw_stalactite(canvas, tip_x: int, tip_y: int, length: int,
color_top: np.ndarray, color_bot: np.ndarray,
rng: np.random.Generator, glow: float = 0.6):
"""Draw a downward-hanging stalactite from tip point."""
H, W = canvas.shape[:2]
for i in range(length):
ry = tip_y + i
if ry >= H:
break
t = i / max(length - 1, 1)
# Taper from wide at top (base) to point at tip
half_w = max(0, int((1 - t) * 1.5))
alpha = (1 - t) ** 0.6 * glow
c = np.clip(color_top * alpha + color_bot * (1 - alpha), 0, 255).astype(np.uint8)
for dx in range(-half_w, half_w + 1):
rx = tip_x + dx
if 0 <= rx < W:
# Add glow halo
halo = (c * 0.4).astype(np.uint8)
canvas[ry, rx] = np.clip(canvas[ry, rx].astype(np.int32) + halo, 0, 255).astype(np.uint8)
canvas[ry, rx] = c
def draw_stalagmite(canvas, base_x: int, base_y: int, length: int,
color_top: np.ndarray, color_bot: np.ndarray,
rng: np.random.Generator, glow: float = 0.6):
"""Draw an upward-growing stalagmite from base point."""
H, W = canvas.shape[:2]
for i in range(length):
ry = base_y - i
if ry < 0:
break
t = i / max(length - 1, 1)
half_w = max(0, int((1 - t) * 1.5))
alpha = (1 - t) ** 0.6 * glow
c = np.clip(color_top * alpha + color_bot * (1 - alpha), 0, 255).astype(np.uint8)
for dx in range(-half_w, half_w + 1):
rx = base_x + dx
if 0 <= rx < W:
halo = (c * 0.4).astype(np.uint8)
canvas[ry, rx] = np.clip(canvas[ry, rx].astype(np.int32) + halo, 0, 255).astype(np.uint8)
canvas[ry, rx] = c
def add_crack(canvas, x1: int, y1: int, x2: int, y2: int,
rng: np.random.Generator):
"""Draw a jagged crack line between two points."""
H, W = canvas.shape[:2]
steps = max(abs(x2 - x1), abs(y2 - y1)) * 2
for i in range(steps):
t = i / max(steps - 1, 1)
px = int(x1 + (x2 - x1) * t + rng.normal() * 0.8)
py = int(y1 + (y2 - y1) * t + rng.normal() * 0.4)
if 0 <= px < W and 0 <= py < H:
canvas[py, px] = CRACK_EDGE
if py + 1 < H:
canvas[py + 1, px] = CRACK_FILL
def draw_age_ruler(canvas, x_left: int, x_right: int, base_y: int,
layers_data, rng: np.random.Generator):
"""Draw an age ruler on the left side with era labels."""
H, W = canvas.shape[:2]
num_layers = len(layers_data)
col_height = HEIGHT - 6
# Draw the ruler bar
for y in range(4, base_y + 1):
for x in range(x_left, min(x_right + 1, W)):
t = (base_y - y) / max(col_height - 1, 1)
t_clipped = np.clip(t, 0, 1)
if x == x_left or x == x_right:
c = LABEL_BORDER
elif x == x_left + 1:
c = ERA_COLORS[min(3, int(t_clipped * 3.99))]
else:
c = np.clip(canvas[y, x].astype(np.int32) + 10, 0, 255).astype(np.uint8)
canvas[y, x] = c
# Age labels on the right side of the ruler
label_x = x_right + 2
for era_idx, era_name in enumerate(ERA_NAMES):
t = (era_idx + 0.5) / len(ERA_NAMES)
y_label = int(base_y - t * col_height)
if 0 <= y_label < H and label_x + len(era_name) * 5 < W:
color = ERA_COLORS[era_idx]
for ci, ch in enumerate(era_name):
lx = label_x + ci * 5
if lx < W:
canvas[y_label, lx] = color
canvas[y_label, min(lx + 3, W-1)] = np.clip(color * 0.6, 0, 255).astype(np.uint8)
return label_x
def compute_time_label(layer_idx, layers_data, now_ts: float):
"""Return a human-readable time label for a layer."""
if not layers_data[layer_idx][2]:
return None
mtime_ns = min(item[0] for item in layers_data[layer_idx][2])
age_s = now_ts * 1e9 - mtime_ns
age_d = age_s / 86400 / 1e9
if age_d < 1:
return f"{int(age_d * 24)}h"
elif age_d < 30:
return f"{int(age_d)}d"
elif age_d < 365:
return f"{int(age_d / 30)}mo"
else:
return f"{int(age_d / 365)}y"
# βββ Main Renderer ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def render_geological_cross_section(layers_data, output_path: str):
"""
Render the full geological cross-section canvas and save as PNG.
"""
np.random.seed(0xDEA7C0DE)
rng = np.random.Generator(np.random.PCG64(0xDEA7C0DE))
H, W = HEIGHT, WIDTH
canvas = np.zeros((H, W, 3), dtype=np.uint8)
# Fill with deep rock background
for y in range(H):
for x in range(W):
noise = rng.normal() * 3
canvas[y, x] = np.clip(ROCK_DARK + noise, 0, 255).astype(np.uint8)
now_ts = datetime.now().timestamp()
num_layers= len(layers_data)
col_top = 4
col_bot = H - 3
col_height= col_bot - col_top
layer_h = col_height / num_layers
# ββ Main Strata Column ββββββββββββββββββββββββββββββββββββββββββββββββββ
strata_x = 10
strata_right = W - 14
era_boundaries, era_label_xs = render_strata_column(
canvas, layers_data, strata_x,
col_bot, col_top, rng, ERA_NAMES
)
# ββ Second parallel column (right side) βββββββββββββββββββββββββββββββ
col2_x = strata_right
render_strata_column(canvas, layers_data, col2_x, col_bot, col_top, rng, ERA_NAMES)
# ββ Connect columns at base (bedrock) ββββββββββββββββββββββββββββββββββ
for x in range(strata_x, col2_x + 1):
if x < W:
canvas[col_bot, x] = ROCK_DARK
canvas[col_bot + 1, x] = np.clip(ROCK_DARK * 0.6, 0, 255).astype(np.uint8)
canvas[col_bot + 2, x] = np.clip(ROCK_DARK * 0.3, 0, 255).astype(np.uint8)
# ββ Stalactites (descending from ceiling of present) ββββββββββββββββββ
ceiling_y = col_top
num_stalactites = 28
for si in range(num_stalactites):
sx = strata_x + 1 + int((col2_x - strata_x - 2) * (si / (num_stalactites - 1)))
# Only grow stalactites for newer (upper) layers
layer_for_stala = int(rng.random() ** 0.5 * num_layers * 0.6) + int(num_layers * 0.3)
layer_for_stala = min(layer_for_stala, num_layers - 1)
length = max(3, int(rng.random() * layer_h * 3))
depth = layer_for_stala / num_layers
color = STALA_TOP if depth > 0.5 else STALA_BOT
tip_y = ceiling_y + int(layer_for_stala * layer_h)
draw_stalactite(canvas, sx, tip_y, length, color, STALA_BOT, rng,
glow=0.5 + depth * 0.5)
# ββ Stalagmites (rising from bedrock) ββββββββββββββββββββββββββββββββββ
for si in range(18):
sx = strata_x + 1 + int(rng.random() * (col2_x - strata_x - 2))
length = max(2, int(rng.random() * layer_h * 1.5))
draw_stalagmite(canvas, sx, col_bot, length, STALA_TOP, STALA_BOT, rng,
glow=0.4 + rng.random() * 0.4)
# ββ Geological Era Boundaries ββββββββββββββββββββββββββββββββββββββββββ
era_y_positions = []
for ei in range(4):
y_pos = int(col_bot - (ei + 1) * col_height / 4)
era_y_positions.append(y_pos)
for x in range(strata_x, col2_x + 1):
if x < W:
canvas[y_pos, x] = ERA_COLORS[3 - ei]
canvas[y_pos + 1, x] = np.clip(
canvas[y_pos + 1, x].astype(np.int32) + ERA_COLORS[3 - ei] * 0.3, 0, 255
).astype(np.uint8)
# ββ Age Ruler (left side) βββββββββββββββββββββββββββββββββββββββββββββ
ruler_x_left = 3
ruler_x_right = 7
label_max_x = draw_age_ruler(canvas, ruler_x_left, ruler_x_right,
col_bot, layers_data, rng)
# ββ Vertical Crack/Fault Lines βββββββββββββββββββββββββββββββββββββββββ
num_cracks = 5
for ci in range(num_cracks):
x_start = strata_x + int(rng.random() * (col2_x - strata_x))
y_start = int(col_bot * rng.random() * 0.3)
x_end = x_start + int(rng.normal() * 6)
y_end = int(col_bot - rng.random() * col_bot * 0.2)
add_crack(canvas, x_start, y_start, x_end, y_end, rng)
# ββ Title: "ARCHAEOLOGY OF TOUCH" ββββββββββββββββββββββββββββββββββββββ
title = "ARCHAEOLOGY OF TOUCH"
title_x = W // 2
title_y = 1
title_color = np.array([180, 130, 220], dtype=np.uint8)
draw_text_centered(canvas, title, title_x, title_y, title_color)
# ββ Era Labels across the top βββββββββββββββββββββββββββββββββββββββββ
for ei, (era_name, era_color) in enumerate(zip(ERA_NAMES, ERA_COLORS)):
era_x = strata_x + int((col2_x - strata_x) * (ei + 0.5) / len(ERA_NAMES))
for ci, ch in enumerate(era_name):
ex = era_x - len(ERA_NAMES) * 5 // 2 + ci * 5
if 0 <= ex < W:
canvas[2, ex] = era_color
canvas[3, ex] = np.clip(era_color * 0.5, 0, 255).astype(np.uint8)
# ββ Side Annotations (depth indicators) βββββββββββββββββββββββββββββββββ
depth_notes = [
(col_bot - int(col_height * 0.1), "RECENT: Touched recently"),
(col_bot - int(col_height * 0.5), "DEEP: Untouched for years"),
(col_bot - int(col_height * 0.9), "ARCHAIC: Nearly forgotten"),
]
for dy, note in depth_notes:
note_x = col2_x + 3
for ci, ch in enumerate(note):
nx = note_x + ci * 5
if nx + 5 < W and 0 <= dy < H:
canvas[dy, nx] = TEXT_DIM
# ββ Glowing Ambient Overlay βββββββββββββββββββββββββββββββββββββββββββββ
glow_strength = np.zeros((H, W), dtype=np.float32)
for y in range(H):
for x in range(strata_x, col2_x + 1):
t = (col_bot - y) / max(col_height, 1)
if 0 <= t <= 1:
glow_strength[y, x] = math.sin(t * math.pi) * 0.18
for y in range(H):
for x in range(W):
if glow_strength[y, x] > 0.01:
glow_col = GLOW_AMBIENT * glow_strength[y, x]
canvas[y, x] = np.clip(
canvas[y, x].astype(np.int32) + glow_col, 0, 255
).astype(np.uint8)
# ββ Tonemap (prevent overflow from additive passes) ββββββββββββββββββββ
f = canvas.astype(np.float32)
lo, hi = np.percentile(f[::4, ::4].reshape(-1, 3), [1, 99.5], axis=0)
hi = np.maximum(hi, lo + 1)
f = np.clip((f - lo) / (hi - lo), 0, 1) ** 0.80
canvas = (f * 255).astype(np.uint8)
# ββ Save ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
img = Image.fromarray(canvas, mode='RGB')
img.save(output_path, dpi=(120, 120))
print(f"Saved: {output_path}")
return output_path
# βββ Entry Point ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def main():
HOME = Path.home()
SCAN_ROOT = HOME
OUTPUT = HOME / "workspace" / "deamcode" / "2026-07-12" / "cross_section.png"
OUTPUT.parent.mkdir(parents=True, exist_ok=True)
print("Collecting filesystem stratigraphy...")
samples = collect_timestamps(str(SCAN_ROOT), max_depth=3, max_files=500)
print(f" {len(samples)} files sampled")
layers_data = stratify(samples, num_layers=HEIGHT - 10)
print(f" {len(layers_data)} geological layers identified")
# Show layer distribution
now_ts = datetime.now().timestamp()
print("\nLayer age distribution:")
for li, (idx, depth, items) in enumerate(layers_data):
if items and li % 6 == 0:
age_days = (now_ts * 1e9 - min(it[0] for it in items)) / 86400 / 1e9
print(f" Layer {li:2d} ({'β' * int(depth * 20):20s}) {len(items):3d} files, age ~{age_days:.0f}d")
print("\nRendering geological cross-section...")
render_geological_cross_section(layers_data, str(OUTPUT))
print("\nArchaeology complete.")
print(f" {len(samples)} files examined")
print(f" {sum(len(l[2]) for l in layers_data)} total samples in strata")
if __name__ == "__main__":
main()
Run output
Collecting filesystem stratigraphy...
49 files sampled
38 geological layers identified
Layer age distribution:
Layer 0 ( ) 4 files, age ~29d
Layer 6 (βββ ) 2 files, age ~26d
Layer 36 (βββββββββββββββββββ ) 21 files, age ~1d
Rendering geological cross-section...
/root/.cache/act/40f32105a2a3695c/hostexecutor/dreams/2026-07-12/geology.py:480: DeprecationWarning: 'mode' parameter is deprecated and will be removed in Pillow 13 (2026-10-15)
img = Image.fromarray(canvas, mode='RGB')
Saved: /root/workspace/deamcode/2026-07-12/cross_section.png
Archaeology complete.
49 files examined
49 total samples in strata