nio-cat 0.6.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -6
- package/bin/nio.js +10 -2
- package/package.json +2 -2
- package/src/agents/claude.js +8 -0
- package/src/claude-hook.js +6 -0
- package/src/control.js +238 -0
- package/src/server.js +5 -3
- package/src/telegram.js +311 -0
- package/src/voice.js +164 -0
- package/web/app/app.js +162 -45
- package/web/app/style.css +5 -0
- package/web/board.js +11 -11
- package/web/index.html +35 -17
- package/web/privadesa.html +148 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="ca">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>nio // privadesa</title>
|
|
7
|
+
<meta name="description" content="Què passa per nio.cat i què no hi passa mai.">
|
|
8
|
+
<link rel="canonical" href="https://www.nio.cat/privadesa">
|
|
9
|
+
<meta name="theme-color" content="#f0ede7">
|
|
10
|
+
<meta property="og:type" content="website">
|
|
11
|
+
<meta property="og:site_name" content="nio">
|
|
12
|
+
<meta property="og:locale" content="ca_ES">
|
|
13
|
+
<meta property="og:url" content="https://www.nio.cat/privadesa">
|
|
14
|
+
<meta property="og:title" content="nio // privadesa">
|
|
15
|
+
<meta property="og:description" content="Què passa per nio.cat i què no hi passa mai.">
|
|
16
|
+
<meta property="og:image" content="https://www.nio.cat/og.png">
|
|
17
|
+
<meta property="og:image:width" content="1200">
|
|
18
|
+
<meta property="og:image:height" content="630">
|
|
19
|
+
<meta property="og:image:alt" content="nio">
|
|
20
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
21
|
+
<meta name="twitter:title" content="nio // privadesa">
|
|
22
|
+
<meta name="twitter:description" content="Què passa per nio.cat i què no hi passa mai.">
|
|
23
|
+
<meta name="twitter:image" content="https://www.nio.cat/og.png">
|
|
24
|
+
<meta name="format-detection" content="telephone=no">
|
|
25
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
26
|
+
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
|
27
|
+
<link rel="manifest" href="/manifest.webmanifest">
|
|
28
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
29
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
30
|
+
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600&display=swap" rel="stylesheet">
|
|
31
|
+
<link rel="stylesheet" href="/bot.css">
|
|
32
|
+
<style>
|
|
33
|
+
:root {
|
|
34
|
+
--bg: #f0ede7;
|
|
35
|
+
--fg: #272224;
|
|
36
|
+
--fg-muted: #69615c;
|
|
37
|
+
--accent: #f46a3b;
|
|
38
|
+
--border: #cec7bd;
|
|
39
|
+
--lemon: #e7e66a;
|
|
40
|
+
--red: #e2382b;
|
|
41
|
+
--font: "Manrope", system-ui, sans-serif;
|
|
42
|
+
}
|
|
43
|
+
* { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; }
|
|
44
|
+
html { -webkit-text-size-adjust: 100%; }
|
|
45
|
+
body { background: var(--bg); color: var(--fg); font: 400 19px/1.6 var(--font); letter-spacing: -.02em; -webkit-font-smoothing: antialiased; }
|
|
46
|
+
a { color: inherit; }
|
|
47
|
+
::selection { background: var(--lemon); }
|
|
48
|
+
:focus-visible { outline: 2px solid var(--fg); outline-offset: 3px; border-radius: 2px; }
|
|
49
|
+
|
|
50
|
+
.page { width: min(640px, 100% - 48px); margin: 0 auto; }
|
|
51
|
+
.head { padding: 56px 0 0; display: flex; justify-content: space-between; align-items: baseline; }
|
|
52
|
+
.head .enter { display: inline-flex; align-items: center; gap: 8px; height: 34px; padding: 0 14px 0 12px; border: 1px solid var(--border); border-radius: 999px; font-size: 14px; font-weight: 500; color: var(--fg); text-decoration: none; transition: border-color .2s, background-color .2s; }
|
|
53
|
+
.head .enter svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
|
|
54
|
+
.head .enter:hover { border-color: var(--fg); background: color-mix(in srgb, var(--fg) 4%, transparent); }
|
|
55
|
+
.mark { font-size: 28px; font-weight: 600; letter-spacing: -.07em; line-height: 1; text-decoration: none; }
|
|
56
|
+
|
|
57
|
+
main { padding: 96px 0 96px; }
|
|
58
|
+
h1 { font-size: clamp(36px, 6vw, 52px); font-weight: 500; line-height: 1.06; letter-spacing: -.055em; text-wrap: balance; }
|
|
59
|
+
.lead { margin-top: 28px; font-size: 21px; line-height: 1.5; color: var(--fg-muted); text-wrap: pretty; }
|
|
60
|
+
|
|
61
|
+
section { margin-top: 56px; }
|
|
62
|
+
h2 { font-size: clamp(26px, 3.4vw, 32px); font-weight: 500; line-height: 1.15; letter-spacing: -.045em; margin-bottom: 18px; }
|
|
63
|
+
section p { text-wrap: pretty; }
|
|
64
|
+
section p + p, section p + ul, section ul + p, section p + .cmd, section .cmd + p { margin-top: 1em; }
|
|
65
|
+
main a { text-decoration-thickness: 1px; text-underline-offset: 4px; text-decoration-color: var(--accent); }
|
|
66
|
+
main a:hover { color: var(--accent); }
|
|
67
|
+
main ul.list { padding-left: 1.2em; display: grid; gap: .5em; }
|
|
68
|
+
main code { font: 500 .88em ui-monospace, "SF Mono", Menlo, monospace; padding: 2px 7px; border-radius: 7px; background: #e6e1d8; }
|
|
69
|
+
main .cmd { display: flex; align-items: center; gap: 4px; padding: 6px 6px 6px 18px; border-radius: 12px; background: #e6e1d8; }
|
|
70
|
+
main .cmd code { flex: 1; min-width: 0; overflow-x: auto; white-space: nowrap; padding: 8px 0; background: none; border-radius: 0; font-size: 16px; scrollbar-width: none; }
|
|
71
|
+
main .cmd code::-webkit-scrollbar { display: none; }
|
|
72
|
+
.copy { flex: none; display: inline-grid; place-items: center; width: 38px; height: 38px; padding: 0; border: 0; border-radius: 9px; background: none; color: var(--fg-muted); cursor: pointer; transition: color .2s, background-color .2s, transform .12s; }
|
|
73
|
+
.copy:hover { color: var(--fg); }
|
|
74
|
+
.copy:active { transform: scale(.97); }
|
|
75
|
+
.copy svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
|
|
76
|
+
.copy .ok { display: none; }
|
|
77
|
+
.copy.done .ok { display: block; color: #5b6551; animation: copy-ok .2s cubic-bezier(.22,1,.36,1); }
|
|
78
|
+
@keyframes copy-ok { from { opacity: 0; transform: scale(.6); } }
|
|
79
|
+
@media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation: none; transition: none; } }
|
|
80
|
+
.copy.done .ic { display: none; }
|
|
81
|
+
main strong { font-weight: 600; }
|
|
82
|
+
|
|
83
|
+
.footer .page { padding: 40px 0 56px; text-align: center; font-size: 13px; color: var(--fg-muted); }
|
|
84
|
+
.footer a { color: var(--fg); text-decoration: underline; text-decoration-color: var(--red); text-decoration-thickness: 1px; text-underline-offset: 3px; }
|
|
85
|
+
.footer a:hover { color: var(--red); }
|
|
86
|
+
|
|
87
|
+
@media (max-width: 620px) {
|
|
88
|
+
body { font-size: 17px; }
|
|
89
|
+
.page { width: calc(100% - 40px); }
|
|
90
|
+
.head { padding-top: 32px; }
|
|
91
|
+
main { padding: 80px 0; }
|
|
92
|
+
.lead { font-size: 19px; }
|
|
93
|
+
section { margin-top: 64px; }
|
|
94
|
+
main .cmd { padding-left: 14px; }
|
|
95
|
+
main .cmd code { font-size: 14px; }
|
|
96
|
+
}
|
|
97
|
+
</style>
|
|
98
|
+
</head>
|
|
99
|
+
<body>
|
|
100
|
+
<header class="page head">
|
|
101
|
+
<a class="mark word" href="/" aria-label="Nio, inici">ni<span class="bot" data-mood="idle" aria-hidden="true"><span class="eyes"><i></i><i></i></span></span></a>
|
|
102
|
+
<a class="enter" href="/app"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M14 4h4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-4"/><path d="M9 16l4-4-4-4"/><path d="M13 12H4"/></svg>Entra al panell</a>
|
|
103
|
+
</header>
|
|
104
|
+
|
|
105
|
+
<main class="page">
|
|
106
|
+
<h1>Privadesa</h1>
|
|
107
|
+
<p class="lead">nio està fet perquè la teva feina no surti dels teus ordinadors. Aquí tens, sense lletra petita, què passa per nio.cat i què no.</p>
|
|
108
|
+
|
|
109
|
+
<section aria-labelledby="passa">
|
|
110
|
+
<h2 id="passa">Què passa per nio.cat</h2>
|
|
111
|
+
<ul class="list">
|
|
112
|
+
<li><strong>L’app.</strong> nio.cat serveix els fitxers de l’app web (com qualsevol web). No té comptes ni inicis de sessió.</li>
|
|
113
|
+
<li><strong>L’adreça de cada ordinador.</strong> Perquè el mòbil el trobi si l’adreça del túnel canvia, cada ordinador hi desa la seva adreça actual, signada amb una clau que només té ell. Només és «aquest ordinador → aquesta adreça». Caduca als 30 dies si no es renova, i es desactiva amb <code>nio directory off</code>.</li>
|
|
114
|
+
<li><strong>Res més.</strong> L’aparellament és directe entre el mòbil i l’ordinador: el codi va dins de l’enllaç, en una part que el navegador no envia a cap servidor.</li>
|
|
115
|
+
</ul>
|
|
116
|
+
</section>
|
|
117
|
+
|
|
118
|
+
<section aria-labelledby="no">
|
|
119
|
+
<h2 id="no">Què no hi passa mai</h2>
|
|
120
|
+
<ul class="list">
|
|
121
|
+
<li>Les teves converses amb els agents, els fitxers, la memòria i el registre d’accions: es queden a cada ordinador (<code>~/.nio</code>).</li>
|
|
122
|
+
<li>Les claus d’accés dels teus dispositius ni les claus d’API (Anthropic, OpenAI, ElevenLabs, Telegram): viuen als teus ordinadors.</li>
|
|
123
|
+
<li>L’àudio de la veu: va del mòbil al teu ordinador i d’allà al proveïdor que hagis triat.</li>
|
|
124
|
+
</ul>
|
|
125
|
+
</section>
|
|
126
|
+
|
|
127
|
+
<section aria-labelledby="altres">
|
|
128
|
+
<h2 id="altres">Altres serveis que hi intervenen</h2>
|
|
129
|
+
<ul class="list">
|
|
130
|
+
<li><strong>El túnel</strong> (Cloudflare, si el fas servir) porta el trànsit xifrat entre el mòbil i l’ordinador.</li>
|
|
131
|
+
<li><strong>Els avisos</strong> passen pel servei de notificacions del mòbil (Apple o Google), xifrats de punta a punta: ells no en veuen el text.</li>
|
|
132
|
+
<li><strong>Els proveïdors que tu triïs</strong> (Anthropic, OpenAI, ElevenLabs, Telegram) reben el que els envien els teus agents, amb les teves claus i segons les seves condicions.</li>
|
|
133
|
+
</ul>
|
|
134
|
+
</section>
|
|
135
|
+
|
|
136
|
+
<section aria-labelledby="control">
|
|
137
|
+
<h2 id="control">Tu tens el control</h2>
|
|
138
|
+
<p>Pots veure i revocar els dispositius amb accés des de l’app (Ordinadors), o tots alhora amb <code>nio reset-token</code>. Per esborrar-ho tot d’un ordinador, esborra la carpeta <code>~/.nio</code>.</p>
|
|
139
|
+
<p>Dubtes: <a href="mailto:hola@nio.cat">hola@nio.cat</a>.</p>
|
|
140
|
+
</section>
|
|
141
|
+
</main>
|
|
142
|
+
|
|
143
|
+
<footer class="footer">
|
|
144
|
+
<div class="page">© 2026 nio // un projecte de <a href="https://f.cat">f.cat</a> · <a href="mailto:hola@nio.cat">hola@nio.cat</a> · <a href="/privadesa">Privadesa</a></div>
|
|
145
|
+
</footer>
|
|
146
|
+
<script src="/bot.js" defer></script>
|
|
147
|
+
</body>
|
|
148
|
+
</html>
|