@ibgib/space-gib 0.0.20 → 0.0.21
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/dist/client/bootstrap.mjs +1 -1
- package/dist/client/{chunk-TVMLARYE.mjs → chunk-7YXHRAEW.mjs} +98 -47
- package/dist/client/{chunk-3RNUFRNV.mjs → chunk-M2IO3EMM.mjs} +15 -15
- package/dist/client/index.html +1 -1
- package/dist/client/index.mjs +1 -1
- package/dist/client/privacy.html +288 -0
- package/dist/client/script.mjs +1 -1
- package/dist/server/server.mjs +7 -2
- package/generate-privacy-html.js +208 -0
- package/package.json +4 -4
- package/src/client/AUTO-GENERATED-version.mts +1 -1
- package/src/client/index.html +1 -1
- package/src/client/privacy.html +288 -0
package/dist/client/index.html
CHANGED
|
@@ -294,7 +294,7 @@
|
|
|
294
294
|
<p class="footer-text">
|
|
295
295
|
<span>© ibgib contributors</span> ·
|
|
296
296
|
<a href="https://ibgib.space" class="footer-link">ibgib.space</a> ·
|
|
297
|
-
<a href="
|
|
297
|
+
<a href="/privacy" class="footer-link" target="_blank" rel="noopener">Privacy Policy</a>
|
|
298
298
|
</p>
|
|
299
299
|
</footer>
|
|
300
300
|
|
package/dist/client/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{$a as Sa,$b as pt,A as Ea,Ba as ft,D as Et,E as wt,F as Fe,Hb as D,Ia as ve,J as U,Jb as _a,Ka as wa,Kb as Ga,Lb as Ca,Mb as Ye,
|
|
1
|
+
import{$a as Sa,$b as pt,$c as Oa,A as Ea,Ba as ft,D as Et,E as wt,F as Fe,Hb as D,Ia as ve,J as U,Jb as _a,Ka as wa,Kb as Ga,Lb as Ca,Mb as Ye,Pc as $a,Qc as Ta,Rb as he,Sb as Qe,Sc as Ba,Tc as He,Ub as Le,Vb as et,Vc as V,Wb as Ht,Wc as Na,Xa as Je,Xb as Aa,Xc as La,Yb as va,Yc as ka,Zc as Da,_b as Wt,a as g,ac as mt,bc as Q,c as dt,cd as Pa,d as lt,e as Re,eb as Ze,ec as ye,f as jt,fb as Xe,g as oe,h as ae,hb as ge,hd as xa,i as ua,ib as bt,id as St,j as y,jb as Ia,kb as Kt,lb as Ne,r as W,tb as Xt,ub as Yt,w as p,ya as se,z as ya,za as Ge}from"./chunk-M2IO3EMM.mjs";var It="sync",ie="syncmsg",qt="@payloadAddrsDomain",zn="init",Jn="ack",Zn="delta",Qn="commit",H={init:zn,ack:Jn,delta:Zn,commit:Qn},$r=Object.values(H),er="abort",tr="optimistic-graft-longest-common-subsequence",Se={abort:er,optimisticWithLCS:tr},We=Object.values(Se);function _t(r){return We.includes(r)}g(_t,"isValidSyncConflictStrategy");var ar="push",nr="pull",rr="sync",zt={push:ar,pull:nr,sync:rr},kr=Object.values(zt);var or="sender",sr="receiver",Gt={sender:or,receiver:sr},Dr=Object.values(Gt);var tt="graftinfo",$e=tt,Ra="latestcommonaddr",Me="base",ke="orphan",Fa="dnaapplied",ir="longest-common-subsequence",Jt={lcs:ir},xr=Object.values(Jt);var gt=!1;async function cr({data:r}){if(!r.conflictStrategy)throw new Error("(UNEXPECTED) data.conflictStrategy required for GraftInfoIb (E: 2c0968a0dac8d0ab3d67da9756d6df26)");if(!_t(r.conflictStrategy))throw new Error(`invalid data.conflictStrategy (${r.conflictStrategy}). valid conflict strategies: ${We} (E: 41e2680089786d4d28046b4c0884bd26)`);return[tt,r.conflictStrategy].join(" ")}g(cr,"getGraftInfoIb");async function Zt({conflictStrategy:r,details:t,addlGraftDetails:e,latestCommonFrameAddr:a,baseAddrsSinceLCA:s,orphanAddrsSinceLCA:i,dnaAddrsApplied:o}){let c=`[${Zt.name}]`;try{if(gt&&console.log(`${c} starting... (I: 0030f62cbae28cf5882f87981edc3826)`),s.length===0)throw new Error("(UNEXPECTED) baseAddrsSinceLCA empty? (E: 005f8449a9236d445902a148f59fc826)");if(i.length===0)throw new Error("(UNEXPECTED) orphanAddrsSinceLCA empty? (E: 19e4082e82c67759c880392aca186826)");let d={conflictStrategy:r,description:t};e&&(d.addlGraftDetails=e);let l={[Ra]:[a],[Me]:s.concat(),[ke]:i.concat(),[Fa]:o.concat()},f=await cr({data:d});return await U.stone({parentPrimitiveIb:tt,ib:f,data:d,rel8ns:l,uuid:!0})}catch(d){throw console.error(`${c} ${y(d)}`),d}finally{gt&&console.log(`${c} complete.`)}}g(Zt,"createGraftInfo");async function Ma({textA:r,textB:t}){if(r===t)return r;if(r==="")return t;if(t==="")return r;function e(l,f){let b=l.length,m=f.length,h=Array(b+1).fill(0).map(()=>Array(m+1).fill(0));for(let G=1;G<=b;G++)for(let A=1;A<=m;A++)l[G-1]===f[A-1]?h[G][A]=h[G-1][A-1]+1:h[G][A]=Math.max(h[G-1][A],h[G][A-1]);let u=b,S=m,C=[];for(;u>0&&S>0;)l[u-1]===f[S-1]?(C.unshift({line:l[u-1],indexA:u-1,indexB:S-1}),u--,S--):h[u-1][S]>h[u][S-1]?u--:S--;return C}g(e,"longestCommonSubsequence");let a=r.split(`
|
|
2
2
|
`),s=t.split(`
|
|
3
3
|
`),i=e(a,s),o=[],c=0,d=0;for(let l of i){for(;c<l.indexA;)o.push(a[c]),c++;for(;d<l.indexB;)o.push(s[d]),d++;o.push(l.line),c++,d++}for(;c<a.length;)o.push(a[c]),c++;for(;d<s.length;)o.push(s[d]),d++;return o.join(`
|
|
4
4
|
`)}g(Ma,"mergeTextByLongestCommonSubsequence");function Qt(r){let t=`[${Qt.name}]`;try{if(gt&&console.log(`${t} starting... (I: fe9adfe1a3175d87982507c8851f5826)`),!r)throw new Error("(UNEXPECTED) not a graft info, ibGib falsy? (E: bf06cdd700788e777f72fe5a5bdb0e26)");if(!r.data)throw new Error("not a graft info, ibGib.data falsy (E: 5e1b28843ec8571a7623046a06195826)");if(!r.ib.startsWith(tt))throw new Error(`not graft info, ibgib.ib does not start with ${tt} (E: cec6a8e25ff8746aef813e38cbebce26)`);return!0}catch(e){return gt&&console.error(`${t} ${y(e)}`),!1}finally{gt&&console.log(`${t} complete.`)}}g(Qt,"isGraftInfo");var ee=!1;async function ea({data:r}){let t=`[${ea.name}]`;try{return[It,r.uuid].join(" ")}catch(e){throw console.error(`${t} ${y(e)}`),e}}g(ea,"getSyncIb");async function Va(){return`tmp_sync_space_${(await oe()).substring(0,8)}`}g(Va,"getTempSpaceName");async function at({olderAddr:r,newerAddr:t,space:e}){let a=`[${at.name}]`;try{if(ee&&console.log(`${a} starting... (I: 4b3548cbc9a2eb749f447ed82fdcf826)`),r===t)return!0;let s,i=await se({space:e,addr:t});if(i.success&&i.ibGibs?.length===1)s=i.ibGibs[0];else throw new Error(`couldn't get newerAddr (${t}) from space (${e.ib}). (E: 36c758c22b181b2c89a1cd28937a6826)`);if(!s.rel8ns)return console.warn(`${a} newerIbGib.rel8ns falsy? newerAddr: ${t}. (W: 6f920811f7080281189f767813814826)`),!1;let o=s.rel8ns.past??[];if(o.length===0)return!1;if(o.includes(r))return!0;let c=o[0];return await at({olderAddr:r,newerAddr:c,space:e})}catch(s){throw console.error(`${a} ${y(s)}`),s}finally{ee&&console.log(`${a} complete.`)}}g(at,"isPastFrame");async function Ct({sagaIbGib:r,localSpace:t}){let e=`[${Ct.name}]`,a=g(async c=>{let d=await se({space:t,addrs:c});if(d.success&&d.ibGibs?.length===c.length)return d.ibGibs;{let l=d.rawResultIbGib;throw l.data?new Error(`(UNEXPECTED) couldn't find addrs? addrsNotFound: ${l.data.addrsNotFound}? space.ib: ${t.ib} (E: 43b7b5a6ad982715c8f3eed69bfa0d26)`):new Error("(UNEXPECTED) resGet.rawResultIbGib.data falsy? (E: c26c681d2f831fc537ba6f48fee36d26)")}},"fnGet"),s=await At({sagaIbGib:r});if(s.length>0)throw new Error(`invalid sync sagaIbGib. validationErrors: ${s} (E: 19f9e8c9643858ff41312b62293d2126)`);if(!r.rel8ns)throw new Error("(UNEXPECTED) validated sagaIbGib.rel8ns falsy? (E: 73af48be8bbf271ec5cf78187ce8c826)");let i=r.rel8ns[ie],o=await a(i);return{sagaIbGib:r,msgStones:o}}g(Ct,"getSyncSagaFrameDependencyGraph");async function nt({sagaIbGib:r,space:t}){let e=`[${nt.name}]`;try{if(ee&&console.log(`${e} starting... (I: 1ea3f804dd07d1e917a2afaaad497826)`),!r.data)throw new Error("(UNEXPECTED) sagaIbGib.data falsy? (E: fe0a0d0965e87ac852fe7ba4710cc826)");if(!r.rel8ns)throw new Error("(UNEXPECTED) sagaIbGib.rel8ns falsy? (E: b79ff82a732346bdf8a9e1eb9ac96826)");let a=p({ibGib:r}),s=r.rel8ns.past&&r.rel8ns.past.length>0?[...r.rel8ns.past,a]:[a],i=[];for(let o of s){let c,d=await se({addr:o,space:t});if(d.success&&d.ibGibs&&d.ibGibs.length===1)c=d.ibGibs[0];else throw ee&&console.log(`${e} failed getting full history of sagaIbGib:
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en-US">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Privacy Policy · ibgib.space</title>
|
|
7
|
+
<link rel="stylesheet" type="text/css" href="/style.css">
|
|
8
|
+
<style>
|
|
9
|
+
html, body {
|
|
10
|
+
height: auto !important;
|
|
11
|
+
min-height: 100% !important;
|
|
12
|
+
overflow-y: auto !important;
|
|
13
|
+
overflow-x: hidden !important;
|
|
14
|
+
}
|
|
15
|
+
body {
|
|
16
|
+
background: #11111b;
|
|
17
|
+
color: #cdd6f4;
|
|
18
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
19
|
+
margin: 0;
|
|
20
|
+
padding: 0;
|
|
21
|
+
line-height: 1.6;
|
|
22
|
+
}
|
|
23
|
+
.page-container {
|
|
24
|
+
max-width: 860px;
|
|
25
|
+
margin: 0 auto;
|
|
26
|
+
padding: 2.5rem 1.5rem 4rem;
|
|
27
|
+
}
|
|
28
|
+
.header-bar {
|
|
29
|
+
display: flex;
|
|
30
|
+
align-items: center;
|
|
31
|
+
justify-content: space-between;
|
|
32
|
+
padding-bottom: 1.5rem;
|
|
33
|
+
margin-bottom: 2rem;
|
|
34
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
|
35
|
+
}
|
|
36
|
+
.brand-link {
|
|
37
|
+
color: #89b4fa;
|
|
38
|
+
text-decoration: none;
|
|
39
|
+
font-weight: 700;
|
|
40
|
+
font-size: 1.2rem;
|
|
41
|
+
display: flex;
|
|
42
|
+
align-items: center;
|
|
43
|
+
gap: 0.5rem;
|
|
44
|
+
}
|
|
45
|
+
.back-link {
|
|
46
|
+
color: #a6adc8;
|
|
47
|
+
text-decoration: none;
|
|
48
|
+
font-size: 0.9rem;
|
|
49
|
+
padding: 0.4rem 0.8rem;
|
|
50
|
+
border-radius: 6px;
|
|
51
|
+
background: rgba(255, 255, 255, 0.05);
|
|
52
|
+
transition: all 0.2s;
|
|
53
|
+
}
|
|
54
|
+
.back-link:hover {
|
|
55
|
+
color: #ffffff;
|
|
56
|
+
background: rgba(255, 255, 255, 0.1);
|
|
57
|
+
}
|
|
58
|
+
.policy-title {
|
|
59
|
+
font-size: 2.2rem;
|
|
60
|
+
color: #ffffff;
|
|
61
|
+
margin-top: 0;
|
|
62
|
+
margin-bottom: 0.5rem;
|
|
63
|
+
}
|
|
64
|
+
.policy-h2 {
|
|
65
|
+
font-size: 1.4rem;
|
|
66
|
+
color: #50fa7b;
|
|
67
|
+
margin-top: 2rem;
|
|
68
|
+
margin-bottom: 0.75rem;
|
|
69
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
|
|
70
|
+
padding-bottom: 0.3rem;
|
|
71
|
+
}
|
|
72
|
+
.policy-h3 {
|
|
73
|
+
font-size: 1.1rem;
|
|
74
|
+
color: #89b4fa;
|
|
75
|
+
margin-top: 1.5rem;
|
|
76
|
+
margin-bottom: 0.5rem;
|
|
77
|
+
}
|
|
78
|
+
p, li {
|
|
79
|
+
color: #cdd6f4;
|
|
80
|
+
font-size: 0.95rem;
|
|
81
|
+
}
|
|
82
|
+
ul, ol {
|
|
83
|
+
padding-left: 1.5rem;
|
|
84
|
+
margin: 0.5rem 0 1rem;
|
|
85
|
+
}
|
|
86
|
+
li {
|
|
87
|
+
margin-bottom: 0.35rem;
|
|
88
|
+
}
|
|
89
|
+
code {
|
|
90
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
91
|
+
font-size: 0.85em;
|
|
92
|
+
background: rgba(255, 255, 255, 0.08);
|
|
93
|
+
padding: 0.15rem 0.35rem;
|
|
94
|
+
border-radius: 4px;
|
|
95
|
+
color: #f5c2e7;
|
|
96
|
+
}
|
|
97
|
+
code.math {
|
|
98
|
+
color: #89dceb;
|
|
99
|
+
}
|
|
100
|
+
a {
|
|
101
|
+
color: #89b4fa;
|
|
102
|
+
text-decoration: underline;
|
|
103
|
+
}
|
|
104
|
+
a:hover {
|
|
105
|
+
color: #b4befe;
|
|
106
|
+
}
|
|
107
|
+
.divider {
|
|
108
|
+
border: 0;
|
|
109
|
+
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
|
110
|
+
margin: 2rem 0;
|
|
111
|
+
}
|
|
112
|
+
.alert-box {
|
|
113
|
+
display: flex;
|
|
114
|
+
gap: 0.75rem;
|
|
115
|
+
padding: 1rem 1.25rem;
|
|
116
|
+
border-radius: 8px;
|
|
117
|
+
margin: 1.25rem 0;
|
|
118
|
+
align-items: flex-start;
|
|
119
|
+
}
|
|
120
|
+
.alert-warning {
|
|
121
|
+
background: rgba(249, 226, 175, 0.08);
|
|
122
|
+
border: 1px solid rgba(249, 226, 175, 0.3);
|
|
123
|
+
color: #f9e2af;
|
|
124
|
+
}
|
|
125
|
+
.alert-important {
|
|
126
|
+
background: rgba(137, 180, 250, 0.08);
|
|
127
|
+
border: 1px solid rgba(137, 180, 250, 0.3);
|
|
128
|
+
color: #89b4fa;
|
|
129
|
+
}
|
|
130
|
+
.alert-note {
|
|
131
|
+
background: rgba(180, 190, 254, 0.08);
|
|
132
|
+
border: 1px solid rgba(180, 190, 254, 0.3);
|
|
133
|
+
color: #b4befe;
|
|
134
|
+
}
|
|
135
|
+
.alert-icon {
|
|
136
|
+
font-size: 1.2rem;
|
|
137
|
+
line-height: 1.2;
|
|
138
|
+
}
|
|
139
|
+
.alert-body {
|
|
140
|
+
font-size: 0.88rem;
|
|
141
|
+
line-height: 1.45;
|
|
142
|
+
color: #cdd6f4;
|
|
143
|
+
}
|
|
144
|
+
.footer-bar {
|
|
145
|
+
margin-top: 3.5rem;
|
|
146
|
+
padding-top: 1.5rem;
|
|
147
|
+
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
|
148
|
+
font-size: 0.85rem;
|
|
149
|
+
color: #a6adc8;
|
|
150
|
+
display: flex;
|
|
151
|
+
justify-content: space-between;
|
|
152
|
+
flex-wrap: wrap;
|
|
153
|
+
gap: 1rem;
|
|
154
|
+
}
|
|
155
|
+
</style>
|
|
156
|
+
</head>
|
|
157
|
+
<body>
|
|
158
|
+
<div class="page-container">
|
|
159
|
+
<header class="header-bar">
|
|
160
|
+
<a href="/" class="brand-link">
|
|
161
|
+
<span>◈</span>
|
|
162
|
+
<span>🌌 space-gib 🌌</span>
|
|
163
|
+
</a>
|
|
164
|
+
<a href="/" class="back-link">← Return to App</a>
|
|
165
|
+
</header>
|
|
166
|
+
|
|
167
|
+
<main>
|
|
168
|
+
<h1 class="policy-title">Privacy Policy</h1>
|
|
169
|
+
<p><strong>Status</strong>: DRAFT (Active Development) </p>
|
|
170
|
+
<p><strong>Effective Date</strong>: August 21, 2026 </p>
|
|
171
|
+
<p><strong>Last Updated</strong>: August 21, 2026 </p>
|
|
172
|
+
<div class="alert-box alert-warning"><div class="alert-icon">⚠️</div><div class="alert-body"><strong>Draft Notice & Active Development Disclaimer</strong>:<br>This Privacy Policy is currently in <strong>draft status</strong>. The <code>ibGib</code> platform, underlying cryptographic keystone engine, and decentralized data graph architecture are under <strong>active research and development</strong>. This document expresses our architectural intent, privacy commitments, and operational principles; however, as the technology is actively evolving, certain features, administrative tooling, and data workflows described herein may be experimental, partially implemented, or subject to change.</div></div>
|
|
173
|
+
<hr class="divider">
|
|
174
|
+
<h2 class="policy-h2">1. Introduction & Overview</h2>
|
|
175
|
+
<p>Welcome to <strong>ibGib</strong>. We are committed to transparency, cryptographic self-sovereignty, and user privacy. </p>
|
|
176
|
+
<p>This Privacy Policy explains how <code>ibGib</code> (including <code>ibgib.space</code>, <code>ibgib.com</code>, and related open-source applications in this monorepo) collects, uses, stores, and protects your information when you interact with our network, services, and applications. </p>
|
|
177
|
+
<div class="alert-box alert-important"><div class="alert-icon">ℹ️</div><div class="alert-body"><strong>Summary for Everyone</strong>:<br>* <strong>Public Directory</strong>: Just like a public PGP key or public DNS record, your chosen <strong>username</strong>, <strong>registered email address</strong>, and <strong>identity keystone</strong> are part of the public graph so people and your devices can find and authenticate you.<br>* <strong>No Passwords on the Wire</strong>: Your master passphrase, biometric data (Touch ID / Face ID / Windows Hello), and physical security keys (YubiKeys) <strong>never</strong> leave your local device.<br>* <strong>No Data Selling</strong>: We do <strong>not</strong> sell, rent, monetize, or share your personal data with third-party advertisers or data brokers.<br>* <strong>Standard Transport Security</strong>: All communications between your devices and our servers operate over industry-standard <strong>TLS 1.3 / HTTPS</strong> encryption.</div></div>
|
|
178
|
+
<hr class="divider">
|
|
179
|
+
<h2 class="policy-h2">2. Categories of Information We Collect</h2>
|
|
180
|
+
<h3 class="policy-h3">A. Identity & Public Directory Data</h3>
|
|
181
|
+
<p>When you create an account or link authentication methods, the following information is recorded in your identity keystone:</p>
|
|
182
|
+
<ul>
|
|
183
|
+
<li><strong>Chosen Username</strong>: A human-readable identifier (e.g. <code>alice</code>).</li>
|
|
184
|
+
<li><strong>Registered Email Address</strong>: Provided during account creation or SSO linking to enable account discovery, verification, and recovery.</li>
|
|
185
|
+
<li><strong>Public Keystone DAG Addresses & Challenge Hashes</strong>: Cryptographic addresses and mathematical challenge hashes (<code class="math">H = \text{Hash}(S)</code>) that define your identity's evolution timeline.</li>
|
|
186
|
+
<li><strong>Registered Device Delegate Tags</strong>: Public labels for devices authorized to sync on your behalf (e.g. <code>pwd-alice-desk-a9a0</code>, <code>passkey-mobile-b4c1</code>).</li>
|
|
187
|
+
</ul>
|
|
188
|
+
<h3 class="policy-h3">B. Technical, Connection & Log Data</h3>
|
|
189
|
+
<p>When accessing our hosted web nodes, standard operational connection data may be logged:</p>
|
|
190
|
+
<ul>
|
|
191
|
+
<li><strong>Internet Protocol (IP) Address</strong> and approximate geographic origin.</li>
|
|
192
|
+
<li><strong>HTTP/TLS Request Metadata</strong>: Date/time of request, HTTP status code, URL path, and TLS cipher suite.</li>
|
|
193
|
+
<li><strong>User-Agent Strings</strong>: Browser type, operating system, and client application version.</li>
|
|
194
|
+
<li><strong>Retention</strong>: Operational and access logs are retained for a bounded window (typically <strong>30 to 90 days</strong>) strictly for system reliability, rate limiting, intrusion detection, and security forensics, after which they are automatically rotated and deleted.</li>
|
|
195
|
+
</ul>
|
|
196
|
+
<h3 class="policy-h3">C. Workspace & Application Data</h3>
|
|
197
|
+
<ul>
|
|
198
|
+
<li><strong>User-Created Content</strong>: Notes, comments, graph nodes, and files stored within your tenant workspace.</li>
|
|
199
|
+
<li><strong>Storage Status</strong>: Workspace data is stored in tenant-isolated domain spaces. Data in transit is encrypted via TLS 1.3. Data at rest on the server is currently stored unencrypted within your isolated space directory (client-side data encryption is planned as a future capability).</li>
|
|
200
|
+
</ul>
|
|
201
|
+
<hr class="divider">
|
|
202
|
+
<h2 class="policy-h2">3. Public Directory Nature of Identity Keystones</h2>
|
|
203
|
+
<div class="alert-box alert-warning"><div class="alert-icon">⚠️</div><div class="alert-body"><strong>Experimental Architecture Notice</strong>:<br>Identity Keystones are built on an innovative Zero-Knowledge Proof (ZKP) Distributed Ledger Technology (DLT) architecture. While designed to eliminate reliance on central certificate authorities, this technology is experimental. See <a href="#7-security-architecture--experimental-protocol-notice" target="_blank" rel="noopener">Section 7</a> for detailed security context.</div></div>
|
|
204
|
+
<h3 class="policy-h3">Innovative ZKP DLT vs. Conventional PKI</h3>
|
|
205
|
+
<p><code>ibGib</code> is built upon public-key cryptographic principles, but <strong>is not conventional Public Key Infrastructure (PKI)</strong>:</p>
|
|
206
|
+
<ul>
|
|
207
|
+
<li>Instead of relying on asymmetric digital signatures (RSA, ECDSA) and centralized X.509 Certificate Authorities (CAs), <code>ibGib</code> identities utilize a <strong>Zero-Knowledge Proof (ZKP) Distributed Ledger Technology (DLT)</strong> architecture with symmetric hash-reveal challenge-response pools.</li>
|
|
208
|
+
<li><strong>Public by Design</strong>: Identity Keystones function as public directory records. Anyone on the network who knows your username or email address can query the server to retrieve your public keystone.</li>
|
|
209
|
+
<li><strong>Zero Secret Exposure</strong>: Public keystones contain only public challenge hashes (<code class="math">H</code>). Revealing a challenge hash gives an observer zero ability to compute your private secret pre-image (<code class="math">S</code>) or act on your behalf.</li>
|
|
210
|
+
<li><strong>Biometric & Password Isolation</strong>:</li>
|
|
211
|
+
<li>Passwords, PINs, and passphrase pre-images are processed strictly inside your local browser memory and discarded.</li>
|
|
212
|
+
<li>Hardware biometrics (fingerprints, facial recognition) and security keys operate exclusively within your device's hardware Secure Enclave / TPM via the W3C WebAuthn standard. Raw biometric data is never transmitted over the network or accessible to our servers.</li>
|
|
213
|
+
</ul>
|
|
214
|
+
<hr class="divider">
|
|
215
|
+
<h2 class="policy-h2">4. How We Use Your Information</h2>
|
|
216
|
+
<p>We process personal and cryptographic data solely for the following legitimate purposes:</p>
|
|
217
|
+
<ol>
|
|
218
|
+
<li><strong>Identity Resolution & Discovery</strong>: Matching incoming authentication requests and email lookups to the correct tenant domain space.</li>
|
|
219
|
+
<li><strong>Cryptographic Multi-Device Authorization</strong>: Permitting your devices to authorize scoped synchronization claims via local device sync delegates (<code class="math">D_{\text{device}}</code>), while the native ibGib sync engine executes graph synchronization.</li>
|
|
220
|
+
<li><strong>Account Verification & Sign-In</strong>: Sending one-time 6-digit verification codes (OTP) to confirm email ownership and authenticate sign-ins.</li>
|
|
221
|
+
<li><strong>Security & Abuse Prevention</strong>: Enforcing rate limits, detecting brute-force attacks, and preventing server abuse.</li>
|
|
222
|
+
</ol>
|
|
223
|
+
<p>We do <strong>not</strong> use your data for profiling, automated decision-making, or third-party targeted advertising.</p>
|
|
224
|
+
<hr class="divider">
|
|
225
|
+
<h2 class="policy-h2">5. Third-Party Service Providers</h2>
|
|
226
|
+
<p>We utilize minimal third-party services essential to core platform functionality:</p>
|
|
227
|
+
<ul>
|
|
228
|
+
<li><strong>Single Sign-On (SSO) Authentication (Optional)</strong>:</li>
|
|
229
|
+
<li><strong>Google OAuth2</strong>: Currently supported for single-tap passwordless account creation and sign-in. When linking Google, we receive verified identity tokens (such as your verified email address and provider user ID) to authenticate your identity. We do not receive or store your Google password.</li>
|
|
230
|
+
<li><strong>Future Providers</strong>: We plan to introduce additional OAuth2 providers (such as GitHub and others) in future updates.</li>
|
|
231
|
+
<li><strong>Transactional Email & Hosting Infrastructure</strong>:</li>
|
|
232
|
+
<li><strong>Transactional Email</strong>: We send emails strictly for transactional account confirmation, sign-in verification codes, and security notices. We never send marketing, newsletter, or promotional spam emails.</li>
|
|
233
|
+
<li><strong>Cloud Server & Storage Nodes</strong>: Web nodes, domain space storage, and network routing are hosted on secure cloud infrastructure located in the United States.</li>
|
|
234
|
+
</ul>
|
|
235
|
+
<hr class="divider">
|
|
236
|
+
<h2 class="policy-h2">6. Immutable Timeline Integrity, Revocations & Data Deletion</h2>
|
|
237
|
+
<h3 class="policy-h3">Cryptographic Timeline Integrity</h3>
|
|
238
|
+
<p><code>ibGib</code> is built on an <strong>append-only, directed acyclic graph (DAG) architecture</strong>. Similar to version control systems (like Git) and cryptographic ledgers (like Bitcoin), timeline records are mathematically linked using cryptographic hashes to ensure data integrity and tamper-evidence. Just as past blocks in a blockchain cannot be modified without destroying cryptographic integrity, historical keystone frames remain part of the verifiable audit chain.</p>
|
|
239
|
+
<h3 class="policy-h3">Revocations & Tombstones</h3>
|
|
240
|
+
<p>When you modify your identity permissions—such as unlinking a Google SSO provider or revoking a lost device passkey:</p>
|
|
241
|
+
<ul>
|
|
242
|
+
<li>The system publishes a cryptographically signed <strong>tombstone evolution frame</strong> (<code class="math">n \to n+1</code>).</li>
|
|
243
|
+
<li>This frame officially revokes that authority and unlinks the provider from server-side reverse lookup indices.</li>
|
|
244
|
+
</ul>
|
|
245
|
+
<h3 class="policy-h3">Content Takedowns & Full Account Erasure</h3>
|
|
246
|
+
<ol>
|
|
247
|
+
<li><strong>Content & Asset Takedowns</strong>: Standalone content nodes and binary file payloads can be unlinked, de-indexed, or removed from server storage upon authorized request or valid legal takedown without compromising structural timeline history.</li>
|
|
248
|
+
<li><strong>Complete Tenant Erasure</strong>: If you request complete account deletion, your entire tenant domain space (including all hosted keystones, delegate frames, and stored data) and reverse email index entries will be permanently purged and removed from server storage.</li>
|
|
249
|
+
<li><strong>Local Device Data Control</strong>: You maintain full control over all data stored locally on your physical devices. You may clear your local cryptographic tokens, delegates, and cached workspace data at any time via the application settings or by clearing your browser's IndexedDB / local storage.</li>
|
|
250
|
+
</ol>
|
|
251
|
+
<hr class="divider">
|
|
252
|
+
<h2 class="policy-h2">7. Security Architecture & Experimental Protocol Notice</h2>
|
|
253
|
+
<h3 class="policy-h3">Innovative & Experimental Nature</h3>
|
|
254
|
+
<p>Identity Keystones, multi-pool challenge-response mechanisms, and decentralized sync delegates represent innovative, experimental cryptographic protocols. While we apply diligent best efforts in cryptanalysis and utilize industry-standard, proven cryptographic primitives (such as SHA-256, SHA-512, AES, and WebAuthn PRF), the composite architecture is actively evolving. Users should evaluate this platform understanding its experimental research nature.</p>
|
|
255
|
+
<h3 class="policy-h3">Conventional Security Foundations</h3>
|
|
256
|
+
<p>All communications, API endpoints, and authentication exchanges between your client devices and our server infrastructure operate strictly over industry-standard <strong>TLS 1.3 / HTTPS</strong> encryption. Server-side data isolation, atomic file indexing, and timing side-channel protections are implemented following standard enterprise security practices.</p>
|
|
257
|
+
<hr class="divider">
|
|
258
|
+
<h2 class="policy-h2">8. Your Privacy Rights (Texas TDPSA & US State Privacy Laws)</h2>
|
|
259
|
+
<p>If you are a resident of Texas (governed by the <strong>Texas Data Privacy and Security Act - TDPSA</strong>) or other jurisdictions with applicable privacy legislation, you have the following rights regarding your personal data:</p>
|
|
260
|
+
<ul>
|
|
261
|
+
<li><strong>Right to Know / Access</strong>: You have the right to confirm whether we process your personal data and to access such data.</li>
|
|
262
|
+
<li><strong>Right to Correct</strong>: You have the right to correct inaccuracies in your personal data.</li>
|
|
263
|
+
<li><strong>Right to Delete</strong>: You have the right to request deletion of personal data provided by or obtained about you.</li>
|
|
264
|
+
<li><strong>Right to Data Portability</strong>: You have the right to obtain a copy of your personal data in a portable and readily usable format.</li>
|
|
265
|
+
<li><strong>Right to Opt-Out of Sale / Targeted Advertising</strong>: We do <strong>not</strong> sell your personal data or process it for targeted advertising, so no opt-out is necessary.</li>
|
|
266
|
+
<li><strong>Right to Non-Discrimination</strong>: We will never discriminate against you, deny services, or alter pricing for exercising your privacy rights.</li>
|
|
267
|
+
</ul>
|
|
268
|
+
<h3 class="policy-h3">How to Exercise Your Rights</h3>
|
|
269
|
+
<p>To submit a privacy inquiry, request data export, or request permanent deletion of your tenant domain space, please contact us using the information in Section 9 below. We will verify your identity (using your registered email or cryptographic keystone proof) and respond within the statutory timeframe (typically 45 days).</p>
|
|
270
|
+
<hr class="divider">
|
|
271
|
+
<h2 class="policy-h2">9. Contact Information & Policy Updates</h2>
|
|
272
|
+
<h3 class="policy-h3">Contact Us</h3>
|
|
273
|
+
<p>If you have questions, comments, or requests regarding this Privacy Policy or our data handling practices, please reach out to us:</p>
|
|
274
|
+
<ul>
|
|
275
|
+
<li><strong>Open-Source Packages</strong>: Published on <strong>npm</strong> under the <code>@ibgib</code> scope.</li>
|
|
276
|
+
<li><strong>Email / Privacy Inquiries</strong>: <code>ibgib.info@gmail.com</code></li>
|
|
277
|
+
</ul>
|
|
278
|
+
<h3 class="policy-h3">Updates to This Policy</h3>
|
|
279
|
+
<p>We may update this Privacy Policy from time to time to reflect architectural advancements, legal requirements, or operational changes. When changes are made, the "Last Updated" date at the top of this document will be updated. We encourage you to review this policy periodically.</p>
|
|
280
|
+
</main>
|
|
281
|
+
|
|
282
|
+
<footer class="footer-bar">
|
|
283
|
+
<span>© ibgib contributors</span>
|
|
284
|
+
<span><a href="https://ibgib.space">ibgib.space</a> · <a href="https://github.com/ibgib" target="_blank" rel="noopener">GitHub</a></span>
|
|
285
|
+
</footer>
|
|
286
|
+
</div>
|
|
287
|
+
</body>
|
|
288
|
+
</html>
|
package/dist/client/script.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{p as e}from"./chunk-
|
|
1
|
+
import{p as e}from"./chunk-7YXHRAEW.mjs";import"./chunk-M2IO3EMM.mjs";console.log("space-gib early script executing...");e();
|
package/dist/server/server.mjs
CHANGED
|
@@ -18136,6 +18136,9 @@ var StaticFileHandler = class _StaticFileHandler extends ServeGibHandlerBase {
|
|
|
18136
18136
|
if (existsSync3(filePath) && statSync(filePath).isDirectory()) {
|
|
18137
18137
|
filePath = join6(filePath, "index.html");
|
|
18138
18138
|
}
|
|
18139
|
+
if (!existsSync3(filePath) && existsSync3(filePath + ".html")) {
|
|
18140
|
+
filePath = filePath + ".html";
|
|
18141
|
+
}
|
|
18139
18142
|
if (!existsSync3(filePath)) {
|
|
18140
18143
|
filePath = join6(this.clientDir, "index.html");
|
|
18141
18144
|
}
|
|
@@ -20960,7 +20963,7 @@ var KeystoneService_V1 = class _KeystoneService_V1 {
|
|
|
20960
20963
|
* Requires the Master Secret to authorize the change via a pool containing
|
|
20961
20964
|
* the 'manage' verb.
|
|
20962
20965
|
*/
|
|
20963
|
-
async addPools({ latestKeystone, masterSecret, newPools, frameDetails, dataToPatch, metaspace, space }) {
|
|
20966
|
+
async addPools({ latestKeystone, masterSecret, signingPoolId, newPools, frameDetails, dataToPatch, metaspace, space }) {
|
|
20964
20967
|
const lc2 = `${this.lc}[${this.addPools.name}]`;
|
|
20965
20968
|
try {
|
|
20966
20969
|
if (logalot46) {
|
|
@@ -20978,6 +20981,7 @@ var KeystoneService_V1 = class _KeystoneService_V1 {
|
|
|
20978
20981
|
}
|
|
20979
20982
|
const adminPool = resolveTargetPool({
|
|
20980
20983
|
pools: prevData.challengePools,
|
|
20984
|
+
poolId: signingPoolId,
|
|
20981
20985
|
verb: KEYSTONE_VERB_MANAGE
|
|
20982
20986
|
});
|
|
20983
20987
|
if (logalot46) {
|
|
@@ -21057,7 +21061,7 @@ var KeystoneService_V1 = class _KeystoneService_V1 {
|
|
|
21057
21061
|
* Requires the Master Secret to authorize the change via a pool containing
|
|
21058
21062
|
* the 'manage' verb (the administrative manage pool).
|
|
21059
21063
|
*/
|
|
21060
|
-
async removePools({ latestKeystone, masterSecret, poolIds, frameDetails, dataToPatch, metaspace, space }) {
|
|
21064
|
+
async removePools({ latestKeystone, masterSecret, signingPoolId, poolIds, frameDetails, dataToPatch, metaspace, space }) {
|
|
21061
21065
|
const lc2 = `${this.lc}[${this.removePools.name}]`;
|
|
21062
21066
|
try {
|
|
21063
21067
|
if (logalot46) {
|
|
@@ -21075,6 +21079,7 @@ var KeystoneService_V1 = class _KeystoneService_V1 {
|
|
|
21075
21079
|
}
|
|
21076
21080
|
const adminPool = resolveTargetPool({
|
|
21077
21081
|
pools: prevData.challengePools,
|
|
21082
|
+
poolId: signingPoolId,
|
|
21078
21083
|
verb: KEYSTONE_VERB_MANAGE
|
|
21079
21084
|
});
|
|
21080
21085
|
if (logalot46) {
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generate-privacy-html.js
|
|
3
|
+
*
|
|
4
|
+
* Build-time script that reads canonical `docs/PRIVACY_POLICY.md` and generates
|
|
5
|
+
* a styled, standalone `src/client/privacy.html` page for space-gib using `@ibgib/helper-gib`.
|
|
6
|
+
*
|
|
7
|
+
* Run: node generate-privacy-html.js
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import * as pathUtils from 'path';
|
|
11
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
12
|
+
import { fileURLToPath } from 'node:url';
|
|
13
|
+
|
|
14
|
+
import { convertMarkdownToHtml } from '@ibgib/helper-gib/dist/helpers/markdown-helper.mjs';
|
|
15
|
+
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = pathUtils.dirname(__filename);
|
|
18
|
+
|
|
19
|
+
const lc = `[${import.meta.url}]`;
|
|
20
|
+
console.log(`${lc} starting...`);
|
|
21
|
+
|
|
22
|
+
const privacyMdPath = pathUtils.resolve(__dirname, '../../docs/PRIVACY_POLICY.md');
|
|
23
|
+
const outputHtmlPath = pathUtils.resolve(__dirname, './src/client/privacy.html');
|
|
24
|
+
|
|
25
|
+
const mdContent = await readFile(privacyMdPath, { encoding: 'utf8' });
|
|
26
|
+
|
|
27
|
+
const bodyHtml = convertMarkdownToHtml(mdContent, { linkTarget: '_blank', linkRel: 'noopener' });
|
|
28
|
+
|
|
29
|
+
const fullHtml = `<!DOCTYPE html>
|
|
30
|
+
<html lang="en-US">
|
|
31
|
+
<head>
|
|
32
|
+
<meta charset="utf-8" />
|
|
33
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
34
|
+
<title>Privacy Policy · ibgib.space</title>
|
|
35
|
+
<link rel="stylesheet" type="text/css" href="/style.css">
|
|
36
|
+
<style>
|
|
37
|
+
html, body {
|
|
38
|
+
height: auto !important;
|
|
39
|
+
min-height: 100% !important;
|
|
40
|
+
overflow-y: auto !important;
|
|
41
|
+
overflow-x: hidden !important;
|
|
42
|
+
}
|
|
43
|
+
body {
|
|
44
|
+
background: #11111b;
|
|
45
|
+
color: #cdd6f4;
|
|
46
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
47
|
+
margin: 0;
|
|
48
|
+
padding: 0;
|
|
49
|
+
line-height: 1.6;
|
|
50
|
+
}
|
|
51
|
+
.page-container {
|
|
52
|
+
max-width: 860px;
|
|
53
|
+
margin: 0 auto;
|
|
54
|
+
padding: 2.5rem 1.5rem 4rem;
|
|
55
|
+
}
|
|
56
|
+
.header-bar {
|
|
57
|
+
display: flex;
|
|
58
|
+
align-items: center;
|
|
59
|
+
justify-content: space-between;
|
|
60
|
+
padding-bottom: 1.5rem;
|
|
61
|
+
margin-bottom: 2rem;
|
|
62
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
|
63
|
+
}
|
|
64
|
+
.brand-link {
|
|
65
|
+
color: #89b4fa;
|
|
66
|
+
text-decoration: none;
|
|
67
|
+
font-weight: 700;
|
|
68
|
+
font-size: 1.2rem;
|
|
69
|
+
display: flex;
|
|
70
|
+
align-items: center;
|
|
71
|
+
gap: 0.5rem;
|
|
72
|
+
}
|
|
73
|
+
.back-link {
|
|
74
|
+
color: #a6adc8;
|
|
75
|
+
text-decoration: none;
|
|
76
|
+
font-size: 0.9rem;
|
|
77
|
+
padding: 0.4rem 0.8rem;
|
|
78
|
+
border-radius: 6px;
|
|
79
|
+
background: rgba(255, 255, 255, 0.05);
|
|
80
|
+
transition: all 0.2s;
|
|
81
|
+
}
|
|
82
|
+
.back-link:hover {
|
|
83
|
+
color: #ffffff;
|
|
84
|
+
background: rgba(255, 255, 255, 0.1);
|
|
85
|
+
}
|
|
86
|
+
.policy-title {
|
|
87
|
+
font-size: 2.2rem;
|
|
88
|
+
color: #ffffff;
|
|
89
|
+
margin-top: 0;
|
|
90
|
+
margin-bottom: 0.5rem;
|
|
91
|
+
}
|
|
92
|
+
.policy-h2 {
|
|
93
|
+
font-size: 1.4rem;
|
|
94
|
+
color: #50fa7b;
|
|
95
|
+
margin-top: 2rem;
|
|
96
|
+
margin-bottom: 0.75rem;
|
|
97
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
|
|
98
|
+
padding-bottom: 0.3rem;
|
|
99
|
+
}
|
|
100
|
+
.policy-h3 {
|
|
101
|
+
font-size: 1.1rem;
|
|
102
|
+
color: #89b4fa;
|
|
103
|
+
margin-top: 1.5rem;
|
|
104
|
+
margin-bottom: 0.5rem;
|
|
105
|
+
}
|
|
106
|
+
p, li {
|
|
107
|
+
color: #cdd6f4;
|
|
108
|
+
font-size: 0.95rem;
|
|
109
|
+
}
|
|
110
|
+
ul, ol {
|
|
111
|
+
padding-left: 1.5rem;
|
|
112
|
+
margin: 0.5rem 0 1rem;
|
|
113
|
+
}
|
|
114
|
+
li {
|
|
115
|
+
margin-bottom: 0.35rem;
|
|
116
|
+
}
|
|
117
|
+
code {
|
|
118
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
119
|
+
font-size: 0.85em;
|
|
120
|
+
background: rgba(255, 255, 255, 0.08);
|
|
121
|
+
padding: 0.15rem 0.35rem;
|
|
122
|
+
border-radius: 4px;
|
|
123
|
+
color: #f5c2e7;
|
|
124
|
+
}
|
|
125
|
+
code.math {
|
|
126
|
+
color: #89dceb;
|
|
127
|
+
}
|
|
128
|
+
a {
|
|
129
|
+
color: #89b4fa;
|
|
130
|
+
text-decoration: underline;
|
|
131
|
+
}
|
|
132
|
+
a:hover {
|
|
133
|
+
color: #b4befe;
|
|
134
|
+
}
|
|
135
|
+
.divider {
|
|
136
|
+
border: 0;
|
|
137
|
+
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
|
138
|
+
margin: 2rem 0;
|
|
139
|
+
}
|
|
140
|
+
.alert-box {
|
|
141
|
+
display: flex;
|
|
142
|
+
gap: 0.75rem;
|
|
143
|
+
padding: 1rem 1.25rem;
|
|
144
|
+
border-radius: 8px;
|
|
145
|
+
margin: 1.25rem 0;
|
|
146
|
+
align-items: flex-start;
|
|
147
|
+
}
|
|
148
|
+
.alert-warning {
|
|
149
|
+
background: rgba(249, 226, 175, 0.08);
|
|
150
|
+
border: 1px solid rgba(249, 226, 175, 0.3);
|
|
151
|
+
color: #f9e2af;
|
|
152
|
+
}
|
|
153
|
+
.alert-important {
|
|
154
|
+
background: rgba(137, 180, 250, 0.08);
|
|
155
|
+
border: 1px solid rgba(137, 180, 250, 0.3);
|
|
156
|
+
color: #89b4fa;
|
|
157
|
+
}
|
|
158
|
+
.alert-note {
|
|
159
|
+
background: rgba(180, 190, 254, 0.08);
|
|
160
|
+
border: 1px solid rgba(180, 190, 254, 0.3);
|
|
161
|
+
color: #b4befe;
|
|
162
|
+
}
|
|
163
|
+
.alert-icon {
|
|
164
|
+
font-size: 1.2rem;
|
|
165
|
+
line-height: 1.2;
|
|
166
|
+
}
|
|
167
|
+
.alert-body {
|
|
168
|
+
font-size: 0.88rem;
|
|
169
|
+
line-height: 1.45;
|
|
170
|
+
color: #cdd6f4;
|
|
171
|
+
}
|
|
172
|
+
.footer-bar {
|
|
173
|
+
margin-top: 3.5rem;
|
|
174
|
+
padding-top: 1.5rem;
|
|
175
|
+
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
|
176
|
+
font-size: 0.85rem;
|
|
177
|
+
color: #a6adc8;
|
|
178
|
+
display: flex;
|
|
179
|
+
justify-content: space-between;
|
|
180
|
+
flex-wrap: wrap;
|
|
181
|
+
gap: 1rem;
|
|
182
|
+
}
|
|
183
|
+
</style>
|
|
184
|
+
</head>
|
|
185
|
+
<body>
|
|
186
|
+
<div class="page-container">
|
|
187
|
+
<header class="header-bar">
|
|
188
|
+
<a href="/" class="brand-link">
|
|
189
|
+
<span>◈</span>
|
|
190
|
+
<span>🌌 space-gib 🌌</span>
|
|
191
|
+
</a>
|
|
192
|
+
<a href="/" class="back-link">← Return to App</a>
|
|
193
|
+
</header>
|
|
194
|
+
|
|
195
|
+
<main>
|
|
196
|
+
${bodyHtml}
|
|
197
|
+
</main>
|
|
198
|
+
|
|
199
|
+
<footer class="footer-bar">
|
|
200
|
+
<span>© ibgib contributors</span>
|
|
201
|
+
<span><a href="https://ibgib.space">ibgib.space</a> · <a href="https://github.com/ibgib" target="_blank" rel="noopener">GitHub</a></span>
|
|
202
|
+
</footer>
|
|
203
|
+
</div>
|
|
204
|
+
</body>
|
|
205
|
+
</html>`;
|
|
206
|
+
|
|
207
|
+
await writeFile(outputHtmlPath, fullHtml, { encoding: 'utf8' });
|
|
208
|
+
console.log(`${lc} complete. wrote ${outputHtmlPath}`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ibgib/space-gib",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.21",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "ibgib storage and provider service — SaaS at ibgib.space",
|
|
6
6
|
"scripts": {
|
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
"build:test": "tsc -p tsconfig.test.json"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@ibgib/core-gib": "^0.1.
|
|
15
|
+
"@ibgib/core-gib": "^0.1.77",
|
|
16
16
|
"@ibgib/helper-gib": "^0.0.37",
|
|
17
17
|
"@ibgib/ts-gib": "^0.5.34",
|
|
18
|
-
"@ibgib/web-gib": "^0.0.
|
|
19
|
-
"@ibgib/node-gib": "^0.0.
|
|
18
|
+
"@ibgib/web-gib": "^0.0.63",
|
|
19
|
+
"@ibgib/node-gib": "^0.0.22"
|
|
20
20
|
},
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=20.0.0"
|
package/src/client/index.html
CHANGED
|
@@ -294,7 +294,7 @@
|
|
|
294
294
|
<p class="footer-text">
|
|
295
295
|
<span>© ibgib contributors</span> ·
|
|
296
296
|
<a href="https://ibgib.space" class="footer-link">ibgib.space</a> ·
|
|
297
|
-
<a href="
|
|
297
|
+
<a href="/privacy" class="footer-link" target="_blank" rel="noopener">Privacy Policy</a>
|
|
298
298
|
</p>
|
|
299
299
|
</footer>
|
|
300
300
|
|