Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
786 lines (734 loc) · 44.5 KB
/
Copy pathindex.html
File metadata and controls
786 lines (734 loc) · 44.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="google-site-verification" content="5gdbox0Q_wbktke-19hYoCBIcnkvSwL-Vssron53sCU" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="LogForge is a self-hosted Docker dashboard for real-time logs, alert rules, notifications, file access, safe remediation, and an AI agent for Docker operations tasks." />
<title>LogForge - Docker Alerts That Fix Themselves</title>
<link rel="canonical" href="https://www.logforge.dev/" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@600;700;800&family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet" />
<link rel="icon" href="assets/logo-32x32.ico" type="image/x-icon" />
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<div class="page-grid" aria-hidden="true"></div>
<header class="site-header">
<a class="brand" href="#top" aria-label="LogForge home">
<img src="assets/logforge-Icon-transparent-512x512.png" alt="" />
<span>LogForge</span>
</a>
<nav class="site-nav" aria-label="Primary navigation">
<a href="#flow">Live flow</a>
<a href="#incident">Incident delta</a>
<a href="#compare">Compare</a>
<a href="#templates">Templates</a>
<a href="blog/">Blog</a>
<a href="cirdan.html">Cirdan</a>
<a href="#premium">Premium</a>
<a href="#install">Install</a>
</nav>
<a class="header-cta" href="https://github.com/log-forge/logforge" target="_blank" rel="noopener noreferrer">GitHub</a>
</header>
<main id="top">
<section class="hero" aria-labelledby="hero-title">
<div class="hero-copy">
<p class="mono-label">// docker.control</p>
<h1 id="hero-title">Docker alerts that fix themselves</h1>
<p class="hero-subhead">Self-hosted Docker dashboard for local and agent-forwarded logs, alert rules, notifications, file access, safe remediation, and AI agent tasks for Docker operations.</p>
<div class="action-row" aria-label="Primary actions">
<a class="button button-primary" href="#install">Install LogForge</a>
<a class="button button-secondary" href="https://github.com/log-forge/logforge" target="_blank" rel="noopener noreferrer">View GitHub</a>
</div>
<p class="demo-callout">
Want the operator walkthrough?
<a href="https://calendly.com/madanb1313/logforge-demo" target="_blank" rel="noopener noreferrer">Book a demo</a>
</p>
<div class="signal-strip" aria-label="Product capabilities">
<span>logs</span>
<span>alert rules</span>
<span>notifiers</span>
<span>guarded fixes</span>
<span>AI agent</span>
<span>edge agents</span>
</div>
</div>
<aside class="control-room" aria-label="Live Docker control room">
<div class="window-bar">
<span class="window-dot"></span>
<span class="window-dot"></span>
<span class="window-dot"></span>
<span class="window-title">logforge://control-room</span>
<span class="window-status">live</span>
</div>
<div class="room-grid">
<section class="console-panel service-map" aria-label="Container status">
<div class="panel-heading">
<span>// containers</span>
<strong>4 online</strong>
</div>
<div class="container-list">
<article>
<span class="status-dot ok"></span>
<div>
<strong>api-gateway</strong>
<span>healthy | 18ms p95</span>
</div>
<em>stable</em>
</article>
<article class="is-hot">
<span class="status-dot warn"></span>
<div>
<strong>worker-02</strong>
<span>restart loop | 5 events</span>
</div>
<em>alert</em>
</article>
<article>
<span class="status-dot ok"></span>
<div>
<strong>postgres</strong>
<span>local volume | 72% disk</span>
</div>
<em>watch</em>
</article>
</div>
</section>
<section class="console-panel log-panel" aria-label="Live log stream">
<div class="panel-heading">
<span>// live.logs</span>
<strong>worker-02</strong>
</div>
<ol id="hero-log-stream" class="log-stream" aria-live="polite"></ol>
</section>
<section class="console-panel rule-panel" aria-label="Alert rule evaluation">
<div class="panel-heading">
<span>// alert.delta</span>
<strong>matched</strong>
</div>
<pre><code>rule "oom_guard"
match: /OutOfMemoryError|restart loop/
window: 3 events / 60 sec
notify: slack, gotify, webhook
action: restart container
guard: cooldown 10m + backoff</code></pre>
</section>
<section class="console-panel timeline-panel" aria-label="Notification and remediation timeline">
<div class="panel-heading">
<span>// remediation.timeline</span>
<strong>30 sec</strong>
</div>
<ol>
<li><span>00:01</span> threshold crossed</li>
<li><span>00:04</span> Slack + Gotify dispatched</li>
<li><span>00:10</span> cooldown gate checked</li>
<li><span>00:28</span> restart executed safely</li>
</ol>
</section>
</div>
</aside>
</section>
<section class="proof-band" aria-label="Company proof">
<p>Used by Developers at</p>
<div class="company-chips">
<span>Cisco</span>
<span>Netflix</span>
<span>Microsoft</span>
<span>Amazon</span>
</div>
</section>
<section id="incident" class="section incident-section" aria-labelledby="incident-title">
<div class="section-kicker">
<p class="mono-label">// incident.delta</p>
<h2 id="incident-title">Container incident. Minute one. Without vs with LogForge.</h2>
</div>
<div class="delta-grid">
<article class="delta-card without-card">
<div class="delta-head">
<span>WITHOUT LOGFORGE</span>
<strong>45 min</strong>
</div>
<h3>SSH, scroll, guess, restart.</h3>
<ul>
<li>SSH into the host after users report errors.</li>
<li>Run <code>docker logs</code> and scan for the first useful stack trace.</li>
<li>Miss the alert window while checking the wrong container.</li>
<li>Run <code>grep</code> to search for the keyword.</li>
<li>Manually restart and hope it was the right fix.</li>
</ul>
</article>
<article class="delta-card with-card">
<div class="delta-head">
<span>WITH LOGFORGE</span>
<strong>30 sec</strong>
</div>
<h3>Rule fires, route sends, guard fixes.</h3>
<ul>
<li>Alert rule catches <code>OutOfMemoryError</code> and restart loops.</li>
<li>Notifier sends to Slack, Discord, Telegram, Gotify, Teams, Pushover, SMS, email, or webhook.</li>
<li>Gatekeeper applies cooldown and backoff before restart, stop, kill, start, or script action.</li>
<li>AI Agent explains likely cause and suggests scoped fixes before repeated incidents spread.</li>
<li>Alert history records the event, action, and final outcome.</li>
</ul>
</article>
</div>
</section>
<section id="flow" class="section flow-section" aria-labelledby="flow-title">
<div class="section-intro">
<p class="mono-label">// live.pipeline</p>
<h2 id="flow-title">The operational loop, rendered live.</h2>
<p>Docker log tailing is the default collection path on each host or enrolled agent, and agents can forward logs and Docker events into central LogForge. From there, rules match logs, rates, metrics, missing signals, and Docker events; the alert engine checks the timeline, notifiers route the signal, and the gatekeeper controls remediation.</p>
</div>
<div class="flow-console">
<div class="flow-rail" aria-label="Flow stages">
<button class="flow-node is-active" type="button" data-flow-step="0">
<span>01</span>
<strong>ingest</strong>
</button>
<button class="flow-node" type="button" data-flow-step="1">
<span>02</span>
<strong>match</strong>
</button>
<button class="flow-node" type="button" data-flow-step="2">
<span>03</span>
<strong>evaluate</strong>
</button>
<button class="flow-node" type="button" data-flow-step="3">
<span>04</span>
<strong>notify</strong>
</button>
<button class="flow-node" type="button" data-flow-step="4">
<span>05</span>
<strong>remediate</strong>
</button>
</div>
<div class="flow-stage">
<div class="flow-visual" aria-hidden="true">
<span class="packet packet-one"></span>
<span class="packet packet-two"></span>
<span class="packet packet-three"></span>
<div class="flow-column">
<span>ingest</span>
<strong>tail + forward</strong>
</div>
<div class="flow-column">
<span>rules</span>
<strong>signals / custom</strong>
</div>
<div class="flow-column">
<span>engine</span>
<strong>threshold</strong>
</div>
<div class="flow-column">
<span>route</span>
<strong>9 channels</strong>
</div>
<div class="flow-column">
<span>gate</span>
<strong>safe action</strong>
</div>
</div>
<div class="flow-detail">
<div>
<span class="mono-label" id="flow-step-label">// ingest.paths</span>
<h3 id="flow-step-title">Docker logs enter from hosts and agents.</h3>
<p id="flow-step-copy">Tail Docker logs by default on each host or enrolled agent, then forward logs and Docker events from agents into a central LogForge host.</p>
</div>
<pre><code id="flow-step-code">host: docker://worker-02 tail
agent: edge-agent-01 tail + forward
state: ingested
next: rules.match</code></pre>
</div>
</div>
</div>
</section>
<section id="use-cases" class="section use-case-section" aria-labelledby="use-case-title">
<div class="section-intro compact">
<p class="mono-label">// operator.tabs</p>
<h2 id="use-case-title">Use cases by operator mode.</h2>
</div>
<div class="tabs" data-tabs>
<div class="tab-list" role="tablist" aria-label="LogForge use cases">
<button class="tab-button is-active" id="tab-home" type="button" role="tab" aria-selected="true" aria-controls="panel-home" data-tab="home">Home lab operator</button>
<button class="tab-button" id="tab-solo" type="button" role="tab" aria-selected="false" aria-controls="panel-solo" data-tab="solo">Solo developer</button>
<button class="tab-button" id="tab-platform" type="button" role="tab" aria-selected="false" aria-controls="panel-platform" data-tab="platform">Platform team</button>
<button class="tab-button" id="tab-msp" type="button" role="tab" aria-selected="false" aria-controls="panel-msp" data-tab="msp">MSP/consultant</button>
</div>
<div class="tab-panels">
<article class="tab-panel is-active" id="panel-home" role="tabpanel" aria-labelledby="tab-home" data-tab-panel="home">
<div>
<p class="mono-label">// home.lab</p>
<h3>Catch container drift before a side project goes quiet.</h3>
<p>Monitor NAS apps, media services, dashboards, and local automations from one browser surface.</p>
</div>
<pre><code>query: containers where restart_count > 3 in 10m
result: plex-worker entered restart loop
route: gotify + email
action: restart after cooldown</code></pre>
</article>
<article class="tab-panel" id="panel-solo" role="tabpanel" aria-labelledby="tab-solo" data-tab-panel="solo" hidden>
<div>
<p class="mono-label">// solo.dev</p>
<h3>Keep local services honest while you ship.</h3>
<p>Use templates or custom rules for logs, rates, metrics, and container events that normally vanish in a terminal tab you closed an hour ago.</p>
</div>
<pre><code>query: logs contains "database connection refused"
result: api cannot reach postgres
route: desktop webhook + slack
action: run ./scripts/reconnect-db.sh</code></pre>
</article>
<article class="tab-panel" id="panel-platform" role="tabpanel" aria-labelledby="tab-platform" data-tab-panel="platform" hidden>
<div>
<p class="mono-label">// platform.team</p>
<h3>Give developers a Docker-native incident console.</h3>
<p>Run a central LogForge host that consumes forwarded logs from enrolled agents, standardizes alert rules, and keeps remediation visible without handing every workflow to a cloud APM.</p>
</div>
<pre><code>query: service=checkout severity=error rate > 20/min
source: agents=edge-a, edge-b
result: error flood confirmed across 2 hosts
route: teams + pager webhook
action: block repeated restarts for 10m</code></pre>
</article>
<article class="tab-panel" id="panel-msp" role="tabpanel" aria-labelledby="tab-msp" data-tab-panel="msp" hidden>
<div>
<p class="mono-label">// consultant.ops</p>
<h3>Operate client Docker edges from one trusted host.</h3>
<p>Enroll trusted agents per client or site, forward logs into central LogForge, and use alert history as the handoff record.</p>
</div>
<pre><code>query: client=edge-node disk_free < 12%
source: agent://client-a-edge-03
result: low disk on docker volume
route: pushover + webhook
action: run guarded cleanup script</code></pre>
</article>
</div>
</div>
</section>
<section id="ai-remediation" class="section ai-section" aria-labelledby="ai-agent-title">
<div class="section-intro">
<p class="mono-label">// ai.agent.chat</p>
<h2 id="ai-agent-title">The AI-native ingestion and control plane for Docker infrastructure.</h2>
<p>LogForge ingests logs, Docker events, containers, incidents, deploy history, ownership, code, and docs into an AI-native infrastructure layer built for agents first. Operators chat for reports, explanations, incident investigation, and guarded remediation, while LogForge compacts live operational state into structured, source-linked context the agent can reason over. Local models connect through Ollama, and control-plane actions remain governed by policy and operator approval.</p>
</div>
<div class="ai-agent-theater" aria-label="LogForge AI Agent animated chat demo">
<div class="window-bar">
<span class="window-dot"></span>
<span class="window-dot"></span>
<span class="window-dot"></span>
<span class="window-title">logforge://ai-agent/report</span>
<span class="window-status">traversing</span>
</div>
<div class="ai-theater-body">
<div class="thinking-graph" aria-hidden="true">
<span class="graph-line line-one"></span>
<span class="graph-line line-two"></span>
<span class="graph-line line-three"></span>
<span class="graph-line line-four"></span>
<span class="graph-line line-five"></span>
<span class="graph-line line-six"></span>
<span class="graph-line line-seven"></span>
<span class="graph-node graph-logs">logs</span>
<span class="graph-node graph-events">events</span>
<span class="graph-node graph-containers">containers</span>
<span class="graph-node graph-deploys">deploys</span>
<span class="graph-node graph-code">code</span>
<span class="graph-node graph-incidents">incidents</span>
<span class="graph-node graph-owners">owners</span>
<span class="graph-node graph-ollama">ollama</span>
</div>
<div class="agent-chat-demo">
<div class="chat-transcript" aria-label="Agent chat transcript">
<article class="chat-message operator-message">
<span class="chat-role">operator</span>
<p>For all frontend services on the production machine in the last 6 months, provide an error report, compare it with the previous 6 months, and add the delta.</p>
</article>
<article class="chat-message agent-thinking">
<span class="chat-role">LogForge AI Agent</span>
<p>
Traversing live operations graph
<span class="typing-dots" aria-hidden="true"><span></span><span></span><span></span></span>
</p>
<ul class="agent-trace" aria-label="Context being retrieved">
<li>logs</li>
<li>Docker events</li>
<li>deploy windows</li>
<li>incidents</li>
<li>owners</li>
<li>code/docs</li>
</ul>
</article>
<section class="agent-report" aria-label="AI agent output summary">
<div class="agent-report-header">
<div>
<span class="report-kicker">// output.summary</span>
<h3>Frontend error report</h3>
<p>Production frontend services, last 6 months compared with the previous 6 months.</p>
</div>
<strong>ready</strong>
</div>
<div class="report-service-list" aria-label="Service-level error deltas">
<article>
<div>
<strong>web-ui</strong>
<span>3,482 vs 2,471 errors</span>
</div>
<em class="delta-up">+41%</em>
</article>
<article>
<div>
<strong>checkout-frontend</strong>
<span>1,214 vs 754 errors</span>
</div>
<em class="delta-up">+61%</em>
</article>
<article>
<div>
<strong>admin-console</strong>
<span>386 vs 472 errors</span>
</div>
<em class="delta-down">-18%</em>
</article>
</div>
<div class="report-findings">
<article>
<span>likely contributors</span>
<p>Most of the increase clusters around the February 14, 2026 auth-cache deploy and incident LF-2407, then tails off after the March 3, 2026 retry rule change.</p>
</article>
<article>
<span>recommended next steps</span>
<p>Review <code>src/routes/session.ts</code>, raise the checkout timeout alert threshold, and queue a guarded nginx reload playbook for operator approval.</p>
</article>
</div>
<div class="source-pills" aria-label="Source-linked evidence">
<span>log:error-family/auth-timeout</span>
<span>deploy:web-ui@2026.02.14</span>
<span>incident:LF-2407</span>
<span>owner:frontend-platform</span>
</div>
</section>
</div>
<aside class="agent-context-rail" aria-label="Behind-the-scenes graph context benefits">
<article>
<span>complete operational recall</span>
<p>Past alerts, incidents, owners, deploys, and related services stay connected to the next question.</p>
</article>
<article>
<span>relationship-aware investigation</span>
<p>The agent traverses from a log family to containers, Docker events, code paths, docs, and deploy windows.</p>
</article>
<article>
<span>incremental live context</span>
<p>New logs and events update the graph without making the operator rebuild context by hand.</p>
</article>
<article>
<span>local model connectivity with Ollama</span>
<p>Keep operational context private to your LogForge deployment while routing agent tasks to local models.</p>
</article>
<article class="agent-follow-up-prompt" aria-label="LogForge AI Agent follow-up prompt">
<div class="follow-up-agent-row">
<span class="follow-up-avatar" aria-hidden="true">AI</span>
<div class="follow-up-agent-meta">
<strong>LogForge AI Agent</strong>
<span>next agent action</span>
</div>
</div>
<div class="follow-up-bubble">
<p>Would you like me to create this as a PDF report and send it to your email, or schedule these reports from now on?</p>
</div>
<div class="follow-up-chat-bar" aria-hidden="true">
<span>Reply to export, email, or schedule...</span>
<span class="follow-up-send">send</span>
</div>
</article>
</aside>
</div>
</div>
</div>
<div class="agent-task-chips" aria-label="LogForge AI Agent task examples">
<article>
<span>report.task</span>
<strong>error delta</strong>
<p>Compare long-window error trends across production services and return the delta with linked evidence.</p>
</article>
<article>
<span>explain.task</span>
<strong>container context</strong>
<p>Explain what a container does from metadata, logs, docs, code, deployment history, incidents, and ownership.</p>
</article>
<article>
<span>remediate.task</span>
<strong>guarded action</strong>
<p>Draft commands or rule edits, then wait for operator approval anywhere LogForge policy requires it.</p>
</article>
</div>
</section>
<section id="templates" class="section templates-section" aria-labelledby="templates-title">
<div class="section-intro">
<p class="mono-label">// rule.templates</p>
<h2 id="templates-title">Templates for the failures Docker operators already know.</h2>
<p>Start from known failure modes, tune thresholds per container, then write custom rules across logs, event rates, missing signals, metrics, and Docker events.</p>
</div>
<div class="template-grid">
<article>
<span>STABILITY</span>
<h3>Restart loop</h3>
<p>Crash loop, restart loop, failed start.</p>
</article>
<article>
<span>PERFORMANCE</span>
<h3>Resource pressure</h3>
<p>High CPU, high memory, low disk.</p>
</article>
<article>
<span>LOGS</span>
<h3>Error patterns</h3>
<p>Error flood, OOM, database connection issues.</p>
</article>
<article>
<span>SECURITY</span>
<h3>Suspicious activity</h3>
<p>Unauthorized access and suspicious network activity.</p>
</article>
</div>
</section>
<section id="compare" class="section compare-section" aria-labelledby="compare-title">
<div class="section-intro">
<p class="mono-label">// benchmark.compare</p>
<h2 id="compare-title">Logs vs action</h2>
<p>Other tools show logs. LogForge turns them into alerts, routes, and fixes.</p>
</div>
<div class="compare-table-wrap" role="region" aria-label="LogForge comparison table" tabindex="0">
<table class="compare-table">
<thead>
<tr>
<th scope="col">category</th>
<th scope="col">others</th>
<th scope="col">logforge</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">VISIBILITY</th>
<td><span class="mark yes">✓</span> log viewer</td>
<td><span class="mark yes">✓</span> real-time Docker dashboard</td>
</tr>
<tr class="logforge-row">
<th scope="row">VISIBILITY</th>
<td><span class="mark no">×</span> context split across tools</td>
<td><span class="mark yes">✓</span> logs, files, containers, and history together</td>
</tr>
<tr class="logforge-row">
<th scope="row">ALERTING</th>
<td><span class="mark no">×</span> manual search or external setup</td>
<td><span class="mark yes">✓</span> templates plus custom rules for logs, rates, absence, metrics, and Docker events</td>
</tr>
<tr class="logforge-row">
<th scope="row">ALERTING</th>
<td><span class="mark no">×</span> narrow notification paths</td>
<td><span class="mark yes">✓</span> Slack, Discord, Telegram, Gotify, Teams, Pushover, SMS, email, webhook</td>
</tr>
<tr class="logforge-row">
<th scope="row">REMEDIATION</th>
<td><span class="mark no">×</span> stops at awareness</td>
<td><span class="mark yes">✓</span> restart, stop, kill, start, or script action with cooldown and backoff</td>
</tr>
<tr class="logforge-row">
<th scope="row">AI AGENT</th>
<td><span class="mark no">×</span> isolated errors with no historical context</td>
<td><span class="mark yes">✓</span> graph-grounded reports, container explanations, and guarded remediation plans</td>
</tr>
<tr>
<th scope="row">CONTROL</th>
<td><span class="mark yes">✓</span> single-host dashboards or separate agents</td>
<td><span class="mark yes">✓</span> central LogForge host with enrolled edge agents across Docker hosts</td>
</tr>
<tr class="logforge-row">
<th scope="row">PERFORMANCE</th>
<td><span class="mark no">×</span> remote tailing, SSH polling, or noisy side channels</td>
<td><span class="mark yes">✓</span> forwarded logs and events consumed by central LogForge</td>
</tr>
<tr class="logforge-row">
<th scope="row">PRIVACY</th>
<td><span class="mark no">×</span> cloud-first log shipping</td>
<td><span class="mark yes">✓</span> self-hosted control plane for local and agent-forwarded operational data</td>
</tr>
</tbody>
</table>
</div>
</section>
<section class="section mesh-section" aria-labelledby="mesh-title">
<div class="mesh-layout">
<div class="mesh-copy">
<p class="mono-label">// enterprise.mesh</p>
<h2 id="mesh-title">One central host. Every Docker edge in view.</h2>
<p>Businesses, platform teams, MSPs, and distributed operators can run LogForge on a central host, enroll trusted edge agents, and monitor multiple Docker machines without making the central host poll every remote Docker node.</p>
<p>Docker log tailing still works out of the box on each host or agent. The latest high-performance path is agent-forwarded logs and events into central LogForge.</p>
</div>
<aside class="mesh-console" aria-label="Central LogForge agent mesh">
<div class="window-bar">
<span class="window-dot"></span>
<span class="window-dot"></span>
<span class="window-dot"></span>
<span class="window-title">logforge://enterprise-mesh</span>
<span class="window-status">agents live</span>
</div>
<div class="mesh-body">
<ol class="mesh-routes">
<li>
<span>edge-agent-01</span>
<strong>logs/events -></strong>
<em>central.logforge</em>
</li>
<li>
<span>edge-agent-02</span>
<strong>logs/events -></strong>
<em>central.logforge</em>
</li>
<li>
<span>edge-agent-03</span>
<strong>logs/events -></strong>
<em>central.logforge</em>
</li>
<li>
<span>edge-agent-04</span>
<strong>logs/events -></strong>
<em>central.logforge</em>
</li>
</ol>
<div class="central-node">
<span>central.logforge</span>
<strong>rules + routes + history + guarded actions</strong>
</div>
</div>
</aside>
</div>
</section>
<section id="security" class="section security-section" aria-labelledby="security-title">
<div class="section-intro compact">
<p class="mono-label">// local.control</p>
<h2 id="security-title">Self-hosted by default, cautious by design.</h2>
</div>
<div class="security-grid">
<article>
<span>SELF-HOSTED</span>
<p>Run LogForge in your Docker environment and keep the control loop close to the host.</p>
</article>
<article>
<span>LOCAL DATA</span>
<p>Keep logs, alert rules, action results, and history in your own deployment.</p>
</article>
<article>
<span>DOCKER SOCKET AWARENESS</span>
<p>Make container actions visible and intentional instead of hiding them behind generic webhooks.</p>
</article>
<article>
<span>LOCAL ADMIN</span>
<p>Manage operators, alert rules, channels, and guarded actions from the local admin surface.</p>
</article>
<article>
<span>CENTRAL + EDGE</span>
<p>Run a central LogForge host and enroll trusted edge agents over mTLS for remote Docker nodes.</p>
</article>
<article>
<span>FORWARDED LOGS</span>
<p>Use agents to forward logs and events into central LogForge for the latest high-performance path. Docker log tailing remains the simple out-of-the-box setup on each host or agent.</p>
</article>
</div>
</section>
<section id="premium" class="section premium-section" aria-labelledby="premium-title">
<div class="premium-layout">
<div class="premium-copy">
<p class="mono-label">// premium.waitlist</p>
<h2 id="premium-title">Premium for central and edge operators.</h2>
<p>Join the waitlist for advanced central host workflows, enterprise agent management, and support options for teams that monitor Docker across multiple machines.</p>
<ul class="premium-points">
<li>Central host visibility for enrolled Docker edges.</li>
<li>Priority planning for platform teams, MSPs, and distributed operators.</li>
<li>Premium rollout details sent as they become available.</li>
</ul>
</div>
<form id="premium-form" class="premium-form" action="https://docs.google.com/forms/d/e/1FAIpQLSe7D8ET0jccLyB7ufdlz3Lj9IEhLvrrvncpP8xzFvLgqYZGEQ/formResponse" method="POST" target="_blank">
<div class="code-header">
<span>waitlist.form</span>
<strong>premium</strong>
</div>
<div class="premium-form-body">
<label for="premium-email">
<span>Email</span>
<input id="premium-email" name="entry.475791116" type="email" autocomplete="email" placeholder="ops@example.com" required />
</label>
<label for="premium-team-size">
<span>Team size</span>
<select id="premium-team-size" name="entry.1033853757">
<option value="Single User">Single User</option>
<option value="1 - 10 people">1 - 10 people</option>
<option value="11 - 49 people">11 - 49 people</option>
<option value="50 + people">50 + people</option>
</select>
</label>
<button class="button button-primary premium-submit" type="submit">Join waitlist</button>
<p id="premium-form-status" class="form-status" role="status" aria-live="polite"></p>
<a class="form-fallback" href="https://docs.google.com/forms/d/e/1FAIpQLSe7D8ET0jccLyB7ufdlz3Lj9IEhLvrrvncpP8xzFvLgqYZGEQ/viewform" target="_blank" rel="noopener noreferrer">Open Google Form</a>
<a class="button premium-cirdan-link" href="cirdan.html">
<span class="premium-cirdan-graph" aria-hidden="true">
<span class="premium-cirdan-edge premium-cirdan-edge-one"></span>
<span class="premium-cirdan-edge premium-cirdan-edge-two"></span>
<span class="premium-cirdan-edge premium-cirdan-edge-three"></span>
<span class="premium-cirdan-node premium-cirdan-node-one"></span>
<span class="premium-cirdan-node premium-cirdan-node-two"></span>
<span class="premium-cirdan-node premium-cirdan-node-three"></span>
<span class="premium-cirdan-node premium-cirdan-node-four"></span>
</span>
<span class="premium-cirdan-label">Explore Cirdan</span>
</a>
</div>
</form>
</div>
</section>
<section id="install" class="section install-section" aria-labelledby="install-title">
<div class="install-layout">
<div>
<p class="mono-label">// install.local</p>
<h2 id="install-title">Install LogForge on a local or central Docker host.</h2>
<p>Run the installer to clone or update LogForge, start the Compose stack, and open the dashboard. Start with Docker log tailing out of the box on a single host or enrolled agent, then forward remote host logs to the central deployment.</p>
<div class="install-stats" aria-label="Install summary">
<span>Docker Compose</span>
<span>localhost:8444</span>
<span>self-hosted</span>
</div>
</div>
<div class="install-card" data-tabs>
<div class="code-header install-code-header">
<span>terminal</span>
<div class="install-method-toggle" role="tablist" aria-label="Install method">
<button class="install-method-tab is-active" id="install-tab-script" type="button" role="tab" aria-selected="true" aria-controls="install-panel-script" data-tab="script">Script</button>
<button class="install-method-tab" id="install-tab-docker" type="button" role="tab" aria-selected="false" aria-controls="install-panel-docker" data-tab="docker" tabindex="-1">Docker</button>
</div>
<button id="copy-install" class="copy-button" type="button" data-copy-target="install-script-snippet">
<span class="copy-default">Copy</span>
<span class="copy-success">Copied</span>
</button>
</div>
<div class="install-code-panels">
<pre class="install-code-panel is-active" id="install-panel-script" role="tabpanel" aria-labelledby="install-tab-script" data-tab-panel="script"><code id="install-script-snippet">curl -fsSL https://www.logforge.dev/install.sh | sh</code></pre>
<pre class="install-code-panel" id="install-panel-docker" role="tabpanel" aria-labelledby="install-tab-docker" data-tab-panel="docker" hidden><code id="install-docker-snippet">git clone https://github.com/log-forge/logforge.git
cd logforge
docker compose pull
docker compose up -d
docker compose ps
# Open LogForge
https://localhost:8444</code></pre>
</div>
</div>
</div>
</section>
</main>
<footer class="site-footer">
<p>© 2026 LogForge. Docker alerts, routes, and guarded fixes from your own host.</p>
<a href="mailto:logforge@gmail.com">logforge@gmail.com</a>
</footer>
<script src="script.js"></script>
</body>
</html>