Add dedicated edition pages (server, workstation, cloud)

- Add /server, /workstation, /cloud routes with per-page SEO titles
- Extract shared nav, footer, and waitlist form into partials
- Nav links to edition pages with active-state highlighting; swap About/Security order
- Waitlist form pre-checks the current edition and adds a Cloud option
- Add page-hero variant, edition switcher, and active-nav styles
- Responsive fixes: nav wraps at 540px, waitlist checkboxes wrap on narrow screens
This commit is contained in:
Blake Ridgway
2026-08-22 22:02:34 -05:00
parent 8ba41f7e3c
commit b8df82e383
9 changed files with 816 additions and 119 deletions

62
main.go
View File

@@ -14,6 +14,22 @@ import (
var templates = make(map[string]*template.Template) var templates = make(map[string]*template.Template)
// pageTitles maps each edition page to its SEO title.
var pageTitles = map[string]string{
"server": "Arcline Server — Hardened SOC / Production Host",
"workstation": "Arcline Workstation — Security Analyst / Blue-Team Desktop",
"cloud": "Arcline Cloud — Security-First Cloud Images",
}
// mustParse parses a template set and fails fast at startup on any error.
func mustParse(name string, files ...string) *template.Template {
t, err := template.ParseFiles(files...)
if err != nil {
log.Fatalf("failed to parse %s template: %v", name, err)
}
return t
}
// contextKey is used to pass per-request log extras from handlers to the logging middleware. // contextKey is used to pass per-request log extras from handlers to the logging middleware.
type contextKey struct{} type contextKey struct{}
type logContext struct{ extra string } type logContext struct{ extra string }
@@ -25,11 +41,23 @@ func main() {
} }
// Parse templates once at startup. // Parse templates once at startup.
index, err := template.ParseFiles("templates/base.html", "templates/index.html") templates["index"] = mustParse("index",
if err != nil { "templates/base.html",
log.Fatalf("failed to parse index template: %v", err) "templates/index.html",
"templates/partials/nav.html",
"templates/partials/footer.html",
"templates/partials/waitlist_form.html",
)
for _, name := range []string{"server", "workstation", "cloud"} {
templates[name] = mustParse(name,
"templates/base.html",
"templates/"+name+".html",
"templates/partials/nav.html",
"templates/partials/footer.html",
"templates/partials/waitlist_form.html",
)
} }
templates["index"] = index
waitlist, err := template.ParseFiles("templates/partials/waitlist_confirmation.html") waitlist, err := template.ParseFiles("templates/partials/waitlist_confirmation.html")
if err != nil { if err != nil {
@@ -45,6 +73,9 @@ func main() {
// Page routes // Page routes
mux.HandleFunc("/", handleIndex) mux.HandleFunc("/", handleIndex)
mux.HandleFunc("/server", handlePage("server"))
mux.HandleFunc("/workstation", handlePage("workstation"))
mux.HandleFunc("/cloud", handlePage("cloud"))
mux.HandleFunc("/healthz", handleHealthz) mux.HandleFunc("/healthz", handleHealthz)
// HTMX partial routes // HTMX partial routes
@@ -164,6 +195,8 @@ func handleIndex(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Header().Set("Content-Type", "text/html; charset=utf-8")
data := map[string]interface{}{ data := map[string]interface{}{
"Title": "Arcline OS — Hardened Linux for Security Practitioners", "Title": "Arcline OS — Hardened Linux for Security Practitioners",
"Active": "",
"Edition": "server",
} }
if err := templates["index"].ExecuteTemplate(w, "base", data); err != nil { if err := templates["index"].ExecuteTemplate(w, "base", data); err != nil {
log.Printf("render error: %v", err) log.Printf("render error: %v", err)
@@ -171,6 +204,27 @@ func handleIndex(w http.ResponseWriter, r *http.Request) {
} }
} }
// handlePage renders one of the edition pages (server, workstation, cloud).
func handlePage(page string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/"+page {
http.NotFound(w, r)
return
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
data := map[string]interface{}{
"Title": pageTitles[page],
"Active": page,
"Edition": page,
}
if err := templates[page].ExecuteTemplate(w, "base", data); err != nil {
log.Printf("render error: %v", err)
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
}
}
}
func handleWaitlist(w http.ResponseWriter, r *http.Request) { func handleWaitlist(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost { if r.Method != http.MethodPost {
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)

View File

@@ -223,6 +223,13 @@ body {
background: var(--color-bg-alt); background: var(--color-bg-alt);
} }
/* Current page indicator */
.nav nav a.nav-active {
color: var(--color-text);
background: var(--color-bg-alt);
box-shadow: inset 0 -2px 0 var(--color-accent);
}
.nav-cta { .nav-cta {
background: var(--color-accent) !important; background: var(--color-accent) !important;
color: var(--color-cta-text) !important; color: var(--color-cta-text) !important;
@@ -265,7 +272,8 @@ body {
[data-theme="light"] .theme-icon-light { display: none; } [data-theme="light"] .theme-icon-light { display: none; }
/* ── Hero ── */ /* ── Hero ── */
.hero { .hero,
.hero-page {
position: relative; position: relative;
padding: 96px 28px 72px; padding: 96px 28px 72px;
text-align: center; text-align: center;
@@ -278,6 +286,15 @@ body {
border-bottom: 1px solid var(--color-border-light); border-bottom: 1px solid var(--color-border-light);
} }
/* Smaller hero variant used on the edition pages */
.hero-page {
padding: 76px 28px 60px;
}
.hero-page h1 {
font-size: clamp(1.9rem, 4vw, 2.7rem);
}
.hero-inner { .hero-inner {
max-width: var(--w-narrow); max-width: var(--w-narrow);
margin: 0 auto; margin: 0 auto;
@@ -609,6 +626,14 @@ body {
background: var(--color-bg-alt); background: var(--color-bg-alt);
} }
/* ── Edition Switcher (cross-links between edition pages) ── */
.edition-switcher {
display: flex;
flex-wrap: wrap;
gap: 10px;
justify-content: center;
}
/* ── Feature Grid ── */ /* ── Feature Grid ── */
.features-grid { .features-grid {
display: grid; display: grid;
@@ -1018,7 +1043,8 @@ body {
border: none; border: none;
padding: 0; padding: 0;
display: flex; display: flex;
gap: 24px; flex-wrap: wrap;
gap: 16px 24px;
justify-content: center; justify-content: center;
} }
@@ -1249,7 +1275,8 @@ body {
--pad-section: 56px; --pad-section: 56px;
} }
.hero { .hero,
.hero-page {
padding: 60px 22px 50px; padding: 60px 22px 50px;
} }
@@ -1315,11 +1342,13 @@ body {
} }
@media (max-width: 580px) { @media (max-width: 580px) {
.hero { .hero,
.hero-page {
padding: 44px 18px 36px; padding: 44px 18px 36px;
} }
.hero h1 { .hero h1,
.hero-page h1 {
font-size: 1.75rem; font-size: 1.75rem;
} }
@@ -1391,7 +1420,7 @@ body {
} }
/* Very small screens: wrap the nav links onto their own row */ /* Very small screens: wrap the nav links onto their own row */
@media (max-width: 480px) { @media (max-width: 540px) {
.nav-inner { .nav-inner {
height: auto; height: auto;
flex-wrap: wrap; flex-wrap: wrap;

199
templates/cloud.html Normal file
View File

@@ -0,0 +1,199 @@
{{define "content"}}
{{template "nav" .}}
<main id="main">
<!-- Hero -->
<section class="hero hero-page">
<div class="hero-inner">
<p class="hero-sigil">// edition · cloud</p>
<h1>Arcline <span class="hero-highlight">Cloud</span></h1>
<p class="tagline">
Minimal cloud images with a small attack surface — Falco runtime security
and CIS benchmark scanning built in. Ready for AWS, GCP, Azure, or your
own private cloud.
</p>
<div class="hero-actions">
<a href="#get-started" class="cta">Get Early Access</a>
<a href="/" class="cta-secondary">See all editions</a>
</div>
</div>
</section>
<!-- Overview -->
<section class="section">
<div class="section-inner">
<div class="section-label">Overview</div>
<h2>Small footprint. Tight posture.<br>Security-first from the image.</h2>
<p class="section-desc">
Arcline Cloud is built for workloads that need the smallest possible attack
surface — a minimal hardened base with runtime and compliance watching built in.
</p>
<div class="principles-grid">
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<path d="M2 12h20"/>
<path d="M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10"/>
</svg>
</div>
<div>
<h3>Minimal attack surface</h3>
<p>Nothing installed that you didn't ask for. Less to run, less to exploit, less to patch.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="3"/>
<path d="M12 2L22 8.5v7L12 22 2 15.5v-7L12 2z"/>
</svg>
</div>
<div>
<h3>Runtime security</h3>
<p>Falco watches for anomalous container and syscall behavior — in production, not just at install.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="3" width="18" height="18" rx="3"/>
<path d="M8 12l2.5 2.5L16 9"/>
</svg>
</div>
<div>
<h3>CIS scanning built in</h3>
<p>OpenSCAP with CIS Benchmark profiles, so posture checks are part of the image — not an afterthought.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="2" width="20" height="20" rx="3"/>
<rect x="6" y="6" width="12" height="12" rx="1.5" stroke-dasharray="3 2"/>
</svg>
</div>
<div>
<h3>Hardened by default</h3>
<p>The same hardened Debian base — lockdown-mode kernel, seccomp, AppArmor — as every edition.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<path d="M2 12h20"/>
</svg>
</div>
<div>
<h3>Zero telemetry</h3>
<p>No phone-home, no analytics, no cloud integration you didn't opt into.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="2" width="20" height="20" rx="3"/>
<path d="M12 2v20"/>
<path d="M2 12h20"/>
</svg>
</div>
<div>
<h3>Cloud-ready images</h3>
<p>Minimal images ready for AWS, GCP, Azure, or your own private cloud.</p>
</div>
</div>
</div>
</div>
</section>
<!-- What's Included -->
<section class="section section-alt">
<div class="section-inner">
<div class="section-label">What's Included</div>
<h2>A security posture you can ship.</h2>
<p class="section-desc">
Arcline Cloud images are built around a minimal footprint with runtime and
compliance security in the image itself.
</p>
<div class="security-grid">
<div class="stack-card">
<div class="stack-header">Base Image</div>
<ul>
<li>Minimal hardened Debian base</li>
<li>Small package footprint</li>
<li>btrfs root + snapshots</li>
</ul>
</div>
<div class="stack-card">
<div class="stack-header">Runtime Security</div>
<ul>
<li>Falco container / syscall detection</li>
<li>seccomp + AppArmor</li>
<li>Default-deny nftables</li>
</ul>
</div>
<div class="stack-card">
<div class="stack-header">Compliance</div>
<ul>
<li>OpenSCAP + CIS Benchmark profiles</li>
<li>syft + grype SBOM / CVE scanning</li>
<li>Lynis hardening score</li>
</ul>
</div>
<div class="stack-card">
<div class="stack-header">Platforms</div>
<ul>
<li>AWS</li>
<li>GCP</li>
<li>Azure</li>
<li>Private cloud</li>
</ul>
</div>
</div>
<div class="compliance-callout">
<div class="compliance-badge">Compliance-ready by default</div>
<p>
Arcline Cloud images ship CIS Benchmark-aligned by default, with OpenSCAP
scanning mapped toward <strong>HIPAA</strong>, <strong>PCI-DSS</strong>, and
<strong>SOC 2</strong> control families. The images themselves aren't certified —
only audited deployments can be — but the defaults give you a running start.
</p>
</div>
</div>
</section>
<!-- Other Editions -->
<section class="section">
<div class="section-inner">
<div class="section-label">Other Editions</div>
<h2>One hardened base. Three editions.</h2>
<p class="section-desc">
Every edition shares the same hardened Debian base and zero-telemetry guarantee.
</p>
<div class="edition-switcher">
<a href="/server" class="card-btn card-btn-secondary">Server</a>
<a href="/workstation" class="card-btn card-btn-secondary">Workstation</a>
<a href="/cloud" class="card-btn card-btn-primary" aria-current="page">Cloud</a>
</div>
</div>
</section>
<!-- Get Started -->
<section id="get-started" class="section section-alt">
<div class="section-inner">
<div class="section-label">Get Started</div>
<h2>Arcline Cloud is in active development.<br>Be there at the start.</h2>
<p class="section-desc">
We're building the ISO pipeline and hardening the defaults.
Sign up to receive early access and help shape the first release.
</p>
{{template "waitlistForm" .}}
</div>
</section>
</main>
{{template "footer" .}}
{{end}}

View File

@@ -1,47 +1,5 @@
{{define "content"}} {{define "content"}}
<a href="#main" class="skip-link">Skip to main content</a> {{template "nav" .}}
<header class="nav">
<div class="nav-inner">
<a href="/" class="logo">
<svg class="logo-icon" width="28" height="28" viewBox="0 0 32 32" fill="none">
<rect width="32" height="32" fill="#0b0c0e"/>
<path d="M5 27L16 5L27 27" fill="none" stroke="#f59e0b" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9 20H23" fill="none" stroke="#f59e0b" stroke-width="2.5" stroke-linecap="round"/>
</svg>
<span>Arcline Project</span>
</a>
<nav>
<a href="#editions">Editions</a>
<a href="#security">Security</a>
<a href="#about">About</a>
<a href="#contribute">Contribute</a>
<button
type="button"
data-theme-toggle
class="theme-toggle"
aria-label="Toggle theme"
title="Toggle light / dark mode"
>
<svg class="theme-icon theme-icon-light" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="5"/>
<line x1="12" y1="1" x2="12" y2="3"/>
<line x1="12" y1="21" x2="12" y2="23"/>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/>
<line x1="1" y1="12" x2="3" y2="12"/>
<line x1="21" y1="12" x2="23" y2="12"/>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>
</svg>
<svg class="theme-icon theme-icon-dark" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/>
</svg>
</button>
<a href="#get-started" class="nav-cta">Get Started</a>
</nav>
</div>
</header>
<main id="main"> <main id="main">
@@ -86,7 +44,7 @@
<p>A hardened, production-ready host for SOC and production use — built-in SIEM agent and network IDS on top of the hardened base, with zero telemetry.</p> <p>A hardened, production-ready host for SOC and production use — built-in SIEM agent and network IDS on top of the hardened base, with zero telemetry.</p>
<div class="card-actions"> <div class="card-actions">
<a href="#get-started" class="card-btn card-btn-primary">Get Access</a> <a href="#get-started" class="card-btn card-btn-primary">Get Access</a>
<a href="#about" class="card-btn card-btn-secondary">Learn More</a> <a href="/server" class="card-btn card-btn-secondary">Learn More</a>
</div> </div>
</div> </div>
@@ -102,7 +60,7 @@
<p>A security analyst / blue-team workstation — KDE Plasma, pre-configured dev toolchains, privacy-hardened browser, forensics-friendly tooling, and secrets scanning.</p> <p>A security analyst / blue-team workstation — KDE Plasma, pre-configured dev toolchains, privacy-hardened browser, forensics-friendly tooling, and secrets scanning.</p>
<div class="card-actions"> <div class="card-actions">
<a href="#get-started" class="card-btn card-btn-primary">Get Access</a> <a href="#get-started" class="card-btn card-btn-primary">Get Access</a>
<a href="#about" class="card-btn card-btn-secondary">Coming Soon</a> <a href="/workstation" class="card-btn card-btn-secondary">Learn More</a>
</div> </div>
</div> </div>
@@ -119,7 +77,7 @@
<p>Minimal cloud images with a small attack surface — Falco runtime security and CIS benchmark scanning built in. Ready for AWS, GCP, Azure, or private cloud.</p> <p>Minimal cloud images with a small attack surface — Falco runtime security and CIS benchmark scanning built in. Ready for AWS, GCP, Azure, or private cloud.</p>
<div class="card-actions"> <div class="card-actions">
<a href="#get-started" class="card-btn card-btn-primary">Get Access</a> <a href="#get-started" class="card-btn card-btn-primary">Get Access</a>
<a href="#about" class="card-btn card-btn-secondary">Learn More</a> <a href="/cloud" class="card-btn card-btn-secondary">Learn More</a>
</div> </div>
</div> </div>
</div> </div>
@@ -443,34 +401,7 @@
We're building the ISO pipeline and hardening the defaults. We're building the ISO pipeline and hardening the defaults.
Sign up to receive early access and help shape the first release. Sign up to receive early access and help shape the first release.
</p> </p>
<form {{template "waitlistForm" .}}
hx-post="/partials/waitlist"
hx-target="#waitlist-result"
hx-swap="outerHTML"
class="waitlist-form"
>
<fieldset class="edition-checkboxes">
<legend>I'm interested in:</legend>
<label class="edition-checkbox">
<input type="checkbox" name="edition" value="server" checked>
<span>Server</span>
</label>
<label class="edition-checkbox">
<input type="checkbox" name="edition" value="workstation">
<span>Workstation</span>
</label>
</fieldset>
<input
type="email"
name="email"
placeholder="you@example.com"
required
class="input"
>
<button type="submit" class="btn">Get Early Access</button>
</form>
<div id="waitlist-result"></div>
<p class="waitlist-note">No spam. No tracking. We'll only email you when there's something to try.</p>
</div> </div>
</section> </section>
@@ -490,39 +421,6 @@
</main> </main>
<footer class="footer"> {{template "footer" .}}
<div class="footer-grid">
<div class="footer-col">
<a href="/" class="footer-logo">Arcline Project</a>
<p>An open-source operating system for people who defend infrastructure. Hardened Debian base. Pre-configured security stack. Zero telemetry. Defense-ready.</p>
</div>
<div class="footer-col">
<h4>Editions</h4>
<ul>
<li><a href="#editions">Server</a></li>
<li><a href="#editions">Workstation</a></li>
<li><a href="#editions">Cloud</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Project</h4>
<ul>
<li><a href="#about">About</a></li>
<li><a href="#contribute">Contribute</a></li>
<li><a href="https://git.arcline.it">Source Code</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Connect</h4>
<ul>
<li><a href="https://arcline.it">Arcline IT</a></li>
<li><a href="https://git.arcline.it">Git</a></li>
</ul>
</div>
</div>
<div class="footer-bottom">
<p>&copy; 2026 Arcline IT LLC. GPL Licensed. No telemetry. No tracking.</p>
</div>
</footer>
{{end}} {{end}}

View File

@@ -0,0 +1,36 @@
{{define "footer"}}
<footer class="footer">
<div class="footer-grid">
<div class="footer-col">
<a href="/" class="footer-logo">Arcline Project</a>
<p>An open-source operating system for people who defend infrastructure. Hardened Debian base. Pre-configured security stack. Zero telemetry. Defense-ready.</p>
</div>
<div class="footer-col">
<h4>Editions</h4>
<ul>
<li><a href="/server">Server</a></li>
<li><a href="/workstation">Workstation</a></li>
<li><a href="/cloud">Cloud</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Project</h4>
<ul>
<li><a href="/#about">About</a></li>
<li><a href="/#contribute">Contribute</a></li>
<li><a href="https://git.arcline.it">Source Code</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Connect</h4>
<ul>
<li><a href="https://arcline.it">Arcline IT</a></li>
<li><a href="https://git.arcline.it">Git</a></li>
</ul>
</div>
</div>
<div class="footer-bottom">
<p>&copy; 2026 Arcline IT LLC. GPL Licensed. No telemetry. No tracking.</p>
</div>
</footer>
{{end}}

View File

@@ -0,0 +1,47 @@
{{define "nav"}}
<a href="#main" class="skip-link">Skip to main content</a>
<header class="nav">
<div class="nav-inner">
<a href="/" class="logo">
<svg class="logo-icon" width="28" height="28" viewBox="0 0 32 32" fill="none">
<rect width="32" height="32" fill="#0b0c0e"/>
<path d="M5 27L16 5L27 27" fill="none" stroke="#f59e0b" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9 20H23" fill="none" stroke="#f59e0b" stroke-width="2.5" stroke-linecap="round"/>
</svg>
<span>Arcline Project</span>
</a>
<nav>
<a href="/server"{{if eq .Active "server"}} class="nav-active" aria-current="page"{{end}}>Server</a>
<a href="/workstation"{{if eq .Active "workstation"}} class="nav-active" aria-current="page"{{end}}>Workstation</a>
<a href="/cloud"{{if eq .Active "cloud"}} class="nav-active" aria-current="page"{{end}}>Cloud</a>
<a href="/#about">About</a>
<a href="/#security">Security</a>
<a href="/#contribute">Contribute</a>
<button
type="button"
data-theme-toggle
class="theme-toggle"
aria-label="Toggle theme"
title="Toggle light / dark mode"
>
<svg class="theme-icon theme-icon-light" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="5"/>
<line x1="12" y1="1" x2="12" y2="3"/>
<line x1="12" y1="21" x2="12" y2="23"/>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/>
<line x1="1" y1="12" x2="3" y2="12"/>
<line x1="21" y1="12" x2="23" y2="12"/>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>
</svg>
<svg class="theme-icon theme-icon-dark" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/>
</svg>
</button>
<a href="#get-started" class="nav-cta">Get Started</a>
</nav>
</div>
</header>
{{end}}

View File

@@ -0,0 +1,34 @@
{{define "waitlistForm"}}
<form
hx-post="/partials/waitlist"
hx-target="#waitlist-result"
hx-swap="outerHTML"
class="waitlist-form"
>
<fieldset class="edition-checkboxes">
<legend>I'm interested in:</legend>
<label class="edition-checkbox">
<input type="checkbox" name="edition" value="server"{{if eq .Edition "server"}} checked{{end}}>
<span>Server</span>
</label>
<label class="edition-checkbox">
<input type="checkbox" name="edition" value="workstation"{{if eq .Edition "workstation"}} checked{{end}}>
<span>Workstation</span>
</label>
<label class="edition-checkbox">
<input type="checkbox" name="edition" value="cloud"{{if eq .Edition "cloud"}} checked{{end}}>
<span>Cloud</span>
</label>
</fieldset>
<input
type="email"
name="email"
placeholder="you@example.com"
required
class="input"
>
<button type="submit" class="btn">Get Early Access</button>
</form>
<div id="waitlist-result"></div>
<p class="waitlist-note">No spam. No tracking. We'll only email you when there's something to try.</p>
{{end}}

198
templates/server.html Normal file
View File

@@ -0,0 +1,198 @@
{{define "content"}}
{{template "nav" .}}
<main id="main">
<!-- Hero -->
<section class="hero hero-page">
<div class="hero-inner">
<p class="hero-sigil">// edition · server</p>
<h1>Arcline <span class="hero-highlight">Server</span></h1>
<p class="tagline">
A hardened, production-ready host for SOC and production use — built-in
SIEM agent and network IDS on top of the hardened Debian base, with
zero telemetry.
</p>
<div class="hero-actions">
<a href="#get-started" class="cta">Get Early Access</a>
<a href="/" class="cta-secondary">See all editions</a>
</div>
</div>
</section>
<!-- Overview -->
<section class="section">
<div class="section-inner">
<div class="section-label">Overview</div>
<h2>A production host that starts<br>defense-ready.</h2>
<p class="section-desc">
Arcline Server gives SOC teams and production workloads a hardened base and the
tooling to watch it — configured the way you'd do it yourself, if you had the weekend.
</p>
<div class="principles-grid">
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="3" width="18" height="18" rx="3"/>
<path d="M8 12l2.5 2.5L16 9"/>
</svg>
</div>
<div>
<h3>Hardened by default</h3>
<p>Lockdown-mode kernel, seccomp, AppArmor profiles, and a default-deny nftables firewall. You opt in to exposure — never out.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M2 12h20"/>
<path d="M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10"/>
</svg>
</div>
<div>
<h3>SIEM-ready</h3>
<p>A pre-configured Wazuh agent ships host and integrity telemetry straight to your SIEM out of the box.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="3"/>
<path d="M12 2L22 8.5v7L12 22 2 15.5v-7L12 2z"/>
</svg>
</div>
<div>
<h3>Network IDS</h3>
<p>Suricata (or Zeek) watches for malicious traffic — not just uptime.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="2" width="20" height="20" rx="3"/>
<rect x="6" y="6" width="12" height="12" rx="1.5" stroke-dasharray="3 2"/>
</svg>
</div>
<div>
<h3>Rollback built in</h3>
<p>btrfs root with subvolume snapshots, compression, and boot-to-snapshot rollback.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<path d="M12 6v6l4 2"/>
</svg>
</div>
<div>
<h3>Observable</h3>
<p>Prometheus node_exporter, Grafana dashboards, and Loki log aggregation — pre-configured.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<path d="M2 12h20"/>
</svg>
</div>
<div>
<h3>Zero telemetry</h3>
<p>No analytics, no phone-home, no cloud integration you didn't ask for. Your host talks to you, and no one else.</p>
</div>
</div>
</div>
</div>
</section>
<!-- What's Included -->
<section class="section section-alt">
<div class="section-inner">
<div class="section-label">What's Included</div>
<h2>Everything a defended server needs.</h2>
<p class="section-desc">
Arcline Server ships the base, the watchdogs, and the dashboards — pre-configured and documented.
</p>
<div class="security-grid">
<div class="stack-card">
<div class="stack-header">Base System</div>
<ul>
<li>Hardened Debian base</li>
<li>Lockdown-mode kernel + seccomp</li>
<li>btrfs root + snapshot rollback</li>
<li>nftables firewall (default-deny)</li>
</ul>
</div>
<div class="stack-card">
<div class="stack-header">Security Stack</div>
<ul>
<li>Wazuh agent (pre-configured)</li>
<li>Suricata / Zeek network IDS</li>
<li>OpenSCAP + CIS Benchmark profiles</li>
<li>Lynis hardening score</li>
</ul>
</div>
<div class="stack-card">
<div class="stack-header">Observability</div>
<ul>
<li>Prometheus node_exporter</li>
<li>Grafana dashboards</li>
<li>Loki log aggregation</li>
<li>Pre-built alerting rules</li>
</ul>
</div>
<div class="stack-card">
<div class="stack-header">Containers</div>
<ul>
<li>Docker + Podman</li>
<li>syft + grype SBOM / CVE scanning</li>
<li>ClamAV baseline scanning</li>
</ul>
</div>
</div>
<div class="compliance-callout">
<div class="compliance-badge">Compliance-ready by default</div>
<p>
Arcline Server ships CIS Benchmark-aligned by default, with OpenSCAP
scanning mapped toward <strong>HIPAA</strong>, <strong>PCI-DSS</strong>, and
<strong>SOC 2</strong> control families. The OS itself isn't certified —
only audited deployments can be — but the defaults give you a running start.
</p>
</div>
</div>
</section>
<!-- Other Editions -->
<section class="section">
<div class="section-inner">
<div class="section-label">Other Editions</div>
<h2>One hardened base. Three editions.</h2>
<p class="section-desc">
Every edition shares the same hardened Debian base and zero-telemetry guarantee.
</p>
<div class="edition-switcher">
<a href="/server" class="card-btn card-btn-primary" aria-current="page">Server</a>
<a href="/workstation" class="card-btn card-btn-secondary">Workstation</a>
<a href="/cloud" class="card-btn card-btn-secondary">Cloud</a>
</div>
</div>
</section>
<!-- Get Started -->
<section id="get-started" class="section section-alt">
<div class="section-inner">
<div class="section-label">Get Started</div>
<h2>Arcline Server is in active development.<br>Be there at the start.</h2>
<p class="section-desc">
We're building the ISO pipeline and hardening the defaults.
Sign up to receive early access and help shape the first release.
</p>
{{template "waitlistForm" .}}
</div>
</section>
</main>
{{template "footer" .}}
{{end}}

202
templates/workstation.html Normal file
View File

@@ -0,0 +1,202 @@
{{define "content"}}
{{template "nav" .}}
<main id="main">
<!-- Hero -->
<section class="hero hero-page">
<div class="hero-inner">
<p class="hero-sigil">// edition · workstation</p>
<h1>Arcline <span class="hero-highlight">Workstation</span></h1>
<p class="tagline">
A security analyst / blue-team workstation — KDE Plasma, pre-configured
dev toolchains, a privacy-hardened browser, forensics-friendly tooling,
and secrets scanning.
</p>
<div class="hero-actions">
<a href="#get-started" class="cta">Get Early Access</a>
<a href="/" class="cta-secondary">See all editions</a>
</div>
</div>
</section>
<!-- Overview -->
<section class="section">
<div class="section-inner">
<div class="section-label">Overview</div>
<h2>Built for the people on<br>the front line.</h2>
<p class="section-desc">
Arcline Workstation pairs a hardened base with the tools analysts and
security-minded developers use every day — without the telemetry that
most desktops quietly ship.
</p>
<div class="principles-grid">
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2"/>
<path d="M8 21h8"/>
<path d="M12 17v4"/>
</svg>
</div>
<div>
<h3>KDE Plasma desktop</h3>
<p>A lightweight, fully configurable desktop — tuned for long working sessions.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"/>
<path d="M2 12h20"/>
</svg>
</div>
<div>
<h3>Privacy-hardened browser</h3>
<p>A browser profile locked down out of the box — no tracking, no telemetry, no surprises.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="3" width="18" height="18" rx="3"/>
<path d="M8 12l2.5 2.5L16 9"/>
</svg>
</div>
<div>
<h3>Secrets scanning</h3>
<p>gitleaks and trufflehog pre-configured — catch leaked keys before they ship.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 7h16v12H4V7z"/>
<path d="M8 3v4"/>
<path d="M16 3v4"/>
<path d="M4 13h16" stroke-dasharray="2 1"/>
</svg>
</div>
<div>
<h3>Dev toolchains ready</h3>
<p>Go, Rust, Python, and Node.js toolchains pre-configured. Git, Make, and LLVM/Clang included.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="3"/>
<path d="M12 2L22 8.5v7L12 22 2 15.5v-7L12 2z"/>
</svg>
</div>
<div>
<h3>Forensics-friendly</h3>
<p>Tooling and a disk layout that make analysis and evidence handling straightforward.</p>
</div>
</div>
<div class="principle">
<div class="principle-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="3" width="18" height="18" rx="3"/>
<path d="M8 12l2.5 2.5L16 9"/>
</svg>
</div>
<div>
<h3>Hardened base</h3>
<p>The same hardened Debian base, btrfs snapshots, and default-deny firewall as every edition.</p>
</div>
</div>
</div>
</div>
</section>
<!-- What's Included -->
<section class="section section-alt">
<div class="section-inner">
<div class="section-label">What's Included</div>
<h2>An analyst's desk, pre-configured.</h2>
<p class="section-desc">
Everything a blue-team or security-conscious developer needs to be productive on day one.
</p>
<div class="security-grid">
<div class="stack-card">
<div class="stack-header">Desktop</div>
<ul>
<li>KDE Plasma</li>
<li>Privacy-hardened browser profile</li>
<li>Forensics-friendly tooling</li>
</ul>
</div>
<div class="stack-card">
<div class="stack-header">Development</div>
<ul>
<li>Go, Rust, Python, Node.js</li>
<li>Git, Make, CMake, LLVM/Clang</li>
<li>VS Code / Helix / Vim configs</li>
<li>Docker / Podman</li>
</ul>
</div>
<div class="stack-card">
<div class="stack-header">Security</div>
<ul>
<li>gitleaks + trufflehog secrets scanning</li>
<li>ClamAV baseline scanning</li>
<li>Lynis hardening score</li>
<li>OpenSCAP + CIS profiles</li>
</ul>
</div>
<div class="stack-card">
<div class="stack-header">Base System</div>
<ul>
<li>Hardened Debian base</li>
<li>Lockdown-mode kernel + seccomp</li>
<li>btrfs root + snapshot rollback</li>
<li>Zero telemetry</li>
</ul>
</div>
</div>
<div class="compliance-callout">
<div class="compliance-badge">Compliance-ready by default</div>
<p>
Arcline Workstation ships CIS Benchmark-aligned by default, with OpenSCAP
scanning mapped toward <strong>HIPAA</strong>, <strong>PCI-DSS</strong>, and
<strong>SOC 2</strong> control families. The OS itself isn't certified —
only audited deployments can be — but the defaults give you a running start.
</p>
</div>
</div>
</section>
<!-- Other Editions -->
<section class="section">
<div class="section-inner">
<div class="section-label">Other Editions</div>
<h2>One hardened base. Three editions.</h2>
<p class="section-desc">
Every edition shares the same hardened Debian base and zero-telemetry guarantee.
</p>
<div class="edition-switcher">
<a href="/server" class="card-btn card-btn-secondary">Server</a>
<a href="/workstation" class="card-btn card-btn-primary" aria-current="page">Workstation</a>
<a href="/cloud" class="card-btn card-btn-secondary">Cloud</a>
</div>
</div>
</section>
<!-- Get Started -->
<section id="get-started" class="section section-alt">
<div class="section-inner">
<div class="section-label">Get Started</div>
<h2>Arcline Workstation is in active development.<br>Be there at the start.</h2>
<p class="section-desc">
We're building the ISO pipeline and hardening the defaults.
Sign up to receive early access and help shape the first release.
</p>
{{template "waitlistForm" .}}
</div>
</section>
</main>
{{template "footer" .}}
{{end}}