chore: remove stale old-runtime cruft and v1-blog frontend assets

Cleanup off master. None of this is referenced by the current woc/wovm
toolchain or the maintained Rust crates; it belongs to abandoned/scratch
state.

Removed:
- .planboard/ + .planboard.json — planboard task-tracking state for the
  haxe-parity plan (tooling scratch)
- prompt.md — a stray one-line note about the old runtime's 13c task
- infra/ (deploy.sh, setup.sh, sync.sh) — deploy scripts for the old Rust
  runtime (cargo build -p wo-rt, scp to writeonce.de, nginx/SSL/systemd)
- static/ + templates/ — the v1 blog's .htmlx frontend assets (svg/css +
  about/article/home/layout templates); the UI track that used them was
  already removed as stale
- content/ data/ wo-data/ — empty untracked v1 runtime dirs

Updated docs/08-project-structure.md: dropped the "v1 blog operating assets"
tree line and section. (cm.md keeps a historical mention of infra/sync.sh as
a legacy note — left as-is.)

Nothing kept references the removed paths (verified tree-wide; crates/rt hits
were `'static` lifetimes, not file reads).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
shoney.arickathil 2026-08-18 01:33:19 +02:00
parent f234839304
commit 5ca83155d3
22 changed files with 0 additions and 374 deletions

View file

@ -1,29 +0,0 @@
{
"version": 1,
"plans": {
"docs/plan/compiler/2026-08-01-haxe-parity-language.md": {
"tasks": {
"111d92e6436d": {
"status": "doing",
"updatedAt": "2026-08-12T23:42:50Z"
},
"80e49fea186b": {
"status": "done",
"updatedAt": "2026-08-12T23:42:38Z"
},
"84addb11f795": {
"status": "done",
"updatedAt": "2026-08-12T23:42:35Z"
},
"942b4a1e8925": {
"status": "done",
"updatedAt": "2026-08-12T23:42:15Z"
},
"ea0f91fca71b": {
"status": "done",
"updatedAt": "2026-08-12T23:42:40Z"
}
}
}
}
}

View file

@ -1,9 +0,0 @@
---
planboard: generated
kind: ledger
plan: docs/plan/compiler/2026-08-01-haxe-parity-language.md
started: 2026-08-13
---
# Ledger — Haxe-Parity Language Adoptions Implementation Plan

View file

