-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdocs.html
More file actions
796 lines (741 loc) · 49.3 KB
/
Copy pathdocs.html
File metadata and controls
796 lines (741 loc) · 49.3 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
787
788
789
790
791
792
793
794
795
796
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- i18n: resolve language before first paint (localStorage > navigator) -->
<script>
(function () {
try {
var s = localStorage.getItem("nerya-lang");
var l =
s === "zh" || s === "en"
? s
: ((navigator.language || "en") + "").toLowerCase().indexOf("zh") === 0
? "zh"
: "en";
var d = document.documentElement;
d.lang = l;
d.classList.add("lang-" + l);
window.__NERYA_LANG__ = l;
} catch (e) {}
})();
</script>
<script defer src="i18n.zh.js"></script>
<script defer src="i18n.js"></script>
<title data-i18n="d.meta.title">Nerya · Operator manual</title>
<meta
name="description"
data-i18n-attr="content:d.meta.desc"
content="The Nerya operator manual: install, architecture, agent team, self-evolution, memory, skills, trading kernel, connectors, triggers, gateway, SDKs, and safety."
/>
<meta name="theme-color" content="#0a081a" />
<meta property="og:type" content="website" />
<meta property="og:title" data-i18n-attr="content:d.meta.title" content="Nerya · Operator manual" />
<meta
property="og:description"
data-i18n-attr="content:d.meta.ogDesc"
content="Run a self-evolving trading agent on your laptop. The full operator manual: live under a Risk Gate and Approval Gate."
/>
<meta property="og:image" content="assets/nerya-star.png" />
<link rel="icon" href="assets/nerya-logo.png" />
<link rel="apple-touch-icon" href="assets/nerya-logo.png" />
<link rel="stylesheet" href="docs.css" />
<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=JetBrains+Mono:wght@400;500;600&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
rel="stylesheet"
media="print"
onload="this.media='all'"
/>
<noscript>
<link
href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
rel="stylesheet"
/>
</noscript>
<!-- anime.js v4 (vendored locally) drives the docs kinetic layer -->
<script type="importmap">
{
"imports": {
"animejs": "./assets/vendor/anime.esm.min.js"
}
}
</script>
</head>
<body class="docs-body">
<div class="aurora" aria-hidden="true">
<span class="aurora-blob a"></span>
<span class="aurora-blob b"></span>
<span class="aurora-blob c"></span>
</div>
<div class="grain" aria-hidden="true"></div>
<!-- scroll progress meter -->
<div class="read-meter" aria-hidden="true"><span data-read-bar></span></div>
<!-- ─────────── TOP BAR ─────────── -->
<header class="docs-topbar">
<a class="brand" href="index.html" aria-label="Nerya home">
<img class="brand-mark" src="assets/nerya-logo.webp" alt="" aria-hidden="true" />
<span class="brand-word">NERYA</span>
<span class="brand-tag">docs</span>
</a>
<button class="menu-btn" type="button" data-menu aria-label="Toggle navigation" aria-expanded="false">
<span></span><span></span><span></span>
</button>
<label class="doc-search" aria-label="Filter documentation" data-i18n-attr="aria-label:d.search.aria">
<svg viewBox="0 0 24 24" width="15" height="15" aria-hidden="true">
<path fill="none" stroke="currentColor" stroke-width="2" d="M11 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14Zm9 16-4.2-4.2" />
</svg>
<input type="search" placeholder="Filter the manual…" data-filter autocomplete="off" data-i18n-attr="placeholder:d.search.ph" />
<kbd>/</kbd>
</label>
<nav class="topbar-links" aria-label="Site">
<a href="index.html" data-i18n="dz.home">Home</a>
<div class="lang-switch" data-lang-switch>
<button class="lang-toggle" type="button" data-lang-toggle aria-haspopup="listbox" aria-expanded="false" aria-label="Language / 语言">
<svg class="lang-globe" viewBox="0 0 24 24" width="14" height="14" aria-hidden="true">
<path fill="none" stroke="currentColor" stroke-width="1.6" d="M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18Zm0 0c2.6 2.4 2.6 15.6 0 18m0-18c-2.6 2.4-2.6 15.6 0 18M3.5 9h17M3.5 15h17" />
</svg>
<span data-lang-current>EN</span>
</button>
<ul class="lang-menu" data-lang-menu role="listbox">
<li><button type="button" data-lang-set="en" role="option">English</button></li>
<li><button type="button" data-lang-set="zh" role="option">中文</button></li>
</ul>
</div>
<a
class="topbar-cta"
href="https://github.com/NeryaAI/Nerya"
target="_blank"
rel="noopener"
>
<svg viewBox="0 0 24 24" width="14" height="14" aria-hidden="true">
<path
fill="currentColor"
d="M12 2C6.48 2 2 6.59 2 12.25c0 4.53 2.87 8.37 6.84 9.72.5.1.68-.22.68-.49v-1.74c-2.78.62-3.37-1.36-3.37-1.36-.46-1.18-1.12-1.5-1.12-1.5-.91-.64.07-.62.07-.62 1.01.07 1.54 1.06 1.54 1.06.9 1.58 2.36 1.12 2.93.86.09-.67.35-1.12.64-1.38-2.22-.26-4.55-1.14-4.55-5.06 0-1.12.39-2.04 1.03-2.76-.1-.26-.45-1.31.1-2.73 0 0 .84-.28 2.75 1.05.8-.23 1.66-.34 2.51-.34s1.71.11 2.51.34c1.91-1.33 2.75-1.05 2.75-1.05.55 1.42.2 2.47.1 2.73.64.72 1.03 1.64 1.03 2.76 0 3.93-2.34 4.79-4.57 5.05.36.32.68.94.68 1.9v2.82c0 .27.18.6.69.49C19.14 20.61 22 16.77 22 12.25 22 6.59 17.52 2 12 2z"
/>
</svg>
GitHub
</a>
</nav>
</header>
<div class="docs-shell">
<!-- ─────────── SIDEBAR ─────────── -->
<aside class="docs-sidebar" data-sidebar aria-label="Documentation navigation">
<div class="page-switch" role="tablist" aria-label="Documentation areas">
<a class="is-current" href="docs.html" data-i18n="dz.sw.manual">Manual</a>
<a href="skills.html">Skills</a>
<a href="recipes.html" data-i18n="dz.sw.recipes">Recipes</a>
</div>
<nav class="side-nav">
<p class="side-group" data-i18n="dz.sg.start">Get started</p>
<a href="#overview" data-spy data-i18n="d.nav.overview">Overview</a>
<a href="#pillars" data-spy data-i18n="d.nav.pillars">The six pillars</a>
<a href="#quickstart" data-spy data-i18n="d.nav.quickstart">Quick start</a>
<a href="#architecture" data-spy data-i18n="d.nav.architecture">Architecture</a>
<p class="side-group" data-i18n="dz.sg.core">Core concepts</p>
<a href="#agent-team" data-spy data-i18n="d.nav.team">Agent Team</a>
<a href="#self-evolution" data-spy data-i18n="d.nav.evolution">Self-evolution</a>
<a href="#memory" data-spy data-i18n="d.nav.memory">Memory</a>
<a href="#skills" data-spy>Skills</a>
<p class="side-group" data-i18n="dz.sg.trading">Trading</p>
<a href="#trading" data-spy data-i18n="d.nav.tradingKernel">Trading kernel</a>
<a href="#connectors" data-spy data-i18n="d.nav.connectors">Connectors</a>
<a href="#triggers" data-spy data-i18n="d.nav.triggers">Triggers</a>
<p class="side-group" data-i18n="dz.sg.integrate">Integrate</p>
<a href="#gateway" data-spy data-i18n="d.nav.gateway">Gateway</a>
<a href="#sdk" data-spy>SDKs</a>
<p class="side-group" data-i18n="dz.sg.operate">Operate</p>
<a href="#security" data-spy data-i18n="d.nav.security">Security</a>
<a href="#cli" data-spy data-i18n="d.nav.cli">CLI reference</a>
<a href="#modules" data-spy data-i18n="d.nav.modules">Module map</a>
<a href="#status" data-spy data-i18n="d.nav.status">Status & license</a>
</nav>
<div class="side-foot" data-i18n-html="d.sidefoot">
<span class="dot live"></span> live · risk-gated · v0.1.0
</div>
</aside>
<div class="sidebar-scrim" data-scrim aria-hidden="true"></div>
<!-- ─────────── MAIN ─────────── -->
<main class="docs-main">
<!-- HERO -->
<header class="doc-hero">
<p class="eyebrow" data-fx data-i18n="d.hero.eyebrow">Operator manual · self-evolving runtime</p>
<h1 data-hero-title data-i18n-html="d.hero.title">Run an agent that<br /><em>rewrites itself</em>.</h1>
<p class="hero-lede" data-fx data-i18n="d.hero.lede">
Nerya ships its own agent kernel, LLM gateway, sub-agents, typed
memory, triggers, an Agent Team orchestrator, a trading kernel, and an
evolution pipeline, with no external framework attached at runtime.
This manual walks the whole thing, from one-line install to signing an
evolution diff.
</p>
<div class="hero-actions" data-fx>
<a class="btn btn-primary" href="#quickstart" data-i18n="d.hero.install">Install in one line</a>
<a class="btn btn-ghost" href="https://github.com/NeryaAI/Nerya" target="_blank" rel="noopener" data-i18n="d.hero.source">Read the source</a>
</div>
<div class="stat-strip" data-fx>
<div class="stat"><strong data-count-to="25">0</strong><span data-i18n="d.hero.s1">built-in skills</span></div>
<div class="stat"><strong data-count-to="100" data-suffix="+">0</strong><span data-i18n="d.hero.s2">venues via CCXT</span></div>
<div class="stat"><strong data-count-to="500" data-suffix="+">0</strong><span data-i18n="d.hero.s3">tests, no network</span></div>
<div class="stat"><strong data-count-to="1">0</strong><span data-i18n="d.hero.s4">local port · 18317</span></div>
</div>
</header>
<!-- OVERVIEW -->
<section class="doc-section" id="overview">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.ov.eyebrow">01 · README front door</p>
<h2 data-i18n="d.ov.h2">No strategy? Ask the agent for one.</h2>
</div>
<p class="lead" data-reveal data-i18n="d.ov.lead">
Nerya is a self-evolving AI trading team that runs on your laptop.
Skill-first and trading-native. One sentence is enough to get a
working strategy package.
</p>
<figure class="quote" data-reveal>
<p data-i18n-html="d.ov.quote">“I have <em>$500</em> in a live account. Make me money on BTC. Don't blow it up.”</p>
</figure>
<p data-reveal data-i18n-html="d.ov.p">
The <code>strategy_author</code> skill turns that prompt into a working
strategy package in a single chat turn: trigger, sub-agent prompt
library, candle source, account binding, risk limits, session ledger.
You approve it, and it runs. After each run, the agent journals every
decision, reviews every fill, reflects between sessions, and drafts
upgrade proposals. The operator signs the diff or rejects it.
</p>
<div class="callout callout-safe" data-reveal>
<span class="callout-tag" data-i18n="d.ov.safeTag">Safe by default</span>
<p data-i18n="d.ov.safeP">
Live trading stays off until you sign for it. Mistakes go into
memory, not into your wallet.
</p>
</div>
</section>
<!-- PILLARS -->
<section class="doc-section" id="pillars">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.pil.eyebrow">02 · what carries the product</p>
<h2 data-i18n="d.pil.h2">The six pillars</h2>
</div>
<div class="card-grid" data-grid>
<article class="info-card" data-card>
<span class="card-idx">01</span>
<h3 data-i18n="d.pil.c1.h3">Agent Team</h3>
<p data-i18n="d.pil.c1.p">A durable, role-typed team with a leader, analysts, a risk critic, a shared blackboard, a task board, a mailbox, and gates.</p>
</article>
<article class="info-card" data-card>
<span class="card-idx">02</span>
<h3 data-i18n="d.pil.c2.h3">Self-evolution</h3>
<p data-i18n="d.pil.c2.p">Reflection writes typed proposals between sessions. The operator signs. The runtime applies with a rollback snapshot.</p>
</article>
<article class="info-card" data-card>
<span class="card-idx">03</span>
<h3 data-i18n="d.pil.c3.h3">Typed memory</h3>
<p data-i18n="d.pil.c3.p">Five typed markdown surfaces: global, mistakes, market regimes, skill learnings, and per-strategy. Read it, diff it, version it.</p>
</article>
<article class="info-card" data-card>
<span class="card-idx">04</span>
<h3 data-i18n-html="d.pil.c4.h3"><code>SKILL.md</code> first</h3>
<p data-i18n-html="d.pil.c4.p">Every capability is a directory with <code>SKILL.md</code> as the only definition surface. 25 ship today.</p>
</article>
<article class="info-card" data-card>
<span class="card-idx">05</span>
<h3 data-i18n="d.pil.c5.h3">Trading kernel</h3>
<p data-i18n="d.pil.c5.p">Trading primitives instead of raw tool calls: Risk Gate, Approval Gate, live/paper separation, virtual ledger, reconciliation.</p>
</article>
<article class="info-card" data-card>
<span class="card-idx">06</span>
<h3 data-i18n="d.pil.c6.h3">SDK + gateway</h3>
<p data-i18n="d.pil.c6.p">Thin Python & TypeScript clients over the local daemon, plus a universal messaging gateway across eight platforms.</p>
</article>
</div>
<h3 class="sub" data-reveal data-i18n="d.pil.whyH3">Why Nerya is different</h3>
<div class="table-wrap" data-reveal>
<table class="cmp">
<thead>
<tr><th data-i18n="d.pil.th1">Concern</th><th data-i18n="d.pil.th2">Most agent frameworks</th><th data-i18n="d.pil.th3">Nerya</th></tr>
</thead>
<tbody>
<tr><td data-i18n="d.pil.r1a">Trading primitives</td><td data-i18n="d.pil.r1b">Tool calls against exchange SDKs</td><td data-i18n="d.pil.r1c">Risk Gate, Approval Gate, live/paper separation, virtual ledger, reconciliation</td></tr>
<tr><td data-i18n="d.pil.r2a">Memory</td><td data-i18n="d.pil.r2b">A vector blob, maybe</td><td data-i18n="d.pil.r2c">5 typed markdown surfaces</td></tr>
<tr><td data-i18n="d.pil.r3a">Self-improvement</td><td data-i18n="d.pil.r3b">You write the prompts</td><td data-i18n="d.pil.r3c">Reflection writes proposals; operator signs; runtime applies with rollback</td></tr>
<tr><td data-i18n="d.pil.r4a">Multi-agent</td><td data-i18n="d.pil.r4b">Loose function calls</td><td data-i18n="d.pil.r4c">Durable team with leader, analysts, risk critic, blackboard, gates</td></tr>
<tr><td data-i18n="d.pil.r5a">Connectors</td><td data-i18n="d.pil.r5b">One SDK per venue</td><td data-i18n="d.pil.r5c">6 native venues + 100+ via CCXT; ask the agent to author a missing one</td></tr>
<tr><td data-i18n="d.pil.r6a">Security</td><td data-i18n="d.pil.r6b">“Don't log keys”</td><td data-i18n-html="d.pil.r6c">Vault-only secrets, <code>vault://</code> refs, prompt firewall, signer policy, sandbox</td></tr>
<tr><td data-i18n="d.pil.r7a">Ops</td><td data-i18n="d.pil.r7b">Write your own supervisor</td><td data-i18n="d.pil.r7c">One-liner installer + systemd / launchd / NSSM service</td></tr>
</tbody>
</table>
</div>
</section>
<!-- QUICK START -->
<section class="doc-section" id="quickstart">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.qs.eyebrow">03 · zero to a first fill</p>
<h2 data-i18n="d.qs.h2">Quick start</h2>
</div>
<h3 class="sub" data-reveal data-i18n="d.qs.install">One-liner install</h3>
<div class="code" data-code data-reveal>
<div class="code-bar"><span class="code-lang">bash</span><button class="copy" type="button" data-copy data-i18n="dz.copy">copy</button></div>
<pre><code># <span data-i18n="d.qs.cmtMac">macOS / Linux</span>
curl -LsSf https://raw.githubusercontent.com/NeryaAI/Nerya/main/install/install.sh | sh
# <span data-i18n="d.qs.cmtWin">Windows PowerShell</span>
iwr https://raw.githubusercontent.com/NeryaAI/Nerya/main/install/install.ps1 -UseBasicParsing | iex</code></pre>
</div>
<p data-reveal data-i18n="d.qs.idem">The installer is idempotent. It:</p>
<ol class="step-list" data-grid>
<li data-card data-i18n-html="d.qs.s1">installs <a href="https://github.com/astral-sh/uv" target="_blank" rel="noopener"><code>uv</code></a> if missing,</li>
<li data-card data-i18n-html="d.qs.s2">clones Nerya into <code>~/.nerya/src</code> and runs <code>uv sync --extra trading</code>,</li>
<li data-card data-i18n-html="d.qs.s3">drops a <code>nerya</code> shim into <code>~/.local/bin</code>,</li>
<li data-card data-i18n-html="d.qs.s4">initialises a workspace at <code>~/nerya-ws</code>,</li>
<li data-card data-i18n-html="d.qs.s5">registers a host service so the local API boots with the machine on port <code>18317</code>.</li>
</ol>
<h3 class="sub" data-reveal data-i18n="d.qs.beginner">Beginner mode</h3>
<div class="code" data-code data-reveal>
<div class="code-bar"><span class="code-lang">bash</span><button class="copy" type="button" data-copy data-i18n="dz.copy">copy</button></div>
<pre><code>nerya setup --tui # <span data-i18n="d.qs.cmtTui">rich text wizard: password, LLM key, gateway, memory, account</span>
nerya setup --web # <span data-i18n="d.qs.cmtWeb">same wizard in the browser at http://127.0.0.1:18317/setup</span></code></pre>
</div>
<p data-reveal data-i18n="d.qs.defaults">
Every domain except the LLM model carries a safe default. Hit Enter
through every prompt and you get a working install. Then open the
dashboard and chat.
</p>
<div class="chat" data-reveal>
<p class="chat-you" data-i18n-html="d.qs.chatYou"><span>you</span>I have $500 in a live account. Make me money on BTC. Don't blow it up.</p>
<p class="chat-nerya" data-i18n-html="d.qs.chatNerya"><span>nerya</span>Drafts a <code>demo_btc_5m_scalper</code> package, wires up <code>binance:BTCUSDT</code> candles, binds <code>paper_main</code>, sets a 0.4% max-drawdown guard, schedules the trigger every 5 minutes, and asks you to approve.</p>
</div>
<h3 class="sub" data-reveal data-i18n="d.qs.manual">Manual quick start (no installer)</h3>
<div class="code" data-code data-reveal>
<div class="code-bar"><span class="code-lang">bash</span><button class="copy" type="button" data-copy data-i18n="dz.copy">copy</button></div>
<pre><code># 1. <span data-i18n="d.qs.m1">create a workspace</span>
python -m nerya.cli.app init --workspace ~/.nerya
# 2. <span data-i18n="d.qs.m2">inspect installed skills</span>
python -m nerya.cli.app skill list
# 3. <span data-i18n="d.qs.m3">run the vertical slice demo (simulation, no live keys)</span>
python sdk/python/examples/price_tracker.py --workspace ~/.nerya
# 4. <span data-i18n="d.qs.m4">review the resulting strategy session</span>
python -m nerya.cli.app strategy history btc_momentum --workspace ~/.nerya
# 5. <span data-i18n="d.qs.m5">reflect and generate evolution proposals</span>
python -m nerya.cli.app reflect --workspace ~/.nerya
python -m nerya.cli.app evolve --workspace ~/.nerya
python -m nerya.cli.app proposals list --workspace ~/.nerya</code></pre>
</div>
</section>
<!-- ARCHITECTURE -->
<section class="doc-section" id="architecture">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.arch.eyebrow">04 · ground truth</p>
<h2 data-i18n="d.arch.h2">Architecture</h2>
</div>
<p class="lead" data-reveal data-i18n-html="d.arch.lead">
Code lives in the repo. Runtime state (strategies, journals, sessions,
approvals, memory, vault, proposals) lives in your workspace
directory. Tarball it, grep it, or <code>rm -rf</code> it.
</p>
<div class="code code-wide" data-reveal>
<div class="code-bar"><span class="code-lang">runtime</span></div>
<pre><code>┌──────────────────────────── Nerya runtime ────────────────────────────┐
│ ┌──────────────────┐ ┌─────────────┐ ┌──────────────────────┐ │
│ │ Trigger router │──►│ Nerya kernel│──►│ Skills runtime │ │
│ │ schedule / NL / │ │ agent loop │ │ registry + dispatch │ │
│ │ webhook / gateway│ │ + planner │ │ permissions + manifest │ │
│ └──────────────────┘ └──────┬──────┘ └───────────┬──────────┘ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────────────────────┐ │
│ │ LLM gateway │ │ Subagents + │ │ Trading kernel │ │
│ │ tiers + │ │ Agent Team │ │ intents → Risk Gate → │ │
│ │ budget + │ │ blackboard +│ │ Approval Gate → │ │
│ │ adapters │ │ mailbox │ │ paper / live execution │ │
│ └─────────────┘ └─────────────┘ └──────────────┬───────────┘ │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────┐ ▼ │
│ │ Messaging │ │ Security │ │ MCP / │ Strategy history │
│ │ gateway │ │ vault + │ │ ACP │ + journals │
│ │ pipeline │ │ signer + │ │ bridges │ │
│ └─────────────┘ └─────────────┘ └──────────┘ │
└────────────────────────────────────────────────────────────────────────┘
▼
┌───────────────────────── Nerya workspace (files only) ────────────────┐
│ state/ journals/ inbox/ outbox/ memory/ vault/ approvals/ │
│ strategies/<id>/{strategy.yml, limits.yml, history/, sessions/} │
│ skills/{enabled.yml, installed/, pending/} │
│ scripts/{pending/, approved/, rejected/} │
│ evolution/proposals/ │
└────────────────────────────────────────────────────────────────────────┘</code></pre>
</div>
</section>
<!-- AGENT TEAM -->
<section class="doc-section" id="agent-team">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.team.eyebrow">05 · a durable standing team</p>
<h2 data-i18n="d.team.h2">Agent Team</h2>
</div>
<p class="lead" data-reveal data-i18n-html="d.team.lead">
A <code>TeamRun</code> is a durable team config that persists across
turns. It carries the whole standing team and the rules that keep it
honest.
</p>
<ul class="check-list" data-grid>
<li data-card data-i18n="d.team.l1">Typed members: strategy lead, market / on-chain / news / technical analysts, risk critic, execution planner, portfolio manager.</li>
<li data-card data-i18n-html="d.team.l2">Per-role skill allowlist + denylist. <code>execution_planner</code> cannot touch <code>trading</code>.</li>
<li data-card data-i18n="d.team.l3">Task board with dependencies, locks, priorities, owners.</li>
<li data-card data-i18n="d.team.l4">Mailbox for inter-agent messaging, plus a shared blackboard for evidence.</li>
<li data-card data-i18n="d.team.l5">Leader synthesis: the lead waits for required reports, resolves conflicts, emits a decision memo.</li>
<li data-card data-i18n="d.team.l6">Gates: plan-artefact, all-tasks-complete, verification, optional human approval.</li>
</ul>
<div class="callout" data-reveal>
<span class="callout-tag" data-i18n="d.team.tplTag">Templates</span>
<p data-i18n-html="d.team.tplP">
Three ship today: <code>market_analysis_team</code>,
<code>strategy_design_team</code>, and <code>trade_decision_committee</code>.
Drop new ones under <code>nerya/teams/templates</code>.
</p>
</div>
</section>
<!-- SELF-EVOLUTION -->
<section class="doc-section" id="self-evolution">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.evo.eyebrow">06 · the loop closes</p>
<h2 data-i18n="d.evo.h2">Self-evolution</h2>
</div>
<p class="lead" data-reveal data-i18n-html="d.evo.lead">
After each closed session, <code>reflection.py</code> writes memory
entries. <code>nerya/evolution/</code> reads those entries and produces
typed proposals.
</p>
<div class="code" data-code data-reveal>
<div class="code-bar"><span class="code-lang">proposal types</span><button class="copy" type="button" data-copy data-i18n="dz.copy">copy</button></div>
<pre><code>learning_update <span data-i18n="d.evo.pt1">markdown patch to memory</span>
prompt_patch <span data-i18n="d.evo.pt2">unified diff of an agent / subagent prompt</span>
script_proposal <span data-i18n="d.evo.pt3">new script + manifest in workspace/scripts/pending/</span>
skill_proposal <span data-i18n="d.evo.pt4">new skill directory in workspace/skills/pending/</span>
trigger_route_patch <span data-i18n="d.evo.pt5">unified diff to workspace/triggers/routes.yml</span>
strategy_config_patch <span data-i18n="d.evo.pt6">unified diff to strategies/<id>/strategy.yml</span>
risk_limit_suggestion <span data-i18n="d.evo.pt7">advisory only; never overwrites limits.yml</span></code></pre>
</div>
<div class="callout callout-warn" data-reveal>
<span class="callout-tag" data-i18n="d.evo.immTag">Code-enforced immutables</span>
<p data-i18n-html="d.evo.immP">
No agent-authored patch touches <code>accounts.yml</code>,
<code>limits.yml</code>, the vault, signer policy, or
<code>live_trading_enabled</code>. <code>promotion.py</code> rejects
any diff that tries. Every applied proposal carries a
<code>rollback.py</code> snapshot.
</p>
</div>
</section>
<!-- MEMORY -->
<section class="doc-section" id="memory">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.mem.eyebrow">07 · plain markdown, no black box</p>
<h2 data-i18n="d.mem.h2">Memory</h2>
</div>
<div class="code" data-code data-reveal>
<div class="code-bar"><span class="code-lang">workspace/memory/</span><button class="copy" type="button" data-copy data-i18n="dz.copy">copy</button></div>
<pre><code>workspace/memory/
├── global.md <span data-i18n="d.mem.t1">runtime-wide</span>
├── mistakes.md <span data-i18n="d.mem.t2">reflection writes, agent reads</span>
├── market_regimes.md <span data-i18n="d.mem.t3">weekly review + news skill</span>
├── skill_learnings.md <span data-i18n="d.mem.t4">per-skill insights</span>
└── strategy_learnings/<id>.md <span data-i18n="d.mem.t5">per-strategy</span></code></pre>
</div>
<p data-reveal data-i18n-html="d.mem.p">
Plain markdown. You can read it, diff it, version-control it. Nothing
reaches a prompt without passing the firewall first. The built-in
notebook is always on; optional plug-ins add <code>memsearch</code>
(Milvus + embedding model) or <code>agentmemory</code> (external service).
</p>
</section>
<!-- SKILLS -->
<section class="doc-section" id="skills">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.sk.eyebrow">08 · SKILL.md is the only definition</p>
<h2>Skills</h2>
</div>
<p class="lead" data-reveal data-i18n-html="d.sk.lead">
Every capability lives under
<code>nerya/skills/builtin/<name>_skill/</code>.
</p>
<div class="code" data-code data-reveal>
<div class="code-bar"><span class="code-lang">skill layout</span><button class="copy" type="button" data-copy data-i18n="dz.copy">copy</button></div>
<pre><code>SKILL.md <span data-i18n="d.sk.t1">when to use, workflow, examples</span>
scripts/ <span data-i18n="d.sk.t2">executable helpers, JSON in, JSON out</span>
references/ <span data-i18n="d.sk.t3">lazy-loaded methodology and research playbooks</span>
templates/ <span data-i18n="d.sk.t4">code and config templates</span></code></pre>
</div>
<p data-reveal data-i18n="d.sk.all25">All 25 built-ins ship today:</p>
<div class="chip-cloud" data-grid>
<span data-card>trading</span><span data-card>strategy_author</span><span data-card>backtest</span>
<span data-card>triggers</span><span data-card>tasks</span><span data-card>markets</span>
<span data-card>market_data_routing</span><span data-card>news_social</span><span data-card>research</span>
<span data-card>analysis</span><span data-card>market_research</span><span data-card>quant_research</span>
<span data-card>equity_research</span><span data-card>dcf_valuation</span><span data-card>sec_filings</span>
<span data-card>research_report</span><span data-card>expert_investors</span><span data-card>agents</span>
<span data-card>team</span><span data-card>memory</span><span data-card>evolve</span>
<span data-card>llm</span><span data-card>coding</span><span data-card>browser</span>
<span data-card>notify</span>
</div>
<p data-reveal data-i18n-html="d.sk.see">
See the <a href="skills.html">full skill reference</a>: all 25
built-ins grouped by family, with when-to-use and flow for each.
</p>
</section>
<!-- TRADING -->
<section class="doc-section" id="trading">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.tr.eyebrow">09 · every order earns its fill</p>
<h2 data-i18n="d.tr.h2">Trading kernel</h2>
</div>
<div class="code code-wide" data-reveal>
<div class="code-bar"><span class="code-lang">order path</span></div>
<pre><code>TradeIntent → RiskGate → ApprovalGate → PaperExecution | LiveConnector
│
▼
VirtualLedger · positions · PnL · reconciliation</code></pre>
</div>
<ul class="check-list" data-grid>
<li data-card data-i18n="d.tr.l1">Risk Gate checks live status, limits, ledger, confidence, slippage, staleness, duplicates, conflicts. One failure stops the order.</li>
<li data-card data-i18n="d.tr.l2">Approval Gate routes over-threshold intents to the operator queue.</li>
<li data-card data-i18n="d.tr.l3">One JSONL session per run records trigger, context, decision, intent, risk verdict, execution, messages, outcome, review, and reflection.</li>
<li data-card data-i18n-html="d.tr.l4">CCXT adapter for Binance, Bybit, OKX, Hyperliquid. On-chain: BSC (PancakeSwap v2), Solana (Jupiter), generic EVM via <code>eth_account</code>.</li>
</ul>
</section>
<!-- CONNECTORS -->
<section class="doc-section" id="connectors">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.conn.eyebrow">10 · author a missing venue</p>
<h2 data-i18n="d.conn.h2">Adding a new exchange</h2>
</div>
<p class="lead" data-reveal data-i18n="d.conn.lead">You don't have to wait for a release. Ask the agent.</p>
<div class="chat" data-reveal>
<p class="chat-you" data-i18n-html="d.conn.chat"><span>you</span>Add Bitget perpetual futures. Here are the API docs: https://bitgetlimited.github.io/apidoc/en/</p>
</div>
<p data-reveal data-i18n-html="d.conn.p">
The <code>coding</code> skill checks the CCXT bridge first (100+ venues
already wired). If your venue is one of them, the agent registers an
alias and you're done. If not, the agent drops a new
<code>workspace/providers/<id>/provider.py</code> exposing a
<code>SPEC</code> constant, calls
<code>ConnectorRegistry.reload_providers()</code> for hot-reload, and
verifies with <code>connector_view</code>. No daemon restart, no
source-tree commit.
</p>
</section>
<!-- TRIGGERS -->
<section class="doc-section" id="triggers">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.trg.eyebrow">11 · what wakes the agent</p>
<h2 data-i18n="d.trg.h2">Triggers</h2>
</div>
<p class="lead" data-reveal data-i18n-html="d.trg.lead">
<code>workspace/triggers/routes.yml</code> maps a <code>kind</code> to a
target: the main agent, a sub-agent, or a direct skill.
</p>
<div class="chip-cloud" data-grid>
<span data-card>cron</span><span data-card>webhook</span><span data-card data-i18n="d.trg.k1">gateway inbound</span>
<span data-card data-i18n="d.trg.k2">price breakout</span><span data-card data-i18n="d.trg.k3">funding spike</span><span data-card data-i18n="d.trg.k4">news keyword</span>
<span data-card data-i18n="d.trg.k5">whale wallet</span><span data-card data-i18n="d.trg.k6">session close</span><span data-card data-i18n="d.trg.k7">manual operator</span>
</div>
<p data-reveal data-i18n="d.trg.idem">Idempotency keys, dry-run, and dedupe are built in.</p>
</section>
<!-- GATEWAY -->
<section class="doc-section" id="gateway">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.gw.eyebrow">12 · one contract per platform</p>
<h2 data-i18n="d.gw.h2">Gateway</h2>
</div>
<p class="lead" data-reveal data-i18n="d.gw.lead">
Telegram, Discord, Slack, Feishu, WeCom, DingTalk, WhatsApp, and a
generic webhook share one universal messaging surface.
</p>
<div class="code" data-code data-reveal>
<div class="code-bar"><span class="code-lang">http</span><button class="copy" type="button" data-copy data-i18n="dz.copy">copy</button></div>
<pre><code>GET /gateway/platforms # <span data-i18n="d.gw.c1">support matrix</span>
POST /gateway/inbound # <span data-i18n="d.gw.c2">normalized inbound messages</span>
POST /gateway/send # <span data-i18n="d.gw.c3">outbound via native or webhook channels</span></code></pre>
</div>
<div class="callout callout-safe" data-reveal>
<span class="callout-tag" data-i18n="d.gw.tokTag">Tokens never sit in config</span>
<p data-i18n-html="d.gw.tokP">
Plaintext tokens get rewritten as <code>vault://</code> refs the
moment you submit them. Trade notifications fan out through
<code>messaging/pipeline.py</code> to every configured channel.
</p>
</div>
</section>
<!-- SDK -->
<section class="doc-section" id="sdk">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.sdk.eyebrow">13 · the surface your scripts import</p>
<h2>SDKs</h2>
</div>
<p class="lead" data-reveal data-i18n="d.sdk.lead">
The SDKs never touch keys, exchanges, or RPCs. They are thin clients
over the local daemon, which enforces every skill permission, risk
gate, and approval gate.
</p>
<div class="code-cols">
<div class="code" data-code data-reveal>
<div class="code-bar"><span class="code-lang">python</span><button class="copy" type="button" data-copy data-i18n="dz.copy">copy</button></div>
<pre><code>from nerya_sdk import connect
client = connect()
client.triggers.emit(
source="script",
kind="price.breakout",
payload={"symbol": "BTC", "price": 82_000},
target="subagent:market_analyst",
strategy_id="btc_momentum",
)</code></pre>
</div>
<div class="code" data-code data-reveal>
<div class="code-bar"><span class="code-lang">typescript</span><button class="copy" type="button" data-copy data-i18n="dz.copy">copy</button></div>
<pre><code>import { connect } from "@nerya/sdk";
const nerya = connect({
baseUrl: "http://127.0.0.1:18317",
caller: "script:my_bot",
});
await nerya.trading.submitIntent({
strategy_id: "btc_momentum",
account_id: "paper_main",
market: "PAPER:BTCUSDT",
side: "buy",
size: 0.01,
size_unit: "base",
order_type: "market",
confidence: 0.6,
reasoning: "ts-sdk demo",
});</code></pre>
</div>
</div>
<div class="table-wrap" data-reveal>
<table class="cmp">
<thead><tr><th data-i18n="d.sdk.th1">Surface</th><th data-i18n="d.sdk.th2">Path</th><th data-i18n="d.sdk.th3">What it does</th></tr></thead>
<tbody>
<tr><td>Python</td><td><code>sdk/python/nerya_sdk/</code></td><td data-i18n="d.sdk.r1">Thin client: triggers, trading, LLM, strategy, memory.</td></tr>
<tr><td>TypeScript</td><td><code>@nerya/sdk</code></td><td data-i18n="d.sdk.r2">Same surface. Node, Bun, and Edge friendly.</td></tr>
<tr><td>MCP</td><td><code>nerya/mcp/</code></td><td data-i18n="d.sdk.r3">Exposes every skill as an MCP tool for Claude Desktop, Cursor, etc.</td></tr>
<tr><td>ACP</td><td><code>nerya/acp/</code></td><td data-i18n="d.sdk.r4">Agent-to-agent bridges for inter-swarm communication.</td></tr>
</tbody>
</table>
</div>
<p data-reveal data-i18n-html="d.sdk.see">
The <a href="recipes.html">recipes page</a> has runnable Python and
TypeScript examples: price-breakout slices, tiered news watchers,
funding and whale triggers, and more.
</p>
</section>
<!-- SECURITY -->
<section class="doc-section" id="security">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.sec.eyebrow">14 · the hot keys stay cold</p>
<h2 data-i18n="d.sec.h2">Security & safety</h2>
</div>
<ul class="check-list" data-grid>
<li data-card data-i18n-html="d.sec.l1">Go live the moment <code>runtime.live_trading_enabled: true</code> <em>and</em> the Approval Gate signs off. Until then, orders fill in simulation.</li>
<li data-card data-i18n-html="d.sec.l2">No raw secrets reach agent context, only <code>secret_ref</code> and redacted previews. <code>SecretVault</code> resolves <code>vault://</code> refs in-memory for one call, then discards them.</li>
<li data-card data-i18n="d.sec.l3">No direct exchange calls from agent-authored code. Every external call goes through a registered skill, then a connector, then a signer.</li>
<li data-card data-i18n="d.sec.l4">Scripts run in a sandbox: whitelisted imports, JSON I/O, manual approval before first run, no bypass of the Trading SDK or Risk Gate.</li>
<li data-card data-i18n-html="d.sec.l5">Evolution can mutate prompts, scripts, skills, routes, and strategy configs, but never <code>limits.yml</code>, <code>live_trading_enabled</code>, signer policy, or secret policy.</li>
</ul>
</section>
<!-- CLI -->
<section class="doc-section" id="cli">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.cli.eyebrow">15 · drive it from the terminal</p>
<h2 data-i18n="d.cli.h2">CLI reference</h2>
</div>
<div class="table-wrap" data-reveal>
<table class="cmp">
<thead><tr><th data-i18n="d.cli.th1">Command</th><th data-i18n="d.cli.th2">What it does</th></tr></thead>
<tbody>
<tr><td><code>nerya setup --tui</code></td><td data-i18n="d.cli.r1">Rich text setup wizard (password, LLM, gateway, memory, account).</td></tr>
<tr><td><code>nerya setup --web</code></td><td data-i18n-html="d.cli.r2">Same wizard in the browser at <code>:18317/setup</code>.</td></tr>
<tr><td><code>nerya serve --port 18317</code></td><td data-i18n="d.cli.r3">Boot the local daemon (host service, dashboard proxy, SDK target).</td></tr>
<tr><td><code>nerya … init --workspace ~/.nerya</code></td><td data-i18n="d.cli.r4">Create a fresh workspace.</td></tr>
<tr><td><code>nerya … skill list</code></td><td data-i18n="d.cli.r5">Inspect installed skills.</td></tr>
<tr><td><code>nerya … strategy history <id></code></td><td data-i18n="d.cli.r6">Review a strategy's session ledger.</td></tr>
<tr><td><code>nerya … reflect</code></td><td data-i18n="d.cli.r7">Write memory entries from closed sessions.</td></tr>
<tr><td><code>nerya … evolve</code></td><td data-i18n="d.cli.r8">Produce typed evolution proposals.</td></tr>
<tr><td><code>nerya … proposals list</code></td><td data-i18n="d.cli.r9">List pending proposals awaiting your signature.</td></tr>
</tbody>
</table>
</div>
<div class="callout" data-reveal>
<span class="callout-tag" data-i18n="d.cli.portsTag">Ports</span>
<p data-i18n-html="d.cli.portsP">
One local port by default: <code>18317</code> (daemon, host service,
dashboard proxy, SDK target). The dashboard ships under
<code>dashboard/</code> on <code>:18380</code>. Point clients at a new
URL via the <code>NERYA_API</code> environment variable.
</p>
</div>
</section>
<!-- MODULES -->
<section class="doc-section" id="modules">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.mod.eyebrow">16 · what ships in nerya/* today</p>
<h2 data-i18n="d.mod.h2">Module map</h2>
</div>
<div class="table-wrap" data-reveal>
<table class="cmp">
<thead><tr><th data-i18n="d.mod.th1">Module</th><th data-i18n="d.mod.th2">What it owns</th></tr></thead>
<tbody>
<tr><td><code>agent/</code></td><td data-i18n="d.mod.r1">Kernel, planner, context builder, memory, working memory, reflection.</td></tr>
<tr><td><code>subagents/</code></td><td data-i18n="d.mod.r2">Per-role runtimes with allow/denylists, budget caps, parallel dispatcher, aggregator.</td></tr>
<tr><td><code>teams/</code></td><td data-i18n="d.mod.r3">Durable Agent Team: config, store, mailbox, blackboard, templates, orchestrator, gates.</td></tr>
<tr><td><code>triggers/</code></td><td data-i18n-html="d.mod.r4">Cron + trigger router, <code>schedules.yml</code>, idempotency, dry-run.</td></tr>
<tr><td><code>skills/</code></td><td data-i18n-html="d.mod.r5"><code>SKILL.md</code> kernel + 25 built-in skills.</td></tr>
<tr><td><code>trading/</code></td><td data-i18n="d.mod.r6">TradeIntent, RiskGate, ApprovalGate, paper execution, virtual ledger, PnL, reconciliation.</td></tr>
<tr><td><code>connectors/</code></td><td data-i18n="d.mod.r7">CCXT adapter, native EVM/BSC/Solana, dynamic provider spec.</td></tr>
<tr><td><code>llm/</code></td><td data-i18n="d.mod.r8">ModelRouter, OpenAI/Anthropic/Gemini/Ollama adapters, credential pool, tiers, budget.</td></tr>
<tr><td><code>security/</code></td><td data-i18n="d.mod.r9">Vault, signer, prompt firewall, redaction, output validator, script sandbox.</td></tr>
<tr><td><code>evolution/</code></td><td data-i18n="d.mod.r10">Reflection engine, typed proposals, operator-signed promotion, snapshot rollback.</td></tr>
<tr><td><code>messaging/</code></td><td data-i18n="d.mod.r11">Universal gateway across Telegram, Discord, Slack, Feishu, WeCom, DingTalk, WhatsApp, webhooks.</td></tr>
<tr><td><code>mcp/</code>, <code>acp/</code></td><td data-i18n="d.mod.r12">FastMCP server + ACP adapter for external agent ecosystems.</td></tr>
</tbody>
</table>
</div>
</section>
<!-- STATUS -->
<section class="doc-section" id="status">
<div class="doc-head" data-reveal>
<p class="eyebrow" data-i18n="d.st.eyebrow">17 · what works, what's next</p>
<h2 data-i18n="d.st.h2">Status & license</h2>
</div>
<ul class="status-list" data-grid>
<li class="ok" data-card data-i18n="d.st.l1">Vertical slice end-to-end: init → skill list → trigger → sub-agent turn → TradeIntent → Risk Gate → first fill → history → review → reflect → proposals.</li>
<li class="ok" data-card data-i18n="d.st.l2">Agent Team Phase 1-4 live: durable core, templates, orchestrator, planner/kernel integration, skill + HTTP surface.</li>
<li class="ok" data-card data-i18n="d.st.l3">CEX live-signed orders for Binance, Bybit, OKX, Hyperliquid. DEX swaps for BSC PancakeSwap v2 and Solana Jupiter.</li>
<li class="ok" data-card data-i18n="d.st.l4">Cross-platform one-line installer with service registration.</li>
<li class="ok" data-card data-i18n="d.st.l5">Dashboard (Next.js 14): Setup, Chat, Strategies, Self-Evolution, Memory, Skills, Workflows, Inbox, Portfolio, Gateway, Env Vault, Settings.</li>
<li class="wip" data-card data-i18n="d.st.l6">Agent Team Phase 5: snapshot and replay.</li>
<li class="wip" data-card data-i18n="d.st.l7">More native gateway adapters: Feishu rich cards, Discord slash commands, WhatsApp Business.</li>
</ul>
<div class="callout" data-reveal>
<span class="callout-tag" data-i18n="d.st.licTag">License</span>
<p data-i18n-html="d.st.licP">
Nerya is released under the
<a href="https://polyformproject.org/licenses/noncommercial/1.0.0" target="_blank" rel="noopener">PolyForm Noncommercial License 1.0.0</a>.
Free for personal use, research, nonprofits, and schools. Commercial
use needs a separate license. Open a GitHub issue describing your
use case.
</p>
</div>
<div class="end-cta" data-reveal>
<h3 data-i18n="d.st.ctaH3">Ready to run it?</h3>
<p data-i18n="d.st.ctaP">Built for operators who want an agent that thinks, trades, remembers, and grows up without ever holding the hot keys.</p>
<div class="hero-actions">
<a class="btn btn-primary" href="#quickstart" data-i18n="d.st.ctaInstall">Back to install</a>
<a class="btn btn-ghost" href="index.html" data-i18n="d.st.ctaLanding">Back to the landing</a>
</div>
</div>
</section>
<footer class="docs-footer">
<span data-i18n="dz.foot.brand">Nerya · Evolutionary Brain</span>
<span data-i18n="d.foot.tag">live under a Risk Gate and Approval Gate</span>
</footer>
</main>
</div>
<button class="to-top" type="button" data-top aria-label="Back to top">↑</button>
<script type="module" src="docs-fx.js"></script>
</body>
</html>