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:
parent
751ffe33fb
commit
48044d6cf7
22 changed files with 0 additions and 374 deletions
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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`.
|
||||
|
|
|
|||
|
|
@ -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."
|
||||
|
|
@ -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."
|
||||
|
|
@ -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}/"
|
||||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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).
|
||||
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -1,4 +0,0 @@
|
|||
.kw { color: #d73a49; font-weight: bold; }
|
||||
.str { color: #032f62; }
|
||||
.cm { color: #6a737d; font-style: italic; }
|
||||
.num { color: #005cc5; }
|
||||
|
|
@ -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; }
|
||||
|
|
@ -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>
|
||||
|
|
@ -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}} · {{article.tags}}</p>
|
||||
</header>
|
||||
<div class="post-content">
|
||||
{{article.content_html}}
|
||||
</div>
|
||||
<footer class="post-footer">
|
||||
<a href="/">← back to all posts</a>
|
||||
</footer>
|
||||
</article>
|
||||
|
|
@ -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>
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
<footer>
|
||||
<p>writeonce — Shoney Arickathil · <a href="https://github.com/shoneyj">GitHub</a> · <a href="https://www.linkedin.com/in/shoney-john">LinkedIn</a></p>
|
||||
</footer>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
.kw { color: #d73a49; font-weight: bold; }
|
||||
.str { color: #032f62; }
|
||||
.cm { color: #6a737d; font-style: italic; }
|
||||
.num { color: #005cc5; }
|
||||
|
|
@ -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; }
|
||||
Loading…
Reference in a new issue