@ -15,7 +15,6 @@ writeonce-all/
├── prototypes/ ✅ wo-db C++ query-engine reference; ⚠ wo-rt-c = stale duplicate of runtime/
├── .dev/reference/ ✅ v1 crates workspace, colibri, llama-cpp; linux/ + go/ symlinks (per-dev)
├── docs/ ✅ ALL documentation: numbered design docs, plan/, runtime/, examples/, superpowers/
├── content/ data/ wo-data/ static/ templates/ infra/ ✅ v1 blog operating assets (migration-plan governed)
├── justfile recipes: rt-c-demo/bench today; woc-/wovm-/oop-accept as plans land
├── Cargo.toml the Rust workspace root (crates/*; .dev/reference/crates excluded)
└── .dev/ gitignored per-developer links + commit.md draft (see .dev/README.md)
@ -106,10 +105,6 @@ docs/
Repo rule restated: documentation belongs here; code directories keep one orientation README each.
### v1 blog operating assets — `content/`, `data/`, `wo-data/`, `static/`, `templates/`, `infra/`
The original writeonce blog's articles (`content/`), its data directories, `.htmlx` templates (`templates/` — cited by the UI track as concrete v1 usage), static files, and deploy config. Governed by the wo-seg migration plan; untouched by the OOP/systems tracks except as reference. `target/` is cargo build output (ignored).
### `.dev/` — developer-local state
Gitignored symlinks into per-machine AI-tooling state plus `commit.md`, the running commit-message draft (the user commits; agents only append drafts). See `.dev/README.md`.

View file

@ -1,34 +0,0 @@
#!/bin/bash
# deploy.sh — run from the development machine to build, copy, and restart
set -e
SERVER="writeonce.de"
REMOTE_DIR="/opt/writeonce"
echo "Building release binary..."
cargo build --release -p wo-rt --bin writeonce
echo "Copying binary to server..."
scp target/release/writeonce "$SERVER:$REMOTE_DIR/writeonce.new"
echo "Syncing content..."
rsync -az --delete content/ "$SERVER:$REMOTE_DIR/content/"
echo "Syncing templates..."
rsync -az --delete templates/ "$SERVER:$REMOTE_DIR/templates/"
echo "Syncing static assets..."
rsync -az --delete static/ "$SERVER:$REMOTE_DIR/static/"
echo "Swapping binary and restarting service..."
ssh "$SERVER" "
sudo mv $REMOTE_DIR/writeonce.new $REMOTE_DIR/writeonce
sudo chmod +x $REMOTE_DIR/writeonce
sudo chown writeonce:writeonce $REMOTE_DIR/writeonce
sudo systemctl restart writeonce
"
echo "Checking status..."
ssh "$SERVER" "sudo systemctl status writeonce --no-pager"
echo "Deploy complete."

View file

@ -1,36 +0,0 @@
#!/bin/bash
# setup.sh — run once on the server to create user, directory, service, nginx, and SSL
set -e
echo "Creating writeonce user..."
sudo useradd -r -s /bin/false writeonce 2>/dev/null || echo "User already exists"
echo "Creating directory structure..."
sudo mkdir -p /opt/writeonce/{content,data,templates,static}
sudo chown -R writeonce:writeonce /opt/writeonce
echo "Installing systemd service..."
sudo cp writeonce.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable writeonce
echo "Configuring nginx..."
sudo cp writeonce.de.nginx /etc/nginx/sites-available/writeonce.de
sudo ln -sf /etc/nginx/sites-available/writeonce.de /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
echo "Setting up SSL with Let's Encrypt..."
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d writeonce.de -d www.writeonce.de
echo "Installing certbot reload hook..."
sudo mkdir -p /etc/letsencrypt/renewal-hooks/deploy
sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh > /dev/null << 'HOOK'
#!/bin/bash
systemctl reload nginx
HOOK
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
echo "Setup complete."
echo "Run deploy.sh from your development machine to deploy the binary."

View file

@ -1,17 +0,0 @@
#!/bin/bash
# sync.sh — sync content, templates, and static assets without rebuilding or restarting
set -e
SERVER="shoney@192.168.0.217"
REMOTE_DIR="/opt/writeonce"
echo "Syncing content..."
rsync -az --delete content/ "$SERVER:/tmp/writeonce-content/"
echo "Syncing templates..."
rsync -az --delete templates/ "$SERVER:/tmp/writeonce-templates/"
echo "Syncing static assets..."
rsync -az --delete static/ "$SERVER:/tmp/writeonce-static/"
echo "Sync complete. Files staged in /tmp/writeonce-{content,templates,static}/"

View file

@ -1,40 +0,0 @@
server {
listen 80;
server_name writeonce.de www.writeonce.de;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name writeonce.de www.writeonce.de;
ssl_certificate /etc/letsencrypt/live/writeonce.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/writeonce.de/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Keep connections open for database subscriptions
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
# Static assets — let nginx serve directly for better caching
location /static/ {
alias /opt/writeonce/static/;
expires 1y;
add_header Cache-Control "public, immutable";
}
}

View file

@ -1,24 +0,0 @@
[Unit]
Description=writeonce content platform
After=network.target
[Service]
Type=simple
User=writeonce
Group=writeonce
WorkingDirectory=/opt/writeonce
ExecStart=/opt/writeonce/writeonce
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/writeonce/data
PrivateTmp=true
[Install]
WantedBy=multi-user.target

View file

@ -1,2 +0,0 @@
Next per the
board: 13c — LIVE pricing push (the subscription registry and WebSocket upgrade that replaces the 501 stub, pairing with 09d).

View file

@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<rect width="32" height="32" rx="4" fill="#222"/>
<text x="16" y="23" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" font-size="20" font-weight="700" fill="#fff" text-anchor="middle">W</text>
</svg>

Before

Width:  |  Height:  |  Size: 289 B

View file

@ -1,5 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 32">
<rect width="32" height="32" rx="4" fill="#222"/>
<text x="16" y="23" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" font-size="20" font-weight="700" fill="#fff" text-anchor="middle">W</text>
<text x="42" y="23" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" font-size="18" font-weight="700" fill="#222" text-anchor="start">writeonce</text>
</svg>

Before

Width:  |  Height:  |  Size: 466 B

View file

@ -1,4 +0,0 @@
.kw { color: #d73a49; font-weight: bold; }
.str { color: #032f62; }
.cm { color: #6a737d; font-style: italic; }
.num { color: #005cc5; }

View file

@ -1,18 +0,0 @@
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; line-height: 1.6; max-width: 800px; margin: 0 auto; padding: 2rem; color: #333; }
header nav { display: flex; gap: 1.5rem; padding: 1rem 0; border-bottom: 1px solid #eee; margin-bottom: 2rem; }
header nav a { text-decoration: none; color: #555; }
header nav a:first-child { font-weight: bold; color: #111; }
h1 { margin-bottom: 1rem; }
h2 { margin: 1.5rem 0 0.5rem; }
p { margin-bottom: 0.75rem; }
.meta { color: #888; font-size: 0.9rem; }
.tags { color: #666; font-size: 0.85rem; }
.article-card { padding: 1rem 0; border-bottom: 1px solid #f0f0f0; }
.article-card h2 { margin: 0; font-size: 1.2rem; }
.article-card a { text-decoration: none; color: #222; }
.article-card a:hover { color: #0066cc; }
article section { margin-bottom: 1.5rem; }
code { background: #f5f5f5; padding: 0.15rem 0.4rem; border-radius: 3px; font-size: 0.9em; }
pre { background: #f5f5f5; padding: 1rem; border-radius: 6px; overflow-x: auto; margin: 1rem 0; }
footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #eee; color: #999; font-size: 0.85rem; }

View file

@ -1,19 +0,0 @@
<div class="about-page">
<h1>about me</h1>
<p>Hi, I'm <strong>Shoney John Arickathil</strong> — a full stack developer based in Mannheim, Germany. I write about software engineering, systems programming, DevOps, and things I learn along the way.</p>
<p>I work across the stack with C# .NET, Python, TypeScript, Java Spring Boot, Rust, and Go. My interests lean toward backend systems, infrastructure as code, and building tools from scratch.</p>
<p>Outside of work, I enjoy digging into low-level systems programming, experimenting with machine learning, and writing about what I find.</p>
<h2>about this site</h2>
<p>writeonce is my personal blog. The engine behind it is a single Rust binary with embedded storage — no external database, no framework, just a custom runtime with kernel-level file watching for live content updates.</p>
<p>The source code is on <a href="https://github.com/shoneyj/writeonce">GitHub</a>.</p>
<h2>get in touch</h2>
<ul class="contact-links">
<li><a href="mailto:shoney.john@outlook.com">shoney.john@outlook.com</a></li>
<li><a href="https://github.com/shoneyj">GitHub</a></li>
<li><a href="https://www.linkedin.com/in/shoney-john">LinkedIn</a></li>
</ul>
</div>

View file

@ -1,12 +0,0 @@
<article class="blog-post">
<header class="post-header">
<h1 data-bind="article.title">{{article.title}}</h1>
<p class="meta">{{article.date}} &middot; {{article.tags}}</p>
</header>
<div class="post-content">
{{article.content_html}}
</div>
<footer class="post-footer">
<a href="/">&larr; back to all posts</a>
</footer>
</article>

View file

@ -1,5 +0,0 @@
<div class="article-card">
<h2><a href="/blog/{{article.sys_title}}">{{article.title}}</a></h2>
<p class="meta">{{article.date}}</p>
<p class="tags">{{article.tags}}</p>
</div>

View file

@ -1,3 +0,0 @@
<footer>
<p>writeonce &mdash; Shoney Arickathil &middot; <a href="https://github.com/shoneyj">GitHub</a> &middot; <a href="https://www.linkedin.com/in/shoney-john">LinkedIn</a></p>
</footer>

View file

@ -1,9 +0,0 @@
<header>
<nav>
<a href="/" class="site-name"><img src="/static/logo.svg" alt="writeonce" class="site-logo"></a>
<div class="nav-links">
<a href="/">blog</a>
<a href="/about">about</a>
</div>
</nav>
</header>

View file

@ -1,12 +0,0 @@
<div class="home-page">
<div class="hero">
<h1>writeonce</h1>
<p class="tagline">a personal blog on software engineering, systems programming, and everything in between.</p>
</div>
<section class="recent-posts">
<h2>recent posts</h2>
{{#each articles}}
{{> article-card article=this}}
{{/each}}
</section>
</div>

View file

@ -1,18 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{page_title}}</title>
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg">
<link rel="stylesheet" href="/static/styles/main.css">
<link rel="stylesheet" href="/static/styles/code-theme.css">
</head>
<body>
{{header}}
<main>
{{content}}
</main>
{{footer}}
</body>
</html>

View file

@ -1,4 +0,0 @@
.kw { color: #d73a49; font-weight: bold; }
.str { color: #032f62; }
.cm { color: #6a737d; font-style: italic; }
.num { color: #005cc5; }

View file

@ -1,65 +0,0 @@
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; line-height: 1.7; max-width: 720px; margin: 0 auto; padding: 2rem 1.5rem; color: #2d2d2d; background: #fafafa; }
/* Navigation */
header nav { display: flex; justify-content: space-between; align-items: center; padding: 1rem 0; border-bottom: 2px solid #222; margin-bottom: 2.5rem; }
header nav .site-name { text-decoration: none; display: flex; align-items: center; }
.site-logo { height: 28px; width: auto; }
header nav .nav-links { display: flex; gap: 1.5rem; }
header nav .nav-links a { text-decoration: none; color: #555; font-size: 0.95rem; }
header nav .nav-links a:hover { color: #111; }
/* Hero */
.hero { margin-bottom: 2.5rem; padding-bottom: 1.5rem; border-bottom: 1px solid #e0e0e0; }
.hero h1 { font-size: 2rem; letter-spacing: -1px; margin-bottom: 0.25rem; }
.tagline { color: #666; font-size: 1.05rem; }
/* Headings */
h1 { font-size: 1.75rem; margin-bottom: 1rem; letter-spacing: -0.5px; }
h2 { font-size: 1.3rem; margin: 2rem 0 0.75rem; }
h3 { font-size: 1.1rem; margin: 1.5rem 0 0.5rem; }
/* Text */
p { margin-bottom: 1rem; }
a { color: #0066cc; }
a:hover { color: #004499; }
/* Article cards */
.recent-posts h2 { margin-bottom: 1rem; font-size: 1.1rem; text-transform: uppercase; letter-spacing: 1px; color: #888; font-weight: 600; }
.article-card { padding: 1.25rem 0; border-bottom: 1px solid #eee; }
.article-card h2 { margin: 0 0 0.25rem; font-size: 1.2rem; }
.article-card a { text-decoration: none; color: #222; }
.article-card a:hover { color: #0066cc; }
.article-card .meta { color: #999; font-size: 0.85rem; margin-bottom: 0.25rem; }
.article-card .tags { color: #888; font-size: 0.8rem; }
/* Blog post */
.blog-post .post-header { margin-bottom: 2rem; padding-bottom: 1rem; border-bottom: 1px solid #eee; }
.blog-post .post-header h1 { margin-bottom: 0.5rem; }
.blog-post .post-content { margin-bottom: 2rem; }
.blog-post .post-content p { margin-bottom: 1rem; }
.blog-post .post-content ul, .blog-post .post-content ol { margin: 1rem 0; padding-left: 1.5rem; }
.blog-post .post-content li { margin-bottom: 0.5rem; }
.blog-post .post-footer { padding-top: 1.5rem; border-top: 1px solid #eee; }
.blog-post .post-footer a { color: #555; text-decoration: none; font-size: 0.9rem; }
.blog-post .post-footer a:hover { color: #111; }
.meta { color: #888; font-size: 0.9rem; }
/* About page */
.about-page h2 { margin-top: 2rem; }
/* Contact links */
.contact-links { list-style: none; padding: 0; }
.contact-links li { padding: 0.4rem 0; }
.contact-links a { color: #0066cc; text-decoration: none; }
.contact-links a:hover { text-decoration: underline; }
/* Code */
code { background: #f0f0f0; padding: 0.15rem 0.4rem; border-radius: 3px; font-size: 0.9em; }
pre { background: #f0f0f0; padding: 1rem; border-radius: 6px; overflow-x: auto; margin: 1rem 0; }
pre code { background: none; padding: 0; }
/* Footer */
footer { margin-top: 3rem; padding-top: 1rem; border-top: 2px solid #222; color: #999; font-size: 0.85rem; }
footer a { color: #999; text-decoration: none; }
footer a:hover { color: #555; }