Humuhumu33 commited on
Commit
2bdd0e7
·
verified ·
1 Parent(s): 7195739

retire-provenance: superseded Q b/ objects (sha256 CAS, HOLO-LEAN-RESOLVER P1.3)

Browse files
sha256/2a18cc07373595a4c89911410c2419e8519bc40f2d76670d43db286cdf166802 ADDED
@@ -0,0 +1,552 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <meta charset="utf-8">
3
+ <meta name="viewport" content="width=device-width,initial-scale=1">
4
+ <title>Bonsai</title>
5
+ <style>
6
+ /* Claude-desktop look: warm charcoal stage, 11% hairlines, 12-14px radii, serif display, coral accent.
7
+ Type floor is 15px everywhere. Everything fits ONE viewport at 1280×800 AND 375×812 (dvh + clamp). */
8
+ :root { --bg:#262624; --ink:#eceae4; --muted:#b8b5ad; --faint:rgba(232,230,224,.45);
9
+ --hair:rgba(255,255,255,.11); --coral:#d97757; --coral-hi:#e8987a; --lav:#c4b5fd; --r:13px;
10
+ --serif:"Tiempos Text","Charter","Iowan Old Style",Georgia,serif; }
11
+ * { box-sizing:border-box; margin:0; padding:0; }
12
+ html,body { height:100%; }
13
+ body { background:var(--bg); color:var(--ink); font:15px/1.55 system-ui,-apple-system,"Segoe UI",Inter,sans-serif;
14
+ -webkit-font-smoothing:antialiased; overflow:hidden; }
15
+ .num { font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; font-size:15px; }
16
+ .stage { position:fixed; inset:0; height:100dvh; display:flex; flex-direction:column; align-items:center;
17
+ justify-content:center; padding:24px; opacity:0; pointer-events:none; transition:opacity .6s ease; }
18
+ .stage.on { opacity:1; pointer-events:auto; }
19
+
20
+ /* ── arrival: full-bleed hologram canvas behind left-aligned copy ── */
21
+ #arrive { flex-direction:row; align-items:center; justify-content:flex-start; padding:0; }
22
+ #holo { position:absolute; inset:0; width:100%; height:100%; display:block; }
23
+ #arrive .copy { position:relative; z-index:1; max-width:620px; padding:0 clamp(24px,6vw,96px); }
24
+ #arrive h1 { font-family:var(--serif); font-weight:500; font-size:clamp(40px,7vw,84px); line-height:1.06;
25
+ letter-spacing:-.015em; text-wrap:balance; }
26
+ #arrive .sub { margin-top:22px; font-size:clamp(18px,1.6vw,20px); line-height:1.5; color:var(--muted); max-width:46ch; }
27
+ #arrive button { margin-top:34px; background:var(--coral); border:none; color:#faf9f5; border-radius:999px;
28
+ padding:16px 34px; font:500 17px/1 system-ui,sans-serif; cursor:pointer;
29
+ transition:transform .2s ease, filter .2s ease; }
30
+ #arrive button:hover { filter:brightness(1.08); transform:translateY(-1px); }
31
+ #arrive button:disabled { filter:saturate(.3) brightness(.8); cursor:default; transform:none; }
32
+ #arrive .fine { margin-top:16px; font-size:15px; color:var(--faint); }
33
+ @media (max-width:760px) { /* stacked: hologram floats in the upper half, copy anchors low */
34
+ #arrive { align-items:flex-end; }
35
+ #arrive .copy { padding-bottom:max(44px, env(safe-area-inset-bottom, 0px) + 36px); }
36
+ }
37
+
38
+ /* ── chat: the Claude-desktop room — serif greeting, ONE centered input card, quiet metrics ── */
39
+ #chat { justify-content:center; padding:0; }
40
+ #chat .col { display:flex; flex-direction:column; width:min(100%,760px); height:100%; padding:0 22px; justify-content:center; }
41
+ #chat .col.started { justify-content:flex-start; }
42
+ #hello { text-align:center; margin-bottom:26px; }
43
+ #hello .mark { display:inline-block; width:30px; height:30px; vertical-align:-4px; margin-right:12px; color:var(--coral); }
44
+ #hello h2 { display:inline; font-family:var(--serif); font-weight:500; font-size:clamp(30px,4.4vw,44px); letter-spacing:-.01em; }
45
+ .col.started #hello { display:none; }
46
+ #log { display:none; }
47
+ .col.started #log { display:block; flex:1; overflow-y:auto; padding:30px 4px 16px;
48
+ scrollbar-width:none; -ms-overflow-style:none; } /* the content scrolls; no chrome */
49
+ #log::-webkit-scrollbar { width:0; height:0; }
50
+ .msg { margin:0 0 22px; }
51
+ .msg .who { font-size:15px; color:var(--faint); margin-bottom:4px; }
52
+ .msg.user { display:flex; justify-content:flex-end; } /* Grok/Claude: user turn is a right bubble */
53
+ .msg.user .who { display:none; }
54
+ .msg.user .body { background:rgba(255,255,255,.05); border:1px solid var(--hair); border-radius:16px 16px 4px 16px;
55
+ padding:11px 16px; max-width:78%; }
56
+ .msg .body { white-space:pre-wrap; font-size:16px; line-height:1.65; }
57
+ /* "Thought for Ns" — a quiet collapsible reasoning header (Grok's signature, in Claude's palette) */
58
+ details.think { margin:0 0 10px; }
59
+ details.think summary { list-style:none; cursor:pointer; font-size:15px; color:var(--faint);
60
+ display:inline-flex; align-items:center; gap:7px; user-select:none; }
61
+ details.think summary::-webkit-details-marker { display:none; }
62
+ details.think summary .chev { transition:transform .2s ease; font-size:11px; }
63
+ details.think[open] summary .chev { transform:rotate(90deg); }
64
+ details.think .t { color:var(--faint); font-size:15px; line-height:1.6; white-space:pre-wrap; margin-top:8px;
65
+ border-left:2px solid var(--hair); padding-left:12px; }
66
+ /* assistant action row: copy · regenerate (appears when the answer settles) */
67
+ .acts { display:flex; gap:4px; margin-top:8px; opacity:0; transition:opacity .25s ease; }
68
+ .msg:hover .acts, .acts.shown { opacity:1; }
69
+ .acts button { background:none; border:none; color:var(--faint); cursor:pointer; border-radius:8px;
70
+ width:30px; height:30px; display:grid; place-items:center; transition:background .15s, color .15s; }
71
+ .acts button:hover { background:rgba(255,255,255,.06); color:var(--ink); }
72
+ .acts button svg { width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:1.7; }
73
+ .acts .ok { color:var(--coral-hi); }
74
+ /* follow-up suggestions: Grok's placement — borderless rows stacked in the conversation flow */
75
+ .fu { display:flex; flex-direction:column; margin:14px 0 4px; }
76
+ .fu button { display:flex; align-items:center; gap:12px; background:none; border:none; border-top:1px solid transparent;
77
+ color:var(--muted); font-size:16px; text-align:left; padding:11px 6px; cursor:pointer;
78
+ border-radius:10px; transition:background .15s, color .15s; }
79
+ .fu button:hover { background:rgba(255,255,255,.045); color:var(--ink); }
80
+ .fu .arr { color:var(--faint); font-size:15px; flex:none; }
81
+ .note { text-align:center; font-size:15px; color:var(--faint); margin:6px 0 12px; }
82
+ #card { background:rgba(255,255,255,.03); border:1px solid var(--hair); border-radius:18px; padding:6px 8px 8px; }
83
+ #card:focus-within { border-color:rgba(217,119,87,.5); }
84
+ #inp { width:100%; background:none; border:none; color:var(--ink); padding:14px 12px 10px;
85
+ font:16px/1.45 system-ui,sans-serif; outline:none; }
86
+ #cardrow { display:flex; align-items:center; gap:12px; padding:0 8px 4px 12px; }
87
+ #modelname { font-size:15px; color:var(--muted); }
88
+ #cardrow .grow { flex:1; }
89
+ #send { background:var(--coral); border:none; color:#faf9f5; border-radius:999px; width:38px; height:38px;
90
+ font:500 17px/1 system-ui,sans-serif; cursor:pointer; transition:filter .2s ease; }
91
+ #send:hover { filter:brightness(1.08); }
92
+ #send:disabled { background:rgba(255,255,255,.06); color:var(--faint); cursor:default; }
93
+ #metrics { text-align:center; font-size:15px; color:var(--faint); padding:12px 0 16px; min-height:22px; }
94
+ #metrics b { color:var(--muted); font-weight:500; }
95
+ #err { color:#f87171; font-size:15px; padding:0 0 18px; text-align:center; white-space:pre-wrap; }
96
+ .spn { display:inline-block; width:1.1ch; font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
97
+ color:var(--coral-hi); margin-right:7px; }
98
+ /* CSS hologram (fallback when WebGL is unavailable/blocked): layered orb + scanlines + drift */
99
+ #holofb { position:absolute; width:min(46vw,520px); aspect-ratio:1; right:4vw; top:50%;
100
+ transform:translateY(-50%); border-radius:50%; pointer-events:none;
101
+ background:radial-gradient(circle at 38% 34%, rgba(232,152,122,.55), rgba(217,119,87,.28) 42%, rgba(196,181,253,.16) 72%, transparent 76%);
102
+ box-shadow:0 0 90px rgba(217,119,87,.25), inset 0 0 60px rgba(196,181,253,.18);
103
+ animation:holofloat 7s ease-in-out infinite; }
104
+ #holofb::before { content:""; position:absolute; inset:0; border-radius:50%;
105
+ background:repeating-linear-gradient(to bottom, rgba(255,255,255,.09) 0 2px, transparent 2px 7px);
106
+ mix-blend-mode:screen; animation:holoscan 2.6s linear infinite;
107
+ -webkit-mask:radial-gradient(circle, #000 70%, transparent 74%); mask:radial-gradient(circle, #000 70%, transparent 74%); }
108
+ #holofb::after { content:""; position:absolute; inset:-2%; border-radius:50%;
109
+ border:1px solid rgba(196,181,253,.30); filter:blur(.4px); }
110
+ @keyframes holofloat { 50% { transform:translateY(calc(-50% - 14px)); } }
111
+ @keyframes holoscan { to { background-position:0 7px; } }
112
+ @media (max-width:760px){ #holofb { right:50%; top:26%; transform:translate(50%,-50%); width:min(62vw,300px); }
113
+ @keyframes holofloat { 50% { transform:translate(50%,calc(-50% - 10px)); } } }
114
+ @media (prefers-reduced-motion: reduce){ #holofb, #holofb::before { animation:none; } }
115
+ </style>
116
+ <body>
117
+
118
+ <div class="stage on" id="arrive">
119
+ <canvas id="holo"></canvas>
120
+ <div id="holofb" hidden></div>
121
+ <div class="copy">
122
+ <h1>An AI<br>that&rsquo;s yours.</h1>
123
+ <p class="sub">Bonsai streams into your browser like a film. Every piece is checked before it runs. After one visit it answers on your device, even offline.</p>
124
+ <button id="go">Stream the mind</button>
125
+ <div class="fine" id="fine">Free &middot; open weights by Prism ML &middot; nothing leaves your device</div>
126
+ </div>
127
+ </div>
128
+
129
+ <div class="stage" id="chat">
130
+ <div class="col" id="col">
131
+ <div id="hello">
132
+ <svg class="mark" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" aria-hidden="true"><path d="M12 3v18M3 12h18M5.6 5.6l12.8 12.8M18.4 5.6L5.6 18.4"/></svg><h2>Ready when you are.</h2>
133
+ </div>
134
+ <div id="log"></div>
135
+ <div id="card">
136
+ <input id="inp" placeholder="Ask Bonsai anything" autocomplete="off">
137
+ <div id="cardrow">
138
+ <span id="modelname">Bonsai</span>
139
+ <span class="grow"></span>
140
+ <button id="send" aria-label="Send">&uarr;</button>
141
+ </div>
142
+ </div>
143
+ <div id="metrics">on your device</div>
144
+ <div id="err" hidden></div>
145
+ </div>
146
+ </div>
147
+
148
+ <script type="module">
149
+ // ── the OS boot animation, verbatim look ─────────────────────────────────────────────────────
150
+ // This is the SAME animation the OS greeter shows on its login screen (holo-plymouth.mjs): the
151
+ // abstract_ring Plymouth theme — a dense torus of dark spheres cycling progress-0..40.png at
152
+ // 25 fps — streamed progressively from the same public pack the OS streams from
153
+ // (adi1090x/plymouth-themes, GPL-3.0 artwork), cached in the Cache API so every return visit
154
+ // paints instantly and offline. Each frame's baked-black background is CHROMA-KEYED to
155
+ // transparent on decode (the greeter's keyBlack, verbatim), so the emblem floats over the stage
156
+ // with no black box — identical to the login screen.
157
+ const cv = document.getElementById("holo");
158
+ const reduced = matchMedia("(prefers-reduced-motion: reduce)").matches;
159
+ window.__holoOff = null;
160
+ try {
161
+ const N = 41, FPS = 25;
162
+ const url = (i) => "https://raw.githubusercontent.com/adi1090x/plymouth-themes/master/pack_1/abstract_ring/progress-" + i + ".png";
163
+ const ctx = cv.getContext("2d");
164
+ const frames = new Array(N).fill(null);
165
+ let have = 0, dead = false, raf = 0;
166
+ // Plymouth sprites bake their black screen into the PNG; over the stage that black must be AIR.
167
+ // keyBlack (holo-plymouth.mjs, verbatim ramp) fades near-black pixels to transparent → the ring
168
+ // floats on the charcoal exactly like the greeter's emblem floats on the login wall.
169
+ const keyBlack = (bmp) => {
170
+ try {
171
+ const w = bmp.width, h = bmp.height; if (!w || !h) return bmp;
172
+ const c = document.createElement("canvas"); c.width = w; c.height = h;
173
+ const x = c.getContext("2d", { willReadFrequently: true });
174
+ x.drawImage(bmp, 0, 0);
175
+ const d = x.getImageData(0, 0, w, h), p = d.data;
176
+ for (let i = 0; i < p.length; i += 4) {
177
+ const v = Math.max(p[i], p[i + 1], p[i + 2]);
178
+ if (v < 48) p[i + 3] = Math.min(p[i + 3], Math.max(0, ((v - 12) / 36) * 255) | 0);
179
+ }
180
+ x.putImageData(d, 0, 0);
181
+ return c;
182
+ } catch { return bmp; }
183
+ };
184
+ const cachePromise = caches.open("holo-plymouth-v1").catch(() => null);
185
+ const loadFrame = async (i) => {
186
+ try {
187
+ const cache = await cachePromise;
188
+ let resp = cache && await cache.match(url(i));
189
+ if (!resp) { resp = await fetch(url(i)); if (cache && resp.ok) { try { await cache.put(url(i), resp.clone()); } catch {} } }
190
+ if (!resp || !resp.ok) return;
191
+ frames[i] = keyBlack(await createImageBitmap(await resp.blob()));
192
+ have++;
193
+ } catch {}
194
+ };
195
+ // frame 0 first (first paint), then the rest with small concurrency — plays as it arrives
196
+ await loadFrame(0);
197
+ (async () => { let i = 1; const w = async () => { while (i < N && !dead) { const k = i++; await loadFrame(k); } };
198
+ await Promise.all([w(), w(), w(), w()]); })();
199
+ const size = () => { cv.width = innerWidth * Math.min(devicePixelRatio || 1, 2); cv.height = innerHeight * Math.min(devicePixelRatio || 1, 2); };
200
+ size(); addEventListener("resize", size);
201
+ let f = 0, last = 0;
202
+ const draw = (t) => {
203
+ if (dead) return;
204
+ raf = requestAnimationFrame(draw);
205
+ if (t - last < 1000 / FPS) return; last = t;
206
+ if (!reduced) { f = (f + 1) % N; }
207
+ let img = frames[f]; if (!img) { for (let k = 0; k < N; k++) if (frames[k]) { img = frames[k]; break; } }
208
+ if (!img) return;
209
+ ctx.clearRect(0, 0, cv.width, cv.height);
210
+ const desktop = cv.width / cv.height > 0.92;
211
+ const s = Math.min(cv.width, cv.height) * (desktop ? 0.72 : 0.6) / Math.max(img.width, img.height);
212
+ const w = img.width * s, h = img.height * s;
213
+ const x = desktop ? cv.width * 0.72 - w / 2 : cv.width / 2 - w / 2;
214
+ const y = desktop ? cv.height / 2 - h / 2 : cv.height * 0.28 - h / 2;
215
+ ctx.drawImage(img, x, y, w, h);
216
+ };
217
+ raf = requestAnimationFrame(draw);
218
+ document.addEventListener("visibilitychange", () => { if (dead) return; if (document.hidden) cancelAnimationFrame(raf); else raf = requestAnimationFrame(draw); });
219
+ window.__holoFrame = () => cv.toDataURL("image/png");
220
+ window.__holoOff = () => { dead = true; cancelAnimationFrame(raf); window.__holoFrame = null; cv.remove(); };
221
+ setTimeout(() => { if (!dead && have === 0) { const fb = document.getElementById("holofb"); if (fb) fb.hidden = false; } }, 4000); // no frames at all → CSS stand-in
222
+ } catch (e) {
223
+ const fb = document.getElementById("holofb"); if (fb) fb.hidden = false;
224
+ }
225
+ </script>
226
+
227
+ <script type="module">
228
+ import init, { qvac_load_gpu, qvac_gpu_free } from "../q/pkg/holospaces_web.js";
229
+ import { loadKappaObject } from "../q/holo-load2bit.mjs";
230
+ import { createQvacGPU } from "../q/qvac-gpu.js?v=68";
231
+ import { createEngine } from "../q/core/engine.js";
232
+
233
+ const $ = (id) => document.getElementById(id);
234
+ // braille pulse: one 80ms ticker animates every [data-spin] slot (loading, waking, thinking) —
235
+ // a single interval, zero layout work, stops mattering the instant the last spinner is removed.
236
+ const SPIN = ["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];
237
+ let _sf = 0;
238
+ setInterval(() => { const els = document.querySelectorAll("[data-spin]"); if (!els.length) return; const f = SPIN[_sf = (_sf + 1) % SPIN.length]; for (const el of els) el.textContent = f; }, 80);
239
+ const spn = () => `<span class="spn" data-spin>${SPIN[0]}</span>`;
240
+ const show = (id) => { for (const s of document.querySelectorAll(".stage")) s.classList.toggle("on", s.id === id); };
241
+ const short = (k) => String(k).replace(/^(did:holo:)?sha256:/, "").slice(0, 12) + "…";
242
+
243
+ // model source: ?src=<κ-object dir> for dev, HF mirror by default; ?m=27b flips to the 27B
244
+ // κ-object (engine support for its hybrid layers lands separately — the guard below is honest).
245
+ // Everything shown to the user (name, size) is READ FROM THE MANIFEST — swapping the κ URL is a
246
+ // zero-code model change. The manifest pin is the Law-L5 anchor.
247
+ const QS = new URLSearchParams(location.search);
248
+ const SRC = QS.get("src");
249
+ const DEFAULT_27B = false; // flips true the moment the hybrid engine passes parity (κ-object already published)
250
+ const M27 = QS.get("m") === "27b" || (DEFAULT_27B && QS.get("m") !== "8b");
251
+ const BASE = SRC || (M27 ? "https://huggingface.co/HOLOGRAMTECH/q-bonsai-27b/resolve/main" : "https://huggingface.co/HOLOGRAMTECH/q-bonsai-8b/resolve/main");
252
+ const PIN = M27 ? "did:holo:sha256:00beea03509a79f6567879f019c04bb15dda8721f6320f8295d9ea1dd9ba54af" : "did:holo:sha256:a0dc81f26ec5ce98b28ee9c1fab620e91c20720f777e1de6bc416317f54d27e2";
253
+ const CTX = 2048; // room for the reasoning trace + the answer on open-ended questions
254
+
255
+ let engine = null, gpu = null, rootK = "", warm = false, mind = [], thinkOpen = -1, thinkClose = -1;
256
+ let modelName = "Bonsai"; // set from the manifest once loaded
257
+ let story = [], memoryNote = ""; // the WHOLE conversation + the folded memory of its older part
258
+ const STORE = "bonsai.story.v1";
259
+ function persistStory() {
260
+ try { localStorage.setItem(STORE, JSON.stringify({ story: story.slice(-200), memoryNote })); } catch {}
261
+ }
262
+ // fold everything so far into a compact memory the model writes for itself (bounded, abortable-free:
263
+ // runs inside send() before the next turn, with the braille pulse narrating it)
264
+ async function foldMemory() {
265
+ const recent = story.slice(-8).map((t) => `Q: ${t.q}
266
+ A: ${t.a.slice(0, 300)}`).join("\n");
267
+ const prior = memoryNote ? "Earlier memory: " + memoryNote + "\n\n" : "";
268
+ const ask = prior + "Recent conversation:\n" + recent + "\n\nFold ALL of the above into one memory note under 130 words. Keep every name, number, decision and open question. Write only the note.";
269
+ const ids = engine.tokenize(engine.frameTurn(ask, false));
270
+ const res = await engine.generate(ids, { maxNew: 300 });
271
+ const seg = splitThink(res.outIds || []);
272
+ const text = (seg.ans.length ? engine.detokenize(seg.ans) : res.text || "").trim();
273
+ return text.slice(0, 1200);
274
+ }
275
+
276
+ let entered = false, streamStarted = false;
277
+ async function stream() {
278
+ try { if (window.__holoOff) { window.__holoOff(); window.__holoOff = null; } } catch {} // hand the GPU to the engine
279
+ if (entered) { show("chat"); $("inp").focus(); } // welcome stays until the visitor chooses to enter
280
+ const t0 = performance.now();
281
+ const phase = (s) => { $("metrics").innerHTML = s; };
282
+ try {
283
+ if (!navigator.gpu) throw new Error("This browser has no WebGPU. Chrome or Edge 113+ required.");
284
+ // warm-load detect (honest offline copy): the κ-cache already holds the manifest → this visit is disk-speed.
285
+ try { const c = await caches.open("holo-kappa-v1"); warm = !!(await c.match(BASE + "/manifest.json")); } catch {}
286
+ phase(spn() + (warm ? "waking up · from your disk" : "streaming the mind · every piece verified on arrival"));
287
+ await init();
288
+ // PARALLEL κ-BLOCKS FIRST (the measured Netflix path on CDN origins): 399 content-addressed
289
+ // blocks race over 12 connections (HF cdn-lfs caps a single stream ~2 MB/s; the parallel parts
290
+ // path measured 6.8 MB/s on the same line). The ONE-file .holo stays as the fallback for
291
+ // origins that only host the wafer (and its OPFS warm store makes revisits 0-network either way).
292
+ let r, pinned = true, holo = false;
293
+ try {
294
+ r = await loadKappaObject(BASE, { expectKappa: PIN, blake3: false });
295
+ } catch (e1) {
296
+ try {
297
+ const hs = await import("../q/core/holo-stream-load.mjs");
298
+ r = await hs.openHoloKappa(BASE + "/q-bonsai-8b.v1.holo", {});
299
+ holo = true; warm = !!r.warm;
300
+ } catch (e) { if (!SRC) throw e; pinned = false; r = await loadKappaObject(BASE, { allowUnpinned: true, blake3: false }); } // dev fallback only under ?src
301
+ }
302
+ rootK = (r.info && r.info.root) || PIN;
303
+ modelName = String((r.info && r.info.model) || "Bonsai").replace(/-/g, " ");
304
+ $("modelname").textContent = modelName;
305
+ // HONESTY GATE: the hybrid (27B) engine ships separately — never pretend to run what we can't.
306
+ if (r.manifest.hybrid) throw new Error(modelName + " uses a hybrid engine this build does not include yet. It is arriving; the 8B runs today.");
307
+ // progress = ONE quiet line under the input (per-tensor counters; no grid, no takeover)
308
+ const total = (r.manifest.tensors || []).length;
309
+ let done = 0, bytes = 0;
310
+ const tick = () => {
311
+ const dt = (performance.now() - t0) / 1000;
312
+ if (warm) phase(`${spn()}waking up · ${Math.round(done / Math.max(total, 1) * 100)}%`);
313
+ else phase(`${spn()}streaming the mind · <b>${(bytes / 1e6).toFixed(0)} MB</b> · ${(bytes / 1e6 / Math.max(dt, .1)).toFixed(1)} MB/s · every piece verified on arrival`);
314
+ };
315
+ const iv = setInterval(tick, 400);
316
+ const fetchT = async (name) => { // wrap fetchTensor: the progress driver
317
+ const b = await r.fetchTensor(name);
318
+ bytes += b.byteLength; done++;
319
+ return b;
320
+ };
321
+ // tokenizer header (arch + vocab) — embedded in the .holo (0 extra fetches), else same κ-object dir.
322
+ const hdr = r.tokenizerBytes || new Uint8Array(await (await fetch(BASE + "/tokenizer.gguf")).arrayBuffer());
323
+ const lr = JSON.parse(qvac_load_gpu(hdr));
324
+ if (lr.error) throw new Error("tokenizer: " + lr.error);
325
+ try { qvac_gpu_free(); } catch {}
326
+ r.manifest.kv4 = false; // exact f32 KV (the proven first-light config)
327
+ gpu = await createQvacGPU(r.manifest, fetchT, CTX, lr.eos ?? 2, false);
328
+ clearInterval(iv);
329
+ phase(spn() + "waking the mind");
330
+ const m = { fam: "Bonsai", name: modelName, size: "1.16 GB", fmt: "q1 1-bit κ", cap: 200, ctx: CTX, qwen: true, chat: true, rep: 1.05, gpu: true, gpuOnly: true };
331
+ engine = await createEngine(m, { gpu, info: lr, imageKappa: r.info.root });
332
+ // Qwen3 thinking markers are atomic tokens and clean() strips them from text — split by token id instead.
333
+ const o = engine.tokenize("<think>"), c2 = engine.tokenize("</think>");
334
+ thinkOpen = o.length === 1 ? o[0] : -1; thinkClose = c2.length === 1 ? c2[0] : -1;
335
+ enterChat();
336
+ } catch (e) {
337
+ $("metrics").textContent = ""; $("err").hidden = false;
338
+ $("err").textContent = String(e && e.message || e);
339
+ console.error(e);
340
+ }
341
+ }
342
+
343
+ // the ONLY chat metrics, one quiet line: model · time to first word · tok/s (operator spec)
344
+ let lastTTFT = null, lastTokps = null;
345
+ function metrics(state) {
346
+ const bits = [`<b>${modelName}</b>`];
347
+ if (lastTTFT != null) bits.push(`${lastTTFT.toFixed(1)}s to first word`);
348
+ if (lastTokps != null) bits.push(`<b>${lastTokps.toFixed(0)}</b> tokens a second`);
349
+ if (!lastTTFT && !lastTokps) bits.push(state || (warm ? "from your disk · works offline" : "on your device"));
350
+ $("metrics").innerHTML = bits.join(" &nbsp;&middot;&nbsp; ");
351
+ }
352
+ let pendingQ = null, restored = false;
353
+ function restoreStory() {
354
+ if (restored) return; restored = true;
355
+ try {
356
+ const saved = JSON.parse(localStorage.getItem(STORE) || "null");
357
+ if (!saved || !saved.story || !saved.story.length) return;
358
+ story = saved.story; memoryNote = saved.memoryNote || "";
359
+ $("col").classList.add("started");
360
+ for (const t of story.slice(-12)) { // the room re-fills; the model remembers ALL of it via the fold
361
+ msg("You", "user").body.textContent = t.q;
362
+ msg(modelName, "bot").body.textContent = t.a;
363
+ }
364
+ if (!memoryNote && story.length) memoryNote = story.slice(-6).map((t) => `${t.q} → ${t.a.slice(0, 120)}`).join("; ").slice(0, 1200);
365
+ note("picked up where you left off");
366
+ log.scrollTop = log.scrollHeight;
367
+ } catch {}
368
+ }
369
+ function enterChat() {
370
+ ready = true; $("send").disabled = false; restoreStory(); metrics();
371
+ if (pendingQ) { $("inp").value = pendingQ; pendingQ = null; send(); }
372
+ else if (entered) $("inp").focus();
373
+ }
374
+
375
+ const log = $("log");
376
+ function msg(who, cls) {
377
+ const d = document.createElement("div"); d.className = "msg " + cls;
378
+ d.innerHTML = `<div class="who">${who}</div>`;
379
+ const think = document.createElement("details"); think.className = "think"; think.hidden = true;
380
+ think.innerHTML = `<summary><span class="chev">▸</span><span class="sum">thinking…</span></summary><div class="t"></div>`;
381
+ const body = document.createElement("div"); body.className = "body";
382
+ d.appendChild(think); d.appendChild(body);
383
+ let acts = null;
384
+ if (cls === "bot") { acts = document.createElement("div"); acts.className = "acts"; d.appendChild(acts); }
385
+ log.appendChild(d);
386
+ log.scrollTop = log.scrollHeight;
387
+ return { d, body, think, acts, t: think.querySelector(".t") };
388
+ }
389
+ const ICON = {
390
+ copy: '<svg viewBox="0 0 24 24"><rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15V5a2 2 0 0 1 2-2h10"/></svg>',
391
+ ok: '<svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg>',
392
+ regen:'<svg viewBox="0 0 24 24"><path d="M21 12a9 9 0 1 1-3-6.7"/><path d="M21 3v5h-5"/></svg>',
393
+ };
394
+ function iconBtn(html, title, fn) { const b = document.createElement("button"); b.type = "button"; b.title = title; b.innerHTML = html; b.onclick = fn; return b; }
395
+ // action row: copy the answer + regenerate the last turn (Grok's row, Claude's restraint)
396
+ function fitActions(ui, text, regen) {
397
+ if (!ui.acts) return; ui.acts.innerHTML = "";
398
+ const copy = iconBtn(ICON.copy, "Copy", async () => {
399
+ try { await navigator.clipboard.writeText(text); copy.classList.add("ok"); copy.innerHTML = ICON.ok;
400
+ setTimeout(() => { copy.classList.remove("ok"); copy.innerHTML = ICON.copy; }, 1200); } catch {}
401
+ });
402
+ ui.acts.appendChild(copy);
403
+ if (regen) ui.acts.appendChild(iconBtn(ICON.regen, "Regenerate", regen));
404
+ ui.acts.classList.add("shown");
405
+ }
406
+ // follow-ups AUTHORED BY THE MODEL about the actual exchange (Grok's behavior, done locally):
407
+ // one bounded extra generation right after the answer; killed instantly if the user starts typing.
408
+ let sugCtl = null;
409
+ async function offerFollowups(lastQ, lastA, host) {
410
+ try { if (sugCtl) sugCtl.abort(); } catch {}
411
+ sugCtl = new AbortController();
412
+ const ask = `Here is a conversation:
413
+ Question: ${lastQ}
414
+ Answer: ${lastA.slice(0, 600)}
415
+
416
+ Write exactly two short, sharp follow-up questions a curious person would ask next. One per line. No numbering, no preamble.`;
417
+ try {
418
+ const ids = engine.tokenize(engine.frameTurn(ask, false));
419
+ const res = await engine.generate(ids, { maxNew: 180, signal: sugCtl.signal });
420
+ const seg = splitThink(res.outIds || []);
421
+ const text = seg.ans.length ? engine.detokenize(seg.ans) : (res.text || "");
422
+ const qs = text.split(/\n+/).map((l) => l.replace(/^[-*\d.\s]+/, "").trim()).filter((l) => l.length > 8 && l.length < 140).slice(0, 2);
423
+ if (!qs.length || busy) return;
424
+ const box = document.createElement("div"); box.className = "fu";
425
+ for (const label of qs) {
426
+ const b = document.createElement("button"); b.type = "button";
427
+ b.innerHTML = `<span class="arr">↳</span>${label.replace(/[<>&]/g, "")}`;
428
+ b.onclick = () => { box.remove(); $("inp").value = label; send(); };
429
+ box.appendChild(b);
430
+ }
431
+ host.appendChild(box);
432
+ log.scrollTop = log.scrollHeight;
433
+ } catch {} // aborted / out of room → no suggestions, no noise
434
+ }
435
+ function note(s) { const d = document.createElement("div"); d.className = "note"; d.textContent = s; log.appendChild(d); }
436
+
437
+ // split streamed outIds into thinking + answer segments by the <think> token ids (robust: no
438
+ // tags at position 0 → everything is answer; unclosed → everything so far is thinking).
439
+ function splitThink(outIds) {
440
+ if (thinkOpen < 0 || outIds[0] !== thinkOpen) return { think: [], ans: outIds };
441
+ const c = outIds.indexOf(thinkClose);
442
+ if (c < 0) return { think: outIds.slice(1), ans: [] };
443
+ return { think: outIds.slice(1, c), ans: outIds.slice(c + 1) };
444
+ }
445
+
446
+ let busy = false, ready = false;
447
+ async function send() {
448
+ const q = $("inp").value.trim();
449
+ if (!q || busy) return;
450
+ if (!ready || !engine) { // the mind is still arriving: hold ONE question, it sends itself
451
+ pendingQ = q; $("inp").value = "";
452
+ $("col").classList.add("started");
453
+ msg("You", "user").body.textContent = q;
454
+ note("your question will send itself the moment the mind arrives");
455
+ return;
456
+ }
457
+ busy = true; $("inp").value = ""; $("send").disabled = true;
458
+ $("col").classList.add("started"); // the greeting yields to the conversation (Claude-room transition)
459
+ msg("You", "user").body.textContent = q;
460
+ let turn = engine.tokenize(engine.frameTurn(q, mind.length > 0));
461
+ if (mind.length + turn.length + 384 > CTX) { // the window fills: the mind FOLDS its history, never drops it
462
+ $("metrics").innerHTML = spn() + "folding memory · nothing is forgotten";
463
+ try { memoryNote = await foldMemory(); persistStory(); } catch {}
464
+ mind = [];
465
+ }
466
+ let qEff = q;
467
+ if (!mind.length && memoryNote) qEff = `(What you remember of our conversation so far: ${memoryNote})
468
+
469
+ ${q}`;
470
+ if (!mind.length) turn = engine.tokenize(engine.frameTurn(qEff, false));
471
+ const ids = mind.concat(turn);
472
+ try { if (sugCtl) sugCtl.abort(); } catch {}
473
+ document.querySelectorAll(".fu").forEach((n) => n.remove());
474
+ const mindBefore = mind.slice();
475
+ const ui = msg(modelName, "bot"); ui.body.innerHTML = spn();
476
+ ui.think.querySelector("summary").innerHTML = spn() + `<span class="sum">thinking</span>`;
477
+ const tSend = performance.now(); let ttftSet = false, thoughtMs = 0;
478
+ lastTTFT = null; lastTokps = null;
479
+ $("metrics").innerHTML = spn() + `<b>${modelName}</b> is thinking`;
480
+ try {
481
+ const res = await engine.generate(ids, {
482
+ maxNew: CTX - ids.length - 8, // the whole remaining KV window (eos stops early)
483
+ onToken: (t) => {
484
+ if (!ttftSet) { ttftSet = true; lastTTFT = (performance.now() - tSend) / 1000; } // TTFT = send → first visible token
485
+ if (t.stats && t.stats.tokps) lastTokps = t.stats.tokps;
486
+ metrics();
487
+ const s = splitThink(t.outIds);
488
+ if (s.think.length) { ui.think.hidden = false; ui.t.textContent = engine.detokenize(s.think); }
489
+ if (s.ans.length && !thoughtMs) { thoughtMs = performance.now() - tSend; // answer flowing: freeze "Thought for Ns"
490
+ const secs = Math.max(1, Math.round(thoughtMs / 1000));
491
+ ui.think.querySelector("summary").innerHTML = `<span class="chev">▸</span><span class="sum">Thought for ${secs}s</span>`; }
492
+ ui.body.textContent = s.ans.length ? engine.detokenize(s.ans) : (s.think.length ? "" : t.text);
493
+ log.scrollTop = log.scrollHeight;
494
+ },
495
+ });
496
+ const s = splitThink(res.outIds || []);
497
+ const secs = Math.max(1, Math.round((thoughtMs || (performance.now() - tSend)) / 1000));
498
+ ui.think.querySelector("summary").innerHTML = `<span class="chev">▸</span><span class="sum">Thought for ${secs}s</span>`;
499
+ if (s.think.length) { ui.think.hidden = false; ui.t.textContent = engine.detokenize(s.think); }
500
+ if (s.ans.length) {
501
+ const answer = engine.detokenize(s.ans);
502
+ ui.body.textContent = answer;
503
+ mind = ids.concat(s.ans); // history carries the ANSWER only (Qwen3 convention: prior-turn thinking dropped)
504
+ story.push({ q, a: answer }); persistStory();
505
+ fitActions(ui, answer, () => { if (!busy) { mind = mindBefore; $("inp").value = q; send(); } }); // regenerate: rewind history, re-ask
506
+ offerFollowups(q, answer, ui.d); // the model writes its own follow-ups, in place
507
+ } else if (s.think.length) {
508
+ ui.body.textContent = "I ran out of room while thinking. Ask again, a bit shorter."; // unclosed <think> at the window edge; turn not kept
509
+ } else {
510
+ ui.body.textContent = res.text;
511
+ mind = ids.concat(res.outIds || []);
512
+ }
513
+ if (res.stats && res.stats.tokps) lastTokps = res.stats.tokps;
514
+ metrics();
515
+ } catch (e) { ui.body.textContent = "Something broke: " + (e && e.message || e); }
516
+ busy = false; $("send").disabled = false; $("inp").focus();
517
+ log.scrollTop = log.scrollHeight;
518
+ }
519
+
520
+ $("go").addEventListener("click", () => {
521
+ entered = true; show("chat"); $("inp").focus();
522
+ if (!streamStarted) { streamStarted = true; stream(); }
523
+ });
524
+ $("send").disabled = true; // until the mind is resident (early questions queue)
525
+ (async () => {
526
+ try {
527
+ if (navigator.connection && navigator.connection.saveData) return; // respect data saver
528
+ if (SRC) return; // dev override: no background pulls
529
+ const B27 = "https://huggingface.co/HOLOGRAMTECH/q-bonsai-27b/resolve/main";
530
+ const cache = await caches.open("holo-kappa-v1");
531
+ const man = await (await fetch(B27 + "/manifest.json")).json();
532
+ const urls = Object.values(man.tensors || {}).map((r) => B27 + "/b/" + String(r.kappa).replace(":", "_") + ".gz");
533
+ let i = 0;
534
+ const worker = async () => {
535
+ while (i < urls.length) {
536
+ const u = urls[i++];
537
+ if (await cache.match(u)) continue;
538
+ while (streamStarted && !ready) await new Promise((r) => setTimeout(r, 1500)); // the live stream owns the wire
539
+ try { const b = await (await fetch(u, { cache: "no-store" })).arrayBuffer(); await cache.put(u, new Response(b, { headers: { "Content-Type": "application/octet-stream" } })); } catch {}
540
+ }
541
+ };
542
+ Promise.all(Array.from({ length: 3 }, worker)).catch(() => {});
543
+ } catch {}
544
+ })();
545
+ (async () => { // returning visitor: the mind wakes BEHIND the welcome screen
546
+ try { const c = await caches.open("holo-kappa-v1"); if (await c.match(BASE + "/manifest.json")) { streamStarted = true; stream(); } } catch {}
547
+ })();
548
+ $("send").addEventListener("click", send);
549
+ $("inp").addEventListener("keydown", (e) => { if (e.key === "Enter") send(); });
550
+ if (!navigator.gpu) { $("go").disabled = true; $("fine").textContent = "This browser has no WebGPU. Chrome or Edge 113 or newer required."; }
551
+ </script>
552
+ </body>
sha256/6668e0b3a49e1e2d1a30ef1d3ac90169730fd291438c9180911d514720c2acec ADDED
@@ -0,0 +1 @@
 
 
1
+ {"@context":["https://www.w3.org/ns/did/v1","https://w3id.org/security/data-integrity/v2",{"dcterms":"http://purl.org/dc/terms/","links":{"@container":"@set","@id":"schema:hasPart"},"prov":"http://www.w3.org/ns/prov#","rel":"schema:additionalType","schema":"https://schema.org/"},{"holstr":"https://hologram.os/ns/strand#"}],"@type":["prov:Entity","holstr:Entry"],"holstr:kind":"release","holstr:op":"did:holo:sha256:87599792c7b13fad9d6c57d3b89d2cef35e4715869f5cde597ab60ca92699f0b","holstr:payload":{"apps":{"bonsai":"2a18cc07373595a4c89911410c2419e8519bc40f2d76670d43db286cdf166802","carry":"9f44164b17e6b7e37f39623bb445d49b6608da5f2b04cef8b1a8b183362a6b9a","hello":"66c1ada5ac08a2d4f73851bbe7458ad5fb6e2226c5a131c3829abfe715900fed","holo-messenger":"01e2db1e847e73881b7ce6f251677a4c0f9629203d0bc913053ffb4047b1df2d","jellyfin":"3fd2a00105ad0e8f01109dce52ff4c7a0cc6c9444532b0453ed9d770cce2d3a4","resolve":"23aec66382775f5773693615338f37c37a5f58257ec95aece33a664baa6fe0db","yourspace":"9ffc94e11c78fbe6b940bc04ac92f0f12238cf7ce82b5092c53d5761146a50df"},"boot":{"entry":"holo-portal.mjs","sha256":"caeb3e57b6eeab09bee6d67c022145a8e2dae610c929a7f51bc169898625e7e8"},"closure":"c844024f03d331785262bcb44d7e13b813184fcb4b618d5be763dd3ef58912ba","manifest":"792736ddc9a6fa4d6ad612ac0bf851834e7acc46ba3ea335c6f0e32fdf24bda6","runtime":{"apps/q/pkg/holospaces_web.js":"b9f8a887de588c5193dc65ca9ce206a70c6df53595b848e0ce0299c2d88a5753","apps/q/pkg/holospaces_web_bg.wasm":"9d90b4ea8bccee8c239073c7ec7dd5158c6d11f1f668487570d17475d79e661e","apps/workspace/pkg/holospaces_web.js":"8c30aa5582dffe4548d27fa7863163eba689ed65126be472c003f5884fc8e534","usr/lib/holo/holowhat/holospaces_web.js":"a5b5d9c559a1d2812c33e9d7a4b1c24bb03059482503a23356e4c9c32d4d8b88","usr/lib/holo/holowhat/holospaces_web_bg.wasm":"00cfa4960b319ba1ba7291cddb20dea130a407ce8b42426218854f4f68f4dcd7","usr/lib/pkg/holospaces_web.js":"8c30aa5582dffe4548d27fa7863163eba689ed65126be472c003f5884fc8e534","usr/lib/pkg/holospaces_web_bg.wasm":"3370b22070b56218a57df6406e2e4ba7cc171e942d4d1f2ae4297ea2c4c08d9c"},"shell":"0e8ac9d7dd55694dcc30ce1cdcb688a2b624ba54eb90619bdf7251d123ba17b5","world":"9540f2903ce9ebab249e0ddc39cff472dc4c6caf1eb0d0fc1b497fb2a3436d05"},"holstr:prev":"did:holo:sha256:391a3659d176f796ebc7956c10f937923ff18e87d8971f52990293895d81a636","holstr:seq":399,"prov:generatedAtTime":"2026-07-15T22:43:55.332Z"}
sha256/75000614d279104e10936e4ccba11e3918ac045c5db9386bb9b319ffc177a1b3 ADDED
@@ -0,0 +1 @@
 
 
1
+ {"@type":"holo:world","apps":{"catalog":{"@context":{"dcat":"http://www.w3.org/ns/dcat#","dcterms":"http://purl.org/dc/terms/","holo":"https://hologram.os/ns#","schema":"https://schema.org/"},"@id":"https://hologram.os/apps","@type":["dcat:Catalog","schema:DataCatalog"],"dcterms:description":"Each app is a self-contained holospace addressed by the did:holo of its content (Law L1); the OS indexes addresses, not locations; any byte re-derives (Law L5). Pin an app anywhere and it boots in the Hologram OS holospace frame from a single κ.","dcterms:title":"Hologram Apps — the content-addressed app catalog"},"compositionsKappa":"d62b76681eb5137c4e55f71d19a93b6fe031e2d411ee75dfc63678bec70b14f9","entriesKappa":"0e377fb43a5217d988b1ad397124cc5ff94b86751628af109909200d6650b677"},"arrival":{"pack":{"bytes":2838415,"files":208,"kappa":"1c130330bafe9e5994c6bd499bea497755b18797c7a587d6ab09b5f6313efa5b","v":1}},"axis":{"identity":"sha256","name":"blake3"},"floor":[{"path":"index.html","reason":"seed"},{"path":"release.json","reason":"pin"},{"path":"root-sw.js","reason":"sw"},{"path":"root-sw-classic.js","reason":"sw"},{"path":"apps/holo-messenger/holo-sw.js","reason":"sw"},{"path":"apps/jellyfin/holo-jellyfin-sw.js","reason":"sw"},{"path":"apps/q/q-chat.html","reason":"boot"},{"path":"apps/q/core/voice-out.js","reason":"boot"},{"path":"apps/q/core/loader.js","reason":"boot"},{"path":"apps/q/core/engine.js","reason":"boot"},{"path":"apps/q/core/q-self.mjs","reason":"boot"},{"path":"apps/q/core/holo-q-guards.mjs","reason":"boot"},{"path":"apps/q/core/holo-orb.js","reason":"boot"},{"path":"apps/q/core/semantic.js","reason":"boot"},{"path":"apps/q/core/kappa.js","reason":"boot"},{"path":"apps/q/qvac-gpu.js","reason":"boot"},{"path":"apps/q/qvac-2bit.mjs","reason":"boot"},{"path":"apps/q/pkg/holospaces_web.js","reason":"boot"},{"path":"apps/jellyfin/index.html","reason":"boot"},{"path":"apps/jellyfin/holo-jellyfin-sw.js","reason":"boot"},{"path":"apps/jellyfin/icon.svg","reason":"boot"},{"path":"apps/jellyfin/LICENSE-NOTE.md","reason":"boot"},{"path":"apps/yourspace/elon.html","reason":"boot"},{"path":"apps/yourspace/holo-blake3.mjs","reason":"boot"},{"path":"apps/yourspace/holo-yourspace.mjs","reason":"boot"},{"path":"apps/yourspace/index.html","reason":"boot"},{"path":"apps/yourspace/jensen.html","reason":"boot"},{"path":"apps/yourspace/og-elon.jpg","reason":"boot"},{"path":"apps/yourspace/og-jensen.jpg","reason":"boot"},{"path":"apps/yourspace/og-sam.jpg","reason":"boot"},{"path":"apps/yourspace/sam.html","reason":"boot"},{"path":"apps/spaces/holo-spaces.mjs","reason":"boot"}],"manifests":{"4c31735a5d69d3796f7a8b8b75c1e53fc3f0214df2ae8f12dc8319b7e28e88d7":"f4199d67f0b5b37740df882b97a41f6a1628f0a7e4de18af0ff54b3d79ab9a95","4faa4eed56ecb1fb7ad22e1a35bc55fff12569124e59631dc0edb445c17ac72a":"0b71c2933d8826565b2d48f097215f76a8e5ed33bd3719302d564713931707b9","ffa452756fd9a7cf0331a4862d122ebbe374b04d3a8fdd744ded40d32a4bf780":"1df63382484b1c660596eafd3c07aa59f6b239b4ac081e3297f64bcb72aed896"},"names":{"bytes":1157073,"files":6080,"kappa":"e9ae0098c5ca92a0e6bedf15a794487ed36f54cd33f914d2eee8a0e97ad4c30c","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/"},"rescue":{"appIndex":{"axis":"blake3","extra":{"resolve":"bac4e2d430baa0480137d3b5d8ffc383fa61077c9487c5f4e19f0dcdccfb68a8"},"note":"blake3(entry-document) per app — derived from the SIGNED sha256 apps table; each re-derives from b/<blake3hex>. Transitional index until the strand re-seals under blake3."},"appMaps":{"animate":{"axis":"blake3","filesKappa":"142c767adf61c1ba2611cc8b3c10b79bd1887feb29f0b51ab4d270ef0ae8b956","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/animate/holo-evicted.json"},"arcade":{"axis":"blake3","filesKappa":"d021a48a576bf8f8cd4aa75fc4e295c9c346ae42eba58e9e63cc714fa8bb0a92","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/arcade/holo-evicted.json"},"browser":{"axis":"blake3","filesKappa":"a409143f20d94142409c8d962258f8e593241f994b9e3daced07347e234ffcb8","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/browser/holo-evicted.json"},"files":{"axis":"blake3","filesKappa":"27fbfc761e0f0c9af009fee6c2e0d59f3e1c78934843eed6ea7b020382ad9c54","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/files/holo-evicted.json"},"games":{"axis":"blake3","filesKappa":"45c5261dddb6e8e67c94b888b84a7b3f88b7eb8e6eb2fe5beee2e189a7cd5118","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/games/holo-evicted.json"},"holo-games":{"axis":"blake3","filesKappa":"70411e77ce1e0bb079f52f3eefe500d89018de37bb7f69099ff48bd4fb653d71","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/holo-games/holo-evicted.json"},"holo-linux":{"axis":"blake3","filesKappa":"c50fbd6c62bbf0c8a1497bf147711b426fcbdc6a46ab20d141599b9b1c2330dd","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/holo-linux/holo-evicted.json"},"holo-money":{"axis":"blake3","filesKappa":"f50887e7ea6e8a6cba41114908aedfd5b5703c435e583d1daed8c0124a7891c9","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/holo-money/holo-evicted.json"},"hub":{"axis":"blake3","filesKappa":"7d878d6594257a3ac9785e85e2460501b74bca6723f1015ac69379f694d0219e","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/hub/holo-evicted.json"},"jellyfin":{"axis":"blake3","bootFloor":["index.html","holo-jellyfin-sw.js","icon.svg","LICENSE-NOTE.md"],"filesKappa":"68dff18c7bd3d096a50f1c230edc66a3edb6cc9975727e54ca786c1ec2a480c6","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/jellyfin/holo-evicted.json"},"music":{"axis":"blake3","filesKappa":"68765b1b0e0fdf7dd49203d1b82469c6fe6db1ff5ab4e1a711696f019ee164bf","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/music/holo-evicted.json"},"player":{"axis":"blake3","filesKappa":"15fcce11b0e5b9d6835a0882b68a34734892eaa53e2a6b90f4b8adc77af99dd6","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/player/holo-evicted.json"},"q":{"axis":"blake3","bootFloor":["q-chat.html","core/voice-out.js","core/loader.js","core/engine.js","core/q-self.mjs","core/holo-q-guards.mjs","core/holo-orb.js","core/semantic.js","core/kappa.js","qvac-gpu.js","qvac-2bit.mjs","pkg/holospaces_web.js"],"filesKappa":"1a02ff94a3988b4af70353bef0c4d2e04aefaa741398b148edd5076ec5d0ae8e","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/q/holo-evicted.json"},"self":{"axis":"blake3","filesKappa":"d219c327ec83f3c5adfd72dff2855d32805d9dcbe436a7430133e27f5a2ef683","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/self/holo-evicted.json"},"spaces":{"axis":"blake3","bootFloor":["holo-spaces.mjs"],"filesKappa":"9e48ef9c204ab7cdb7a17ca5b7bac439bfb9afc720a05b682a406b77a5566a87","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/spaces/holo-evicted.json"},"ui":{"axis":"blake3","filesKappa":"65d603d1f0876ad6c0e402f2ec6e4a5d4d1d27436df7178988197df15f3ecb77","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/ui/holo-evicted.json"},"video":{"axis":"blake3","filesKappa":"b4e4470073a826c0307aff5e6fbb60db2234654e98b1c8b0338d96f33ac586b5","mirror":"https://hologram-technologies.github.io/hologram-apps/b/","path":"apps/video/holo-evicted.json"},"yourspace":{"axis":"blake3","bootFloor":["elon.html","holo-blake3.mjs","holo-yourspace.mjs","index.html","jensen.html","og-elon.jpg","og-jensen.jpg","og-sam.jpg","sam.html"],"filesKappa":"6247cb9f207bdf574b85eafe0befce91a81f09ee33fb9d78e3cbaae822b1ff91","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/yourspace/holo-evicted.json"}},"apps":["video","animate","holo-linux","player","music","browser","holo-games","hub","ui","q","games","holo-money","files","arcade","jellyfin","yourspace","spaces","self"],"trees":[{"axis":"blake3","filesKappa":"c563709701b6f890f3fdc5e75d73fa45bf6a5ae017955bf0fc207ff9baa738a8","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"_shared/voice/vendor/holo-evicted.json","prefix":"_shared/voice/vendor/"},{"axis":"blake3","filesKappa":"121de52fa8605a472a978385a1b00c05d1bd164eb3b2a610c43c19ccedfe677c","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"usr/share/wallpapers/holo-evicted.json","prefix":"usr/share/wallpapers/"},{"axis":"blake3","filesKappa":"3f0cf28ccaf5c279f736a36bed4739b4bc8375d732764df77c7a3a781f5681ab","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/holo-messenger/_vendor/native-net/holo-evicted.json","prefix":"apps/holo-messenger/_vendor/native-net/"},{"axis":"blake3","filesKappa":"f4b87d17ddd84d7ec758c3c18bdb6265466995dd34a44d36acd56d240d3c93a3","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/holo-messenger/_vendor/vodozemac/holo-evicted.json","prefix":"apps/holo-messenger/_vendor/vodozemac/"},{"axis":"blake3","filesKappa":"a48f7d3e44ecf5c27c832ccc400dd4049a61b3bd91cfb554942824dcf990f4e2","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/holo-messenger/_vendor/discord/holo-evicted.json","prefix":"apps/holo-messenger/_vendor/discord/"},{"axis":"blake3","filesKappa":"697201a6416c6a93b6a8f8bed5b742d9c341148148c425cf8ff37249ad54a64c","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"usr/lib/holo/holowhat/holo-evicted.json","prefix":"usr/lib/holo/holowhat/"},{"axis":"blake3","filesKappa":"4a3417dd94d070831c9c4daa42ef54b32368d3a3a82e9e5118098d70ab659b10","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"_shared/holo-evicted.json","prefix":"_shared/"},{"axis":"blake3","filesKappa":"d48836c3584b723d4ff85c1c4ee01516a1a8718acb305ba1ce41a6eee83d9543","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"apps/holo-messenger/holo-evicted.json","prefix":"apps/holo-messenger/"},{"axis":"blake3","filesKappa":"4bd4f700a9b2bb3804d7c2b6757875acc881f2204af38f235961538107031b59","mirror":"https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","path":"vendor/onnxruntime-web/holo-evicted.json","prefix":"vendor/onnxruntime-web/"}]},"rungs":{"blake3":["https://cdn.jsdelivr.net/gh/Hologram-Technologies/hologram-apps@main/b/","https://raw.githubusercontent.com/Hologram-Technologies/hologram-apps/main/b/","https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/b/","https://hologram-technologies.github.io/hologram-apps/b/"],"sha256":["https://huggingface.co/HOLOGRAMTECH/holo-messenger-shell/resolve/main/sha256/"]},"runtime":{"alg":"Ed25519","payload":{"assets":{"glue":{"blake3":"8993d93001da373dd4acd2d75b93e4ecf80000cbac4a78d492db440e4c7f883f","bytes":118072,"hint":"usr/lib/holo/holowhat/holospaces_web.js","sha256":"a5b5d9c559a1d2812c33e9d7a4b1c24bb03059482503a23356e4c9c32d4d8b88"},"wasm":{"blake3":"4faa4eed56ecb1fb7ad22e1a35bc55fff12569124e59631dc0edb445c17ac72a","bytes":2926068,"hint":"usr/lib/holo/holowhat/holospaces_web_bg.wasm","sha256":"00cfa4960b319ba1ba7291cddb20dea130a407ce8b42426218854f4f68f4dcd7"}},"at":"2026-07-09T16:43:20.387Z","channel":"resolver","name":"holospaces-web","seq":2,"v":1},"pub":"snYY6y35gdZ1ngOE5E+G1BGFjlTo2MfpfP8h6yc7r+M=","sig":"o/IRuCep+lmC4lrqj36SnwTH7u2v3dHKZFWjSxOc8/51Sh94pY/fQdKlBqZ3aEBpgv2wRIJdb+os456N4XegDw=="},"sharded":true,"shell":{"aggregate":"0e8ac9d7dd55694dcc30ce1cdcb688a2b624ba54eb90619bdf7251d123ba17b5","assets":[{"bytes":71122,"kappa":"01e2db1e847e73881b7ce6f251677a4c0f9629203d0bc913053ffb4047b1df2d","path":"/apps/holo-messenger/app.html"},{"bytes":429353,"kappa":"41747f7be9e910e49eb7d040828e32068e42f783b90c8b8b08f30d0019fc4bab","path":"/apps/holo-messenger/_vendor/ui/chat-ui.bundle.js"},{"bytes":251109,"kappa":"e7dc8651380430ab7253e9c5f820f8a4a9263b70abf03e267a9b80668614d8bc","path":"/apps/holo-messenger/_vendor/ui/chat-ui.bundle.css"},{"bytes":1303,"kappa":"91c3c9c82d97746bb274d9131bc54992343f411f17e1c698d65db5981d41d1ad","path":"/apps/holo-messenger/holo-messenger-login.mjs"},{"bytes":354727,"kappa":"1a25fd1826968339089f25813df3c9e5fd61aad6e365a7db9d2f58578ff7abc3","path":"/apps/holo-messenger/holo-messenger-app.mjs"},{"bytes":35148,"kappa":"bf790f49c2c3366fae494488b1832dac05908e18a37f5b5dd4292c76a6d130f7","path":"/apps/holo-messenger/messenger-shadcn-ui.mjs"},{"bytes":8723,"kappa":"232d735a20f3a27c22126ea42cbfc7768b9c2db16c52b110980e82d37e710c0b","path":"/apps/holo-messenger/holo-messenger-weave.mjs"},{"bytes":6314,"kappa":"026c320b1e9de27af7ac42d21d1544035c409fb4c1912507bac0eb28811ca34e","path":"/apps/holo-messenger/messenger-skin.mjs"},{"bytes":54072,"kappa":"d76d596376d1203a8c170ddbe9dab02442158671646c630ee1902d5953e63fc5","path":"/apps/holo-messenger/messenger-skins.css"},{"bytes":3136,"kappa":"8bf24cf064277be17b4b4d2461bdc5f20184aac2887fe428e210d1dcc3c84a25","path":"/apps/holo-messenger/messenger-sw-register.mjs"},{"bytes":8262,"kappa":"331a35dfd2b4774673ed92da26b0c78fecd336a70ecc8ff890256e835f7ccfd9","path":"/apps/holo-messenger/holo-m1-boot.mjs"},{"bytes":5138,"kappa":"86a3f68c5070d7a543e52768811268d22f2051a5033c11d5281ecd2a36c2dd44","path":"/apps/holo-messenger/holo-release-boot.mjs"},{"bytes":2875,"kappa":"15c5bccd5549900f8bb67bbeee9f2a8e0020849a489abb3d167922c673f31df1","path":"/apps/holo-messenger/holo-release-verify.mjs"},{"bytes":11446,"kappa":"ab9519718341527bc28daba9fd6a0c372017b1d3f2bcdfc5488f435063192703","path":"/apps/holo-messenger/mail/holo-mail-attach.mjs"},{"bytes":546613,"kappa":"f6caa9eeead2c99deeb2cdb70b7e25bbaa2cf5c60555f5b4030ecf6b6d9efa51","path":"/apps/holo-messenger/_vendor/wallpaper-default.jpg"},{"bytes":2990,"kappa":"70bf5bace3fe694e3140893ee8fc3f9a6f28f4645f52bc517ec7299c7a8d3fe3","path":"/apps/holo-messenger/_vendor/ui/chunk-2EJSL5UF.js"},{"bytes":2228,"kappa":"a2ac22c3a8b541f08787faafe9aa19bd14a315d1af8516fe7d1f31dba998ef28","path":"/apps/holo-messenger/_vendor/ui/chunk-4MZXOCV2.js"},{"bytes":434064,"kappa":"d090908e06e8d0a2d3fcc01ce1f608eef8ef2e8ec2038c732a84cbe239d32ab1","path":"/apps/holo-messenger/_vendor/ui/chunk-BNASBBAK.js"},{"bytes":6357,"kappa":"dcefbefa520b792be78fd6c5553fae4cfa3db0a3749802005119d02ca1867537","path":"/apps/holo-messenger/_vendor/ui/chunk-DKCO25ZZ.js"},{"bytes":6541,"kappa":"42ac444800c708852b2004131d274632edaf9a45c578309451e04fd27d67cbc3","path":"/apps/holo-messenger/_vendor/ui/chunk-EJ2FITLI.js"},{"bytes":4818,"kappa":"007141010ac01ca81bb4bf74ad758709586b2899c25d7b8f8cf412abf1998c62","path":"/apps/holo-messenger/_vendor/ui/chunk-I6KLUZO2.js"},{"bytes":77281,"kappa":"fbc584dcd47de30a73780e59c463dc05a822590b8e0dd367311149edd46673a8","path":"/apps/holo-messenger/_vendor/ui/chunk-JUKDKHPD.js"},{"bytes":442967,"kappa":"56958e3b499497fa8a7281c8c1893637c89cbe3b7867aea276b07b34fca109ef","path":"/apps/holo-messenger/_vendor/ui/chunk-R7HPIGBM.js"},{"bytes":577,"kappa":"11247d28c5c2fb3d976002c2b55fecb6ba19fd88153e11d2c7af5832fd6ff331","path":"/apps/holo-messenger/_vendor/ui/chunk-SQE76S5B.js"},{"bytes":42059,"kappa":"601e33fbd2611b55a3bc492b26ee19608103750f3ecdccd6762f51d7aa5895b9","path":"/apps/holo-messenger/_vendor/ui/chunk-TYKGDUAW.js"},{"bytes":31691,"kappa":"ba0a74a49b10960552dd4778d210a152990ee94b69a2847699c630f94f87182d","path":"/apps/holo-messenger/_vendor/ui/chunk-E6U7U64M.js"},{"bytes":6505,"kappa":"28186f18edebe4a990c721dc98594d94f74ab02b8eea40d67b04a4b7b777be7f","path":"/apps/holo-messenger/_vendor/ui/chunk-LNIQGHQD.js"},{"bytes":11786,"kappa":"929cb2072b4084ca0195c2c0cb65190340c29e62c6b5c50dc1cebf8b788f6eca","path":"/apps/holo-messenger/_vendor/ui/chunk-OVQZEDS3.js"},{"bytes":3815,"kappa":"eb343aaebd5beec6186750769cdd48ddde4440b78f92d46c2cb851e893237944","path":"/apps/holo-messenger/_vendor/ui/chunk-RVGZ2KTZ.js"},{"bytes":133918,"kappa":"946dd4ca8e36408f3e5da27813cdafad3908e2a3466dc86e82eff442de4b813f","path":"/apps/holo-messenger/_vendor/ui/chunk-SXSU3V5W.js"},{"bytes":2440,"kappa":"304e4bf228c2aeade13b288617aab175a53d04f8ea3d305dc65a92c8973cc3df","path":"/apps/holo-messenger/_vendor/ui/chunk-VVOC7KGI.js"},{"bytes":3624,"kappa":"2a19268225fab8e102982de6e490c3e3468bedcfe368407aaa3525b78eb7cf34","path":"/apps/holo-messenger/_vendor/ui/chunk-AUML7DVR.js"},{"bytes":64039,"kappa":"65a4954f079070d79a8687acb55ef9927de74599bbdc0afbc8400cb4b0d75fac","path":"/apps/holo-messenger/_vendor/ui/chunk-GFDBGIBL.js"}],"created":1783953980938,"runtime":[{"bytes":127867,"kappa":"b9f8a887de588c5193dc65ca9ce206a70c6df53595b848e0ce0299c2d88a5753","path":"/apps/q/pkg/holospaces_web.js"},{"bytes":6469596,"kappa":"9d90b4ea8bccee8c239073c7ec7dd5158c6d11f1f668487570d17475d79e661e","path":"/apps/q/pkg/holospaces_web_bg.wasm"},{"bytes":76829,"kappa":"8c30aa5582dffe4548d27fa7863163eba689ed65126be472c003f5884fc8e534","path":"/apps/workspace/pkg/holospaces_web.js"},{"bytes":118072,"kappa":"a5b5d9c559a1d2812c33e9d7a4b1c24bb03059482503a23356e4c9c32d4d8b88","path":"/usr/lib/holo/holowhat/holospaces_web.js"},{"bytes":2926068,"kappa":"00cfa4960b319ba1ba7291cddb20dea130a407ce8b42426218854f4f68f4dcd7","path":"/usr/lib/holo/holowhat/holospaces_web_bg.wasm"},{"bytes":76829,"kappa":"8c30aa5582dffe4548d27fa7863163eba689ed65126be472c003f5884fc8e534","path":"/usr/lib/pkg/holospaces_web.js"},{"bytes":2999771,"kappa":"3370b22070b56218a57df6406e2e4ba7cc171e942d4d1f2ae4297ea2c4c08d9c","path":"/usr/lib/pkg/holospaces_web_bg.wasm"}],"v":1},"version":1}
sha256/7aeadc80050e3d81ba684a7406de33448ee015493a22406db9ded49135428ad0 ADDED
@@ -0,0 +1 @@
 
 
1
+ [{"blake3Entry":"11ac8b747c90075b1c205bfd5551583dd01ecbb81b3f0db47b832fc69acbf246","dir":"browser","entry":{"@id":"did:holo:sha256:95a050d224058f6e9cba6463c002a9eae2e6a007bb1e5bdcfa89ce8d2c978d01","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/browser/index.html","holo:categories":["Network","WebBrowser"],"holo:entry":"sha256:e181aa25b70fdd99a76ed1155dec98bf0d4ff8833df782583990b64f76a011fa","holo:root":"did:holo:sha256:95a050d224058f6e9cba6463c002a9eae2e6a007bb1e5bdcfa89ce8d2c978d01","holo:words":"duty.drive.south","schema:alternateName":"duty.drive.south","schema:applicationCategory":"CommunicationApplication","schema:description":"A web browser that treats every page — web, local or holo:// — as verifiable content.","schema:identifier":"org.hologram.HoloBrowser","schema:image":"apps/browser/icon.svg","schema:keywords":["browser","hologram","web","holo","ipfs","ens","content-addressing","uor","dweb","agent","law-l5"],"schema:name":"Holo Browser","schema:softwareRequirements":["holo-dock-config.json","holo-dock.css","holo-dock.js","holo-manage.js","holo-mobile.css","holo-phi.css","holo-theme.js","holo-ux.js","teleport.js"]}},{"blake3Entry":"adb4ee61b7d0af6da0185929cd2e0ce0941c196d82e5d402ead3fb322fea10e4","dir":"holo-linux","entry":{"@id":"did:holo:sha256:e6963eac1912fe72dc5ae876038f38d86d6c1b6f2802211393a1a083e1a6109f","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/holo-linux/index.html","holo:categories":["System","Education","TerminalEmulator"],"holo:root":"did:holo:sha256:e6963eac1912fe72dc5ae876038f38d86d6c1b6f2802211393a1a083e1a6109f","holo:words":"lobster.wide.enrich","schema:alternateName":"lobster.wide.enrich","schema:applicationCategory":"UtilitiesApplication","schema:description":"A real riscv64 Linux, verified and booted in a browser tab.","schema:identifier":"org.hologram.HoloLinux","schema:image":"apps/holo-linux/icon.svg","schema:keywords":["linux","debian","riscv64","terminal","shell","bash","kappa","content-addressed"],"schema:name":"Holo Linux"}},{"blake3Entry":"8c12dc815f678081405826506c91ce41f349993b816b07ac723a0c8fa97e4730","dir":"holo-messenger","entry":{"@id":"did:holo:sha256:88494133a437bd46bfa0d591e46f6fb64c3fda35a897d7b86d2a915dcfedc3a2","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/holo-messenger/app.html","holo:categories":["Social","Communication"],"holo:entry":"sha256:e601c1ec39200c507cacb3ee6e2126c330383afcc7e0a66e85873f93c7011e47","holo:root":"did:holo:sha256:88494133a437bd46bfa0d591e46f6fb64c3fda35a897d7b86d2a915dcfedc3a2","holo:words":"innocent.age.caution","schema:alternateName":"innocent.age.caution","schema:applicationCategory":"SocialNetworkingApplication","schema:description":"Every messenger in one inbox. WhatsApp, Telegram, Discord, Slack and more stream into one familiar chat surface. Every message is verified and stays private on your device.","schema:identifier":"org.hologram.HoloMessenger","schema:image":"apps/holo-messenger/icon.svg","schema:keywords":["messenger","chat","unified inbox","whatsapp","telegram","discord","slack","beeper","content-addressed","holospace","uor"],"schema:name":"Holo Messenger"}},{"blake3Entry":"8c10406aed6dc2c5971bc5a95093ec8a91acb48a6dabbea1c07f1ab47a3d88ef","dir":"holo-money","entry":{"@id":"did:holo:sha256:9dfcc20bb7076c07ca21bc88c1e307ef07aafc9c8762f19d95eae72f05039cdf","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/holo-money/index.html","holo:entry":"sha256:f00cac91e066181842873164c824f90e3c61b8160051c2012414eb7f44d36394","holo:root":"did:holo:sha256:9dfcc20bb7076c07ca21bc88c1e307ef07aafc9c8762f19d95eae72f05039cdf","holo:words":"ivory.amused.wrist","schema:alternateName":"ivory.amused.wrist","schema:applicationCategory":"FinanceApplication","schema:description":"The neobank surface of Hologram — real balances over your sovereign wallet, money as κ-links, virtual cards as κ-objects with generative faces. One column: phone and the desktop right carriage are the same app. The wallet stays the vault; Holo Money is the bank UX over it.","schema:identifier":"org.hologram.HoloMoney","schema:image":"apps/holo-money/icon.svg","schema:keywords":["money","neobank","bank","balance","cards","payments","holo pay","wallet"],"schema:name":"Holo Money","schema:softwareRequirements":["holo-theme.js","holo-theme.css","holo-mobile.css","holo-wallet-bridge.js"]}},{"blake3Entry":"7537334be5a0fd1d6056e5052b145fba8d17b040a828591d65b6f4359acbf636","dir":"music","entry":{"@id":"did:holo:sha256:3fc79c195002faa226b2a66154a1528e7a873499f3cec3d4ac03c5d17d352544","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/music/index.html","holo:categories":["AudioVideo","Audio","Music","Player"],"holo:entry":"sha256:42a2436a5457992c0388af4c5ee062e9d5340ab0b15f12b2c78e8c93a4818ac7","holo:root":"did:holo:sha256:3fc79c195002faa226b2a66154a1528e7a873499f3cec3d4ac03c5d17d352544","holo:words":"claw.idea.toilet","schema:alternateName":"claw.idea.toilet","schema:applicationCategory":"MultimediaApplication","schema:description":"A verified music library and the whole internet as one.","schema:identifier":"org.hologram.HoloMusic","schema:image":"apps/music/icon.svg","schema:keywords":["music","library","subsonic","navidrome","radio","podcasts"],"schema:name":"Holo Music","schema:softwareRequirements":["favicon.png","holo-audio.js","holo-manage.js","holo-mobile.css","holo-object.js","holo-stations.js","holo-theme.js","teleport.js"]}},{"blake3Entry":"8883084a9a180a0c02e53f045e0faf11d264c083d0da21be945398216e4fd7a6","dir":"player","entry":{"@id":"did:holo:sha256:7d953e7dd69946145fa724cae5f37c72f3ed0cf554b50effe7dfc67a833a3016","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/player/index.html","holo:categories":["AudioVideo","Video","Player"],"holo:entry":"sha256:04e981669febda526ac70e0e6a68dfa782b5af1508b477b1067425c4e725c84b","holo:root":"did:holo:sha256:7d953e7dd69946145fa724cae5f37c72f3ed0cf554b50effe7dfc67a833a3016","holo:words":"river.wheat.skin","schema:alternateName":"river.wheat.skin","schema:applicationCategory":"MultimediaApplication","schema:description":"A verified media library for your movies and shows, with no server.","schema:identifier":"org.hologram.HoloPlayer","schema:image":"apps/player/icon.svg","schema:keywords":["media","library","jellyfin","movies","shows","player"],"schema:name":"Holo Player","schema:softwareRequirements":["holo-jellyfin.js","holo-manage.js","holo-mobile.css","holo-theme.js","teleport.js"]}},{"blake3Entry":"e43a32325775da882d3e187088da4cea4fac3b503adbe3d3b5bdbe3a9e13e998","dir":"q","entry":{"@id":"did:holo:sha256:c614f527b4b21e000ff2e1cde6d3d1324381881437e3ae4b4c80ee9a34ceca69","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/q/index.html","holo:categories":["AI","Productivity","Developer"],"holo:entry":"sha256:bb01430040bb991fb00979ddf88e90bb0e15b114a4c31f1ef6f215d4de17813d","holo:root":"did:holo:sha256:c614f527b4b21e000ff2e1cde6d3d1324381881437e3ae4b4c80ee9a34ceca69","holo:words":"walk.stand.apology","schema:alternateName":"walk.stand.apology","schema:applicationCategory":"AIApplication","schema:description":"A real AI that thinks entirely in your browser no server, no cloud, no API key.","schema:identifier":"org.hologram.HoloQ","schema:image":"apps/q/icon.svg","schema:keywords":["ai","llm","inference","verifiable inference","webgpu","browser-native","serverless","sovereign ai","qvac","kappa-disk","content-addressing","uor","did:holo","prov-o","law-l5","constitution","private ai","on-device"],"schema:name":"Holo Q","schema:softwareRequirements":["holo-theme.js","holo-mobile.css","holo-conscience.js","holo-store.js"]}},{"blake3Entry":"427325fe59f74d3838133641808b10ada7e05990d42a95977109aac6fa4bc476","dir":"self","entry":{"@id":"did:holo:sha256:963c75803506398b51d58e6e7ea8851c75cb72ebb6b72ae55978503a6639f368","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/self/index.html","holo:categories":["Security","Identity"],"holo:entry":"sha256:0511772584510f0888d97dd5a72bf986ad6791bd8e305063ddd8a82c39888a70","holo:root":"did:holo:sha256:963c75803506398b51d58e6e7ea8851c75cb72ebb6b72ae55978503a6639f368","holo:words":"allow.stock.bullet","schema:alternateName":"allow.stock.bullet","schema:applicationCategory":"SecurityApplication","schema:description":"A self-sovereign identity wallet: hold your credentials, prove only what's needed — like being over 18 — without revealing anything else, and sign in with no passwords. No accounts, no servers. Every proof is checked genuine on your own device and keeps working offline.","schema:identifier":"org.hologram.HoloSelf","schema:image":"apps/self/icon.svg","schema:keywords":["identity","self-sovereign","verifiable-credentials","did","selective-disclosure","passwordless","wallet","kyc","age-verification","agent-identity","content-addressed","uor"],"schema:name":"SELF"}},{"blake3Entry":"32850dd2b412bb5302fe7ce344011f63d16b0516c4d55c6b8dea797e407e8721","dir":"spaces","entry":{"@id":"did:holo:sha256:10e335d22cdf44081e7f974d29bac06be207b859f7d583b70e756927ccefe0e2","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/spaces/index.html","holo:categories":["Creativity","Social"],"holo:entry":"sha256:d8aebefb67e7fc7802e757b9a7d95bb881e6d75b4a9bc4bd4227634541757e51","holo:root":"did:holo:sha256:10e335d22cdf44081e7f974d29bac06be207b859f7d583b70e756927ccefe0e2","holo:words":"easily.struggle.immense","schema:alternateName":"easily.struggle.immense","schema:applicationCategory":"EntertainmentApplication","schema:description":"Walk into living, shareable, infinitely nestable rooms of holo apps — each rendered from its κ address. A Space is itself one content κ: compose by dragging things in, fork with a gesture, share by the κ alone. The OS is already a sandbox; this reveals it.","schema:identifier":"org.hologram.HoloSpaces","schema:image":"apps/spaces/icon.svg","schema:keywords":["spaces","rooms","compose","remix","nesting","content-addressed","holospace","uor"],"schema:name":"Holo Spaces","schema:softwareRequirements":["holo-theme.css","holo-mobile.css","holo-phi.css","holo-play-gpu.js"]}},{"blake3Entry":"629fdd5d4938b10a3002ef94264ce89c4312c32fdc2409c656a11bc6897362ab","dir":"ui","entry":{"@id":"did:holo:sha256:5f85dcea4d071f266c03781390cdc4bdecc02a0cb4616ba3bf534cba72176b2f","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/ui/index.html","holo:categories":["Developer","Design","System"],"holo:entry":"sha256:f2af676d9804685f773120551021b72848b06c9c510ee0238b95b8f0fac66925","holo:root":"did:holo:sha256:5f85dcea4d071f266c03781390cdc4bdecc02a0cb4616ba3bf534cba72176b2f","holo:words":"endless.inhale.seed","schema:alternateName":"endless.inhale.seed","schema:applicationCategory":"DeveloperApplication","schema:description":"Hologram OS's design control panel: an Appearance studio to theme the whole OS live (verified themes · accent · typography · accessibility) and a Components catalog of every shadcn + Magic UI element plus the daisyUI component layer, all driven by one Holo UI/UX token source across light, dark and immersive.","schema:identifier":"org.hologram.HoloUI","schema:image":"apps/ui/icon.svg","schema:keywords":["components","ui","ux","design-system","shadcn","magic-ui","daisyui","tokens","react","uor","content-addressed"],"schema:name":"Holo UI","schema:softwareRequirements":["holo-theme.css","holo-mobile.css","holo-phi.css","holo-theme.js","holo-ui-kernel.js"]}},{"blake3Entry":"83c35638004066699f24b346189947170127af5373175411deae4b65b485bb25","dir":"video","entry":{"@id":"did:holo:sha256:d0895d1cf629885c5037d7b894edf5e147ab697043530fee3b8c3cc8cb7c04fa","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/video/index.html","holo:categories":["AudioVideo","Video","Player"],"holo:root":"did:holo:sha256:d0895d1cf629885c5037d7b894edf5e147ab697043530fee3b8c3cc8cb7c04fa","holo:words":"paddle.inner.dwarf","schema:alternateName":"paddle.inner.dwarf","schema:applicationCategory":"MultimediaApplication","schema:description":"A verified video player with adaptive streaming, tamper-proof and serverless.","schema:identifier":"org.hologram.HoloVideo","schema:image":"apps/video/icon.svg","schema:keywords":["video","player","hls","streaming","media","videojs"],"schema:name":"Holo Video","schema:softwareRequirements":["holo-gpu.js","holo-manage.js","holo-mobile.css","holo-theme.js","teleport.js","videojs/video-js.min.css","videojs/video.min.js"]}},{"blake3Entry":null,"dir":"hub","entry":{"@id":"did:holo:sha256:620299e9ab8fdfb5396f254d8ef2636aa3c8940b15c76b5a84f72727077b002c","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/hub/index.html","holo:categories":["System","Utilities"],"holo:entry":"sha256:f3626a5a2eeef441d8439bb4b379592f4d682155c4e074249912bd2ade94dc20","holo:root":"did:holo:sha256:620299e9ab8fdfb5396f254d8ef2636aa3c8940b15c76b5a84f72727077b002c","holo:words":"cube.guilt.access","schema:alternateName":"cube.guilt.access","schema:applicationCategory":"UtilitiesApplication","schema:description":"Discover and stream thousands of apps — one clean place, nothing to install.","schema:identifier":"org.hologram.HoloHub","schema:image":"apps/hub/hologram.svg","schema:keywords":["apps","store","discover","stream"],"schema:name":"Holo Hub"}},{"blake3Entry":null,"dir":"files","entry":{"@id":"did:holo:sha256:ba6924d144a0267e1edb4f61cf4e3b1b9031d547f14c38adb75ef550026b87e1","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/files/index.html","holo:categories":["System","Utility"],"holo:entry":"sha256:963401ee68a2e9b050456cdcd3aa582d9cfc50eb7c8afef6349fbcef1fb57ee3","holo:root":"did:holo:sha256:ba6924d144a0267e1edb4f61cf4e3b1b9031d547f14c38adb75ef550026b87e1","holo:words":"chuckle.nation.cruel","schema:alternateName":"chuckle.nation.cruel","schema:applicationCategory":"UtilitiesApplication","schema:description":"The native file explorer for Hologram OS one window onto the whole verified object universe, plus your writable OPFS home. Feels native on every OS.","schema:identifier":"org.hologram.HoloFiles","schema:image":"apps/files/icon.svg","schema:keywords":["files","explorer","finder","file manager","opfs","content-addressing","uor","fhs","holospace","law-l5","native","serverless","privacy"],"schema:name":"Holo Files","schema:softwareRequirements":["holo-files.js","holo-platform.js","holo-ui-kernel.js","holo-theme.js","holo-ux.js","holo-capability.mjs","holo-object.js","holo-mobile.css","holo-webdav.js","holo-find.js","holo-resolve.js","holo-federate.js","holo-answer.js","holo-ask.js"]}},{"blake3Entry":null,"dir":"arcade","entry":{"@id":"did:holo:sha256:d4a4f2d6835c0efa0f7b50361dcbe8be84c60328a2f060c23ac8e016dbf7f5dd","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/arcade/index.html","holo:categories":["Game","Emulator","Player"],"holo:entry":"apps/arcade/index.html","holo:root":"did:holo:sha256:d4a4f2d6835c0efa0f7b50361dcbe8be84c60328a2f060c23ac8e016dbf7f5dd","schema:applicationCategory":"GameApplication","schema:description":"Play freely-shared Game Boy homebrew instantly — on-device, no server.","schema:identifier":"org.hologram.HoloArcade","schema:image":"apps/arcade/index.html","schema:keywords":["games","arcade","homebrew","game boy","retro","emulator"],"schema:name":"Holo Arcade"}},{"blake3Entry":null,"dir":"hello","entry":{"@id":"did:holo:sha256:66c1ada5ac08a2d4f73851bbe7458ad5fb6e2226c5a131c3829abfe715900fed","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/hello/index.html","holo:entry":"index.html","holo:root":"did:holo:sha256:66c1ada5ac08a2d4f73851bbe7458ad5fb6e2226c5a131c3829abfe715900fed","schema:applicationCategory":"UtilitiesApplication","schema:description":"An encoded experience — a folder became one verifiable address, streamed and re-derived before it paints.","schema:name":"Hello"}},{"blake3Entry":null,"dir":"games","entry":{"@id":"did:holo:sha256:d3c83e4dc5e0dc9373177e1b594e33b1ff796aa9cd734bce34d2bd0aaf8f8a87","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/games/index.html","holo:categories":["Game","Emulator","Player"],"holo:entry":"apps/games/index.html","holo:root":"did:holo:sha256:d3c83e4dc5e0dc9373177e1b594e33b1ff796aa9cd734bce34d2bd0aaf8f8a87","schema:applicationCategory":"GameApplication","schema:description":"The full retro library — homebrew plays instantly; every system streams and plays on-device.","schema:identifier":"org.hologram.Games","schema:image":"apps/games/index.html","schema:keywords":["games","arcade","homebrew","game boy","retro","emulator"],"schema:name":"Holo Games"}},{"blake3Entry":null,"dir":"carry","entry":{"@id":"did:holo:sha256:9f44164b17e6b7e37f39623bb445d49b6608da5f2b04cef8b1a8b183362a6b9a","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/carry/index.html","holo:entry":"index.html","holo:root":"did:holo:sha256:9f44164b17e6b7e37f39623bb445d49b6608da5f2b04cef8b1a8b183362a6b9a","schema:applicationCategory":"UtilitiesApplication","schema:description":"Seal your whole world into one file only you can open — back it up and restore it anywhere. No server.","schema:name":"Carry"}},{"blake3Entry":null,"dir":"jellyfin","entry":{"@id":"did:holo:sha256:3fd2a00105ad0e8f01109dce52ff4c7a0cc6c9444532b0453ed9d770cce2d3a4","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/jellyfin/index.html","holo:categories":["AudioVideo","Video","Player"],"holo:entry":"sha256:3fd2a00105ad0e8f01109dce52ff4c7a0cc6c9444532b0453ed9d770cce2d3a4","holo:root":"did:holo:sha256:3fd2a00105ad0e8f01109dce52ff4c7a0cc6c9444532b0453ed9d770cce2d3a4","schema:applicationCategory":"MultimediaApplication","schema:description":"A media server with no server — the Jellyfin experience over the κ substrate: movies, shows, music, games and books, every object content-addressed and verified on read.","schema:identifier":"org.hologram.HoloJellyfin","schema:image":"apps/jellyfin/icon.svg","schema:keywords":["jellyfin","media","server","movies","music","games","books","serverless"],"schema:name":"HOLOGRAM"}},{"blake3Entry":null,"dir":"bonsai","entry":{"@id":"did:holo:sha256:654c668faea49909268dcd047e80ba854bfda3a3c316ff5c043a803ea9630bad","@type":["schema:SoftwareApplication","schema:WebApplication"],"dcat:landingPage":"apps/bonsai/index.html","holo:categories":["AI","Productivity"],"holo:root":"did:holo:sha256:654c668faea49909268dcd047e80ba854bfda3a3c316ff5c043a803ea9630bad","holo:words":"volume.olive.plate","schema:alternateName":"volume.olive.plate","schema:applicationCategory":"ProductivityApplication","schema:description":"A 27B-class 1-bit mind that streams into your browser like a film — serverless, content-addressed, yours offline forever.","schema:identifier":"org.hologram.Bonsai","schema:image":"apps/bonsai/icon.svg","schema:keywords":["ai","llm","1-bit","bonsai","prismml","webgpu","browser-native","serverless","on-device","kappa-disk","content-addressing","did:holo","law-l5"],"schema:name":"Bonsai"}}]
sha256/e9ae0098c5ca92a0e6bedf15a794487ed36f54cd33f914d2eee8a0e97ad4c30c ADDED
The diff for this file is too large to render. See raw diff