Skip to content

Commit 46f0544

Browse files
committed
Update landing page
1 parent 26e5989 commit 46f0544

4 files changed

Lines changed: 56 additions & 45 deletions

File tree

scripts/build.rb

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,32 @@
99
SRC_DIR = 'src'
1010
DATA_DIR = File.join(SRC_DIR, 'data')
1111
PAGES_DIR = File.join(SRC_DIR, 'pages')
12+
STATIC_DIR = 'src/static'
1213
OUTPUT_DIR = 'public'
1314

1415
# Ensure output directory exists
1516
FileUtils.mkdir_p(OUTPUT_DIR)
1617

18+
# Copy static files to public directory
19+
if Dir.exist?(STATIC_DIR)
20+
puts "Copying static files from #{STATIC_DIR}/ to #{OUTPUT_DIR}/..."
21+
Dir.glob(File.join(STATIC_DIR, '**', '*'), File::FNM_DOTMATCH).each do |file|
22+
next if File.directory?(file)
23+
next if File.basename(file).start_with?('.')
24+
25+
relative_path = file.sub(STATIC_DIR + '/', '')
26+
output_path = File.join(OUTPUT_DIR, relative_path)
27+
28+
# Ensure output subdirectories exist
29+
FileUtils.mkdir_p(File.dirname(output_path))
30+
31+
# Copy file
32+
FileUtils.cp(file, output_path)
33+
puts " ✓ Copied #{relative_path}"
34+
end
35+
puts ''
36+
end
37+
1738
# Process all .erb files in src/pages/
1839
Dir.glob(File.join(PAGES_DIR, '**', '*.erb')).each do |template_file|
1940
# Get relative path and remove .erb extension for output
@@ -37,7 +58,7 @@
3758
erb = ERB.new(template_content)
3859

3960
# Render template with translation data
40-
puts " Rendering..."
61+
puts ' Rendering...'
4162
result = erb.result(binding)
4263

4364
# Ensure output subdirectories exist

src/data/translation.en.yaml

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,53 +12,55 @@ navigation:
1212

1313
hero:
1414
title:
15-
gradient: "Homelab Orchestration"
15+
gradient: "Homelab Docker Compose"
1616
plain: "Simplified"
17-
subtitle: "Bring Kubernetes-like workflows to your homelab. Minimal overhead, maximum control."
17+
subtitle: "Bring Kubernetes-like workflows to your existing hosts. Start manual and minimalist, extend as you find fit."
1818

1919
quick_start:
2020
label: "Quick Start"
2121
commands:
2222
- "gem install walheim"
23-
- "# Initialize your homelab"
24-
- "walheim init"
25-
- "# Deploy your first service"
26-
- "walheim deploy app.yml"
23+
- "# Create a context for your homelab"
24+
- "whctl context new homelab --data-dir ~/homelab"
25+
- "# Add your first VM/host"
26+
- "whctl create namespace minipc-01 --hostname 192.168.1.100 --username admin"
27+
- "# Import an existing docker-compose app"
28+
- "whctl import app nginx -n minipc-01 -f docker-compose.yml"
29+
- "# View logs"
30+
- "whctl logs app nginx -n minipc-01 --follow"
2731

2832
features:
2933
section_title: "Built for Self-Hosters"
3034
items:
3135
- icon_color: "blue"
32-
title: "Lightweight"
33-
description: "No bloat. Pure Ruby implementation that runs on minimal resources. Perfect for Raspberry Pi and modest hardware."
34-
icon_path: "M13 10V3L4 14h7v7l9-11h-7z"
36+
icon: "files"
37+
title: "File-Based Control Plane"
38+
description: "Your laptop is the control plane. No databases, no etcd, no API servers. Just YAML files in a directory you manage and version control."
3539

3640
- icon_color: "purple"
37-
title: "Declarative"
38-
description: "Familiar YAML manifests. Define your desired state, Walheim handles the rest. No complex DSLs to learn."
39-
icon_path: "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4"
41+
icon: "terminal-window"
42+
title: "No Agents Required"
43+
description: "Uses SSH and rsync to deploy to your VMs. No daemons to install, no ports to open. If you can SSH to it, you can manage it."
4044

4145
- icon_color: "emerald"
42-
title: "Self-Contained"
43-
description: "Zero external dependencies. Your homelab stays private and under your control. Works entirely offline."
44-
icon_path: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"
46+
icon: "package"
47+
title: "Docker Compose Native"
48+
description: "Simple one-command import from existing docker-compose.yml. Migration is just running `whctl import app`."
4549

4650
- icon_color: "orange"
47-
title: "Extensible"
48-
description: "Plugin architecture for custom integrations. Adapt Walheim to your specific homelab needs."
49-
icon_paths:
50-
- "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
51-
- "M15 12a3 3 0 11-6 0 3 3 0 016 0z"
51+
icon: "devices"
52+
title: "Multi-Machine Management"
53+
description: "Each namespace maps to a physical machine. Manage multiple VMs from one place with kubectl-style commands."
5254

5355
- icon_color: "cyan"
54-
title: "GitOps Ready"
55-
description: "Version control your infrastructure. Automated deployments from Git repositories out of the box."
56-
icon_path: "M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01"
56+
icon: "file-code"
57+
title: "Direct Access to Compose"
58+
description: "Compiles manifests into plain docker-compose.yml on the host. Need to debug? SSH in and edit the file directly, YOLO-style."
5759

5860
- icon_color: "pink"
59-
title: "Observable"
60-
description: "Built-in monitoring and health checks. Know the state of your services at a glance."
61-
icon_path: "M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"
61+
icon: "sketch-logo"
62+
title: "Pure Ruby (For Now)"
63+
description: "Single gem with minimal dependencies. No complex runtime. Works on any machine with Ruby and SSH. Go/Rust rewrite on the roadmap for single-binary distribution."
6264

6365
cta:
6466
title: "Start Building Your Homelab"
@@ -76,5 +78,5 @@ footer:
7678

7779
# Command copy functionality
7880
copy:
79-
command_text: "gem install walheim\\nwalheim init\\nwalheim deploy app.yml"
81+
command_text: "gem install walheim\\nwhctl context new homelab --data-dir ~/homelab\\nwhctl create namespace minipc-01 --hostname 192.168.1.100 --username admin\\nwhctl import app nginx -n minipc-01 -f docker-compose.yml\\nwhctl logs app nginx -n minipc-01 --follow"
8082
success_message: "Command copied to clipboard!"

src/pages/index.html.erb

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<meta name="viewport" content="width=device-width, initial-scale=1.0">
77
<title><%= t['meta']['title'] %></title>
88
<script src="https://cdn.tailwindcss.com"></script>
9+
<script src="https://unpkg.com/@phosphor-icons/web@2.0.3"></script>
910
<style>
1011
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
1112

@@ -40,10 +41,7 @@
4041
<nav class="fixed w-full bg-white/80 backdrop-blur-md border-b border-slate-200 z-50">
4142
<div class="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
4243
<div class="flex items-center space-x-2">
43-
<svg class="w-8 h-8 text-blue-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
44-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
45-
d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
46-
</svg>
44+
<img src="/walheim_s.png" alt="Walheim Logo" class="w-8 h-8" />
4745
<span class="text-xl font-semibold"><%= t['navigation']['brand'] %></span>
4846
</div>
4947
<a href="<%= t['navigation']['github_link']['url'] %>" target="_blank"
@@ -77,9 +75,9 @@
7775
<div class="command-line rounded-lg p-6 shadow-xl">
7876
<div class="flex items-start space-x-3">
7977
<span class="text-emerald-400 font-mono text-sm">$</span>
80-
<code class="text-slate-100 font-mono text-sm flex-1 leading-relaxed">
78+
<code class="font-mono text-sm flex-1 leading-relaxed">
8179
<% t['quick_start']['commands'].each_with_index do |cmd, index| %>
82-
<%= cmd %><%= index < t['quick_start']['commands'].length - 1 ? '<br/>' : '' %>
80+
<span class="<%= cmd.start_with?('#') ? 'text-slate-400' : 'text-slate-100' %>"><%= cmd %></span><%= index < t['quick_start']['commands'].length - 1 ? '<br/>' : '' %>
8381
<% end %>
8482
</code>
8583
<button onclick="copyCommand()" class="text-slate-400 hover:text-slate-200 transition">
@@ -103,17 +101,7 @@
103101
<!-- Feature Card -->
104102
<div class="feature-card bg-slate-50 rounded-xl p-8 border border-slate-200">
105103
<div class="w-12 h-12 bg-<%= feature['icon_color'] %>-100 rounded-lg flex items-center justify-center mb-4">
106-
<svg class="w-6 h-6 text-<%= feature['icon_color'] %>-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
107-
<% if feature['icon_paths'] %>
108-
<% feature['icon_paths'].each do |path| %>
109-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
110-
d="<%= path %>" />
111-
<% end %>
112-
<% else %>
113-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
114-
d="<%= feature['icon_path'] %>" />
115-
<% end %>
116-
</svg>
104+
<i class="ph-duotone ph-<%= feature['icon'] %> text-<%= feature['icon_color'] %>-600" style="font-size: 24px;"></i>
117105
</div>
118106
<h3 class="text-xl font-semibold mb-3"><%= feature['title'] %></h3>
119107
<p class="text-slate-600">

src/static/walheim_s.png

28.7 KB
Loading

0 commit comments

Comments
 (0)