Skip to content

Commit 873b7b8

Browse files
authored
🐛 fix(website): sync live site to shipped v1.4.1 (#132)
* 🐛 fix(website): sync live site to shipped v1.4.1 The production getsockguard.com was stuck showing v1.3.0 as the current release. Bring every marketing surface up to what actually shipped. - 🔖 fix(website): hero version badge 1.3.0 → 1.4.1 - 📝 docs(website): roadmap — v1.4.0 released, v1.5.0 now the next milestone - 📝 docs(website): FAQ — remote-daemon TLS + Tecnativa compat as shipped, not upcoming - 📝 docs(website): comparison rows + CetusGuard page — remote daemon upstream ships now - 🧪 test(website): page-data roadmap assertion tracks v1.4.0 released / v1.5.0 next Excludes the 15→17 preset-count bump (v1.5-only; main ships 15). * 🧪 test(website): assert v1.5.0 is the next roadmap milestone Addresses CodeRabbit — the existence check alone still passed if the status drifted to planned/released. Pin it to next.
1 parent 85b7416 commit 873b7b8

6 files changed

Lines changed: 24 additions & 18 deletions

File tree

website/src/app/data/comparison-rows.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ export const comparisonRows: ComparisonRow[] = [
7272
wollomatic: "No",
7373
elevenNotes: "No",
7474
cetusguard: "Yes",
75-
sockguard: "v1.4",
76-
planned: true,
75+
sockguard: "Yes (active/passive failover)",
7776
},
7877
{
7978
feature: "Read-side visibility / redaction",

website/src/app/data/faq.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const faqItems: Array<{ question: string; answer: string }> = [
1717
{
1818
question: "Can Sockguard listen over TCP, and is remote access secure?",
1919
answer:
20-
"Yes. Sockguard can listen on a TCP port in addition to (or instead of) a unix socket. For any non-loopback TCP listener we require mutual TLS 1.3 by default — plaintext remote TCP needs two explicit insecure acknowledgement flags before we accept it. Client identity on TCP is established via mTLS certificate selectors (CN, DNS/IP/URI SAN, SHA-256 SPKI pin). The upcoming v1.4.0 release (in release-candidate testing now) adds dialing a remote Docker daemon over TCP with mTLS and automatic endpoint failover.",
20+
"Yes. Sockguard can listen on a TCP port in addition to (or instead of) a unix socket. For any non-loopback TCP listener we require mutual TLS 1.3 by default — plaintext remote TCP needs two explicit insecure acknowledgement flags before we accept it. Client identity on TCP is established via mTLS certificate selectors (CN, DNS/IP/URI SAN, SHA-256 SPKI pin). Sockguard can also dial a remote Docker daemon over TCP with mTLS and automatic endpoint failover (added in v1.4.0).",
2121
},
2222
{
2323
question: "What are signed policy bundles and container image trust?",
@@ -32,6 +32,6 @@ export const faqItems: Array<{ question: string; answer: string }> = [
3232
{
3333
question: "How do I migrate from Tecnativa's docker-socket-proxy?",
3434
answer:
35-
"We match Tecnativa's full environment-variable surface — CONTAINERS, EVENTS, SERVICES, NETWORKS, VOLUMES, TASKS, NODES, CONFIGS, SECRETS, ALLOW_RESTARTS, SOCKET_PATH, LOG_LEVEL, and the full section-variable set. Point DOCKER_HOST at the Sockguard socket instead of Tecnativa's and your existing env config continues to work. The shipped 'tecnativa-compatible' preset covers the same allow surface. Once migrated you can layer on body inspection, per-client profiles, and signed policies incrementally without breaking running workloads — use a profile in warn mode to measure what would have been denied before flipping to enforce.",
35+
"We match Tecnativa's full environment-variable surface — CONTAINERS, EVENTS, SERVICES, NETWORKS, VOLUMES, TASKS, NODES, CONFIGS, SECRETS, ALLOW_RESTARTS, SOCKET_PATH, LOG_LEVEL, and the full section-variable set. Point DOCKER_HOST at the Sockguard socket instead of Tecnativa's and your existing env config continues to work. Sockguard's built-in Tecnativa env-var compatibility layer covers the same allow surface. Once migrated you can layer on body inspection, per-client profiles, and signed policies incrementally without breaking running workloads — use a profile in warn mode to measure what would have been denied before flipping to enforce.",
3636
},
3737
];

website/src/app/page-data.test.mjs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,17 @@ test("website comparison rows live in extracted data modules", () => {
7676
test("roadmap data is valid and matches expected milestones", () => {
7777
assert.ok(roadmap.length > 0, "roadmap must be non-empty");
7878

79-
// Latest released milestone must be v1.3.0
79+
// Latest released milestone must be v1.4.0 (v1.4.0/v1.4.1 shipped 2026-07-10)
8080
const releasedMilestones = roadmap.filter((m) => m.status === "released");
8181
assert.ok(releasedMilestones.length > 0, "must have at least one released milestone");
8282
const latestReleased = releasedMilestones[releasedMilestones.length - 1];
83-
assert.equal(latestReleased.version, "v1.3.0", "latest released milestone must be v1.3.0");
83+
assert.equal(latestReleased.version, "v1.4.0", "latest released milestone must be v1.4.0");
8484
assert.equal(latestReleased.status, "released");
8585

86-
// Must reference v1.4.0
87-
const v140 = roadmap.find((m) => m.version === "v1.4.0");
88-
assert.ok(v140, "roadmap must include a v1.4.0 milestone");
86+
// Must reference the current in-progress milestone v1.5.0
87+
const v150 = roadmap.find((m) => m.version === "v1.5.0");
88+
assert.ok(v150, "roadmap must include a v1.5.0 milestone");
89+
assert.equal(v150.status, "next", "v1.5.0 must be the next milestone");
8990

9091
// Every milestone must have a non-empty items array
9192
for (const milestone of roadmap) {

website/src/lib/comparison-route-data/cetusguard.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export const cetusguardComparisonRouteData = {
77
Method + path filtering|Yes (regex)|Yes|tie
88
Remote TCP mTLS listener|Yes|Yes (TLS 1.3)|tie
99
Regex path rules|Yes|Yes|tie
10-
Remote daemon upstream (TLS)|Yes (in production)|Planned (v1.4)|competitor
10+
Remote daemon upstream (TLS)|Yes (in production)|Yes (active/passive failover)|self
1111
Config simplicity|Compact rule files|Full YAML config|competitor
1212
Request body inspection|No|Yes (12+ resource types)|self
1313
Per-client policies|No|CIDR + labels + cert selectors + SPKI + unix peer|self
@@ -60,7 +60,8 @@ layers|Rollout Modes|Sockguard's per-profile rollout modes (enforce / warn / aud
6060
request body inspection, per-client certificate selectors, signed policy bundles, and
6161
Prometheus metrics
6262
</strong>
63-
. Remote daemon TLS is on the v1.4 roadmap — CetusGuard ships it today.
63+
. Sockguard now ships remote daemon TLS too — with health-checked active/passive failover
64+
across redundant endpoints, which CetusGuard doesn't have.
6465
</p>
6566
),
6667
migrationTitle: "Coming from CetusGuard?",

website/src/lib/site-config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const SITE_CONFIG = {
1515
/** Brand name shown in the header, footer, and metadata. */
1616
name: "Sockguard",
1717
/** Current release version shown in the hero badge. */
18-
version: "1.3.0",
18+
version: "1.4.1",
1919
/** Short product tagline used in page titles and OG metadata. */
2020
tagline: "Control what gets through",
2121
/** Default meta / OpenGraph / Twitter description. */

website/src/lib/site-content.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export const roadmap: Milestone[] = [
7171
version: "v1.4.0",
7272
title: "Remote Upstreams & Fleet Presets",
7373
emoji: "🌐",
74-
status: "next",
74+
status: "released",
7575
items: [
7676
"Remote Docker daemon over TCP with mutual TLS and active/passive failover",
7777
"Ordered endpoint failover — connect failure instantly promotes next endpoint without retry",
@@ -84,13 +84,18 @@ export const roadmap: Milestone[] = [
8484
},
8585
{
8686
version: "v1.5.0",
87-
title: "Policy Management & Developer Experience",
87+
title: "Safer Defaults & Namespace Hardening",
8888
emoji: "🔧",
89-
status: "planned",
89+
status: "next",
9090
items: [
91-
"Policy diff: validate a candidate config against the running policy without a hot-reload",
92-
"OpenTelemetry / OTLP trace export (W3C traceparent already wired; exporter planned)",
93-
"Additional bundled presets and ready-to-run compose examples",
91+
"upstream.request_timeout now defaults to 60s (was unlimited); 'off' restores unlimited",
92+
"ownership.allow_cross_owner_namespace_sharing defaults to false — cross-owner container:<id> namespace joins denied by default when ownership.owner is set",
93+
"Namespace-sharing gate: restrict_namespace_sharing + allowed_namespace_sharing_containers gate container:<id> joins across NetworkMode/PidMode/IpcMode/UsernsMode; deny_namespace_path_mode blocks raw ns:<path> on NetworkMode only",
94+
"require_cpu_limit_hard — opt-in hard CPU-time cap (NanoCpus/CpuQuota), independent of require_cpu_limit",
95+
"Exec Env allow/denylisting — request_body.exec.allowed_env_vars/denied_env_vars, denylist wins",
96+
"New presets: portwing-with-compose.yaml, drydock-with-compose.yaml, plus a tri-tool compose example",
97+
"Helm chart: pod-level podSecurityContext",
98+
"Config Viper-default registration generated by reflection off Defaults()",
9499
],
95100
},
96101
];

0 commit comments

Comments
 (0)