No Solutions #30 — Napplets w/ Sandwich¶
Epizód: Episode 30: Napplets • Dátum: 2026-07-22 • Házigazda: Gigi (dergigi) • Vendég: Sandwich (napplet.run) Forrás: sovereignengineering.io • Blossom M4A (52 MB, 1:37:45) Transcript: OpenAI Whisper
ggml-medium.en.bin(whisper.cpp, Metal GPU), saját futtatás 2026-07-23 (97:45 → 16 259 szó, 0 hallucináció, 3 részre bontva)
Összegzés¶
Az epizód középpontjában a Napplets projekt áll: sandboxed, composable Nostr appletek, amelyek a böngészősandbox- és az alkalmazás-szerver kontinuum közötti hézagot töltik be. A beszélgetés az architektúra (Nostr események, mint app-tároló), a biztonsági modell (iframe sandbox, postMessage kommunikáció), és a gyakorlati iteráció (1 éves fejlesztés, több mint 50 sandboxolt mini-app) mentén halad, miközben a Bitcoin Lightning micropayment-ek és a Nostr identity integrációját is érinti. A vendég Sandwich (korábban hzrd, illetve gzuuus) a Sovereign Engineering cohort tagja, és a Napplets a cohort egyik legnagyobb, legkomplexebb nyílt forrású projektje.
1. rész: A napplet architektúrája — composable, sandboxed Nostr appok¶
A házigazda Gigi (dergigi), a No Solutions podcast műsorvezetője, a sovereignengineering.io oldaláról. A vendég Sandwich, a napplet.run készítője, aki mintegy egy éve fejleszti a sandboxed, composable Nostr appletek rendszerét. A beszélgetés a nappletek architektúráját, biztonsági modelljét, iterációs történetét és a böngésző-sandbox kontinuumot járja körül.
Bevezető: a live stream applet és a workshop¶
A beszélgetés a live stream applet demójával indul, amely a SAP Stream megfelelője, de immár egy nappletként, azaz egy host shellbe ágyazva működik — csupán a stream-eseményeket húzza be a Nostr relay-kből. Gigi a demó apropóján jelenti be, hogy a nap aznap a világ eddigi legsikeresebb workshopját tartotta: több mint egy tucat (12+) résztvevő készített nappletet. Sandwich ehhez egy külön tutorial-oldalt is összerakott, amelyre rámutatva egy AI agent öt-hat perc alatt képes volt megépíteni és telepíteni egy működő nappletet — feltéve, hogy a felhasználónak van NIP-46-os távoli signer profilja (pl. Amber a telefonon) és a fejlesztőgépen is be van állítva a Nostr signing flow.
Mi a napplet: composable, sandboxed Nostr app¶
A napplet definíciója: composable, sandboxed Nostr app, amely egy host shellben fut. Sandwich kiindulópontja az volt, hogy a Nostr protokoll — „vagy annak hiánya” — maximum flexibility-t igényel, mert a relay-k, a kind-ok és a kliensek tetszőlegesen kombinálhatók. Ezzel szemben egy hagyományos Nostr kliens (Damus, Amethyst, Coracle stb.) túlzottan restriktív: egyetlen csapat egyetlen víziót valósít meg, és a felhasználó nem tudja kicserélni a komponenseket. Sandwich erre reagál: „every functionality should be atomic… you should be able to compose your clients.” Gigi ezt egészíti ki azzal, hogy a komplexitás egy része a kulcskezelés, az aláírás, a relay-kapcsolatok, a cache és az Outbox modell — ezek azonosak minden kliensben, tehát értelmetlen, hogy minden applet újraimplementálja őket. A nappletek emiatt egy másik absztrakciós rétegen dolgoznak, mint a meglévő klienskönyvtárak (NDK, applesauce): a host shell mediálja a signing/storage/relay/upload/permission/user trust funkciókat, és az applet fejlesztőjének nem kell ismernie a Nostr teljes protokollját.
Iterációs történet: Naps, Nap.run, Tauri, Thorium, iframe hardening¶
Sandwich az eredeti ötletét visszavezeti a 2024. júliusi sacramentoi estéhez, amikor barátja ajánlására elkezdett Claude-dal „vibe codeolni”, és ugyanakkor megismerkedett a Hyprland Wayland kompozitorral. A Hyprland élménye — „sick of the bloat, sick of the opinionation” — ihlette azt a gondolatot, hogy egy saját, minimalista desktopot érdemes építeni, és ezen a lendületen született az első prototípus, amelyet ma már Atlas néven ismerünk. A korai változat neve Naps volt, és a teljesítményproblémák miatt az appleteket iframe-ekre bontotta — ekkor jöttek elő a komoly biztonsági problémák: az applet bármit megtehetett, amit a runtime, a sorok elmosódtak a konténer és az applet között.
A tanulság: vissza kellett lépni a prototípustól, és „valóban jól” kellett megcsinálni. A következő iteráció a Tauri-alapú nap.run volt, de ez hamar elérte a plafont, mert nem lehetett mindent megvalósítani. Ezután a Thorium (egy slimmed-down Chromium-fork) felé fordult, de a build-chain és a CI erőforrásigénye kezelhetetlennek bizonyult. Végül a letisztult megoldás: egy single-frame architektúra, ahol az iframe-ből indítva progresszíven eltávolította az összes feature-t, amit az iframe használhatott, amíg az már csak postMessage-en keresztül tudott kommunikálni a hosttal. A biztonsági modell ekkor állt össze: 4-6 hónapnyi újrafogalmazás után jött rá, hogy „a person making the application doesn't need to know as much as I originally thought” — az applet fejlesztőjének nem kell tudnia, hogy Blossom-ot használ, hová tölti fel, milyen relay-t használ.
A host runtime konkrét felelősségei¶
A host runtime hét konkrét feladatot lát el:
- Keys — a privát kulcs soha nem hagyja el a hostot.
- Signing — minden aláírás a shellben történik.
- Encryption / decryption — a titkosítás és visszafejtés is shell-oldali, és a host köteles elutasítani a bejövő üzenetet, ha az felette titkosítva érkezik (lásd lentebb).
- Relays — a relay-pool és a kapcsolatkezelés a host dolga, beleértve az Outbox modellt is.
- Resource loading — a bináris tartalmak betöltése és a blob-hash validáció a hoston fut.
- Storage — az appletek sandboxolt storage-scopesokat kapnak.
- Uploads és user prompts — a feltöltés a felhasználó által konfigurált Blossom-szerverlistán át történik, és ha a felhasználónak nincs konfigurálva szervere, a host promptol.
Sandwich egy konkrét példán demonstrálja: egy drag-and-drop upload appletben az applet csak annyit tud, hogy „upload”; a host dönti el, hogy ez Blossom, Hashtree, IPFS vagy akár Google Drive-ot jelent-e. Ha a felhasználónak nincs szervere, a host promptolja a konfigurációra; ha több van, megkérdezi, melyikre vagy melyekre töltse. Olvasásnál az applet átad egy Blossom-hash-t, és a host tudja, hol keresse.
Helper API-k vs. escape hatches, a plaintext-only busz¶
A runtime két szintű API-t biztosít az appleteknek. A magas-szintű helper API elrejti a protokoll részleteit (Outbox, upload, publish stb.), míg az escape hatches — alacsony szintű relay interfész — közvetlen hozzáférést ad a protokollhoz, ha a helper nem elég rugalmas. Sandwich indoklása: ha mindent helperen keresztül kényszerítenénk ki, az korlátozná a lehetséges felhasználói élményeket, viszont az escape hatches garantálja, hogy a „maximum flexibility” megmaradjon.
A biztonsági modell sarokköve: a message bus fölött mindig plain text megy. A host azonnal elutasítja a titkosított bejövő üzeneteket. Ennek oka a side-channel támadások kivédése: ha az applet dekódolhatna titkosított tartalmat, a támadó applet kihasználhatná a tárolási scopot és a heurisztikákat, hogy az applet szerzőjének visszaküldött titkosított üzenetekben exfiltrálja az adatokat. A plain-text szabály biztosítja, hogy a runtime naplózni tudja, az applet mit küld, és a felhasználó „reasonable assurance”-t kap, hogy „no funny business is going on”.
Applet-to-applet kommunikáció és a „rebuild an operating system” felismerés¶
Az appletek közötti kommunikáció megoldása a legnehezebb kérdés, és „csak tegnap este” (a felvétel előtti napon) dőlt el — Hazard bevonásával, aki közel egy évig tartó meggyőzés után 10 perc alatt „hookolt be”. A megoldás lényegében az, hogy az appletek ugyanúgy viselkednek, mint egy operációs rendszer folyamatai: Android intents, MIME-typok, archetype-ok és OS resource API-k mentén kommunikálnak.
Az „aha moment” a resource loading kapcsán jött: a bináris tartalmakat az applet nem éri el hálózaton át, ezért a bájtokat a buszon kell streamelni — ugyanaz a probléma, mint amit az OS-ek médialejátszáskor megoldanak (Linux media API). Sandwich szó szerint kimondja: „you just have to rebuild an operating system in a browser window.” A gyakorlatban a YouTube-videók és a stream-ek ezen a médialejátszó API-n keresztül működnek.
A fő szál ugyanakkor (FiatJaf projektjéhez hasonlóan) kezdetben a shell mint relay, és a NIP-1 üzenetek küldözgetése volt, de ez „huge convoluted mess”-t okozott, mert minden appletnek külön kulcspárt kellett volna rendelni — feleslegesen, hiszen a host amúgy is teljes kontrollal bír az applet fölött. A jelenlegi modellben az appletek nem kulcsolnak eseményeket, hanem a host mindent aláír a felhasználó kulcsával.
Fejlesztői ökoszisztéma: Kehto, Paja, no-dependencies¶
A teljes fejlesztői stack no-dependencies elvet követ: vanilla JavaScript (a bundlerek és a skill-ek kivételével). Ennek oka biztonsági és karbantarthatósági: a csomagok függetlenek más Nostr-könyvtáraktól, így a támadási felület minimális. A protokollt enélkül is meg lehet valósítani, de a csomagok nélkül „really hard to sell anyone on it in 2026”.
A két fő komponens:
- Kehto (finnül „bölcső”) — a runtime csomag: shell, ACL, firewall (egyelőre rate limiterként viselkedik, hogy tehermentesítse a runtime-ot), service-ek stubjai (notifications, relay pools, storage, KB storage, media handler). A shim is ide kerülhet át.
- Paja (finnül „munkapad”) — a fejlesztői runtime, amivel runtimékat lehet építeni.
A nappletek további formai megkötése: minden napplet egyetlen fájl — ez implicit módon kényszeríti ki az „egy dolgot csinál, de jól” filozófiát, és méretben tartja a komponenseket. A workshop után a felhasználók több mint egy tucat nappletet publikáltak.
A böngésző-sandbox kontinuum és a natív app határ¶
Sandwich tudatos döntése, hogy a nappleteket böngészőben valósítja meg, nem natív asztali appként. Ennek okai: (1) a felhasználónak nem kell telepítenie semmit — egy link azonnal működik, akár anonymous Jack-ként; (2) a rendszer permissionless, mert a runtime maga old fel mindent (nsites, blob-hash validáció, IPFS, torrent), és az egész telepíthető nsite-ként, így nincs szükség „initial delivery” gateway-re; (3) a legszélső eszközöktől (mikrokontroller kijelzővel) a natív appokig terjedő kontinuumon a böngésző a középső lépés, és ha működik a böngészőben — ami elvileg „lehetetlen” —, akkor elméletileg a kontinuum minden pontján működnie kell. A demó egyébként egy távoli, gyenge hardveren futott hibátlanul, a host-szerű UI fullscreenben „úgy néz ki, mintha natív app lenne”.
A teljesítmény és biztonság kulcsa: a main thread kizárólag a DOM renderelésére és az üzenetirányításra szolgál a parent frame-ben, minden más web workerekben fut. CSP-vel és sandboxolt iframe-ekkel kombinálva egy applet nem tudja kimeríteni a relay-ket és összeomlasztani a parent frame-et. Ez a fő különbség a jelenlegi alternatívákkal szemben.
Kapcsolódó projektek és a párhuzamos evolúció¶
Sandwich a többi hasonló próbálkozást is ismerteti kronológiai sorrendben. FiatJaf (FiatJaf) 2022 végén, a JaxWave előtt indította a Naps-ot — „ancient idea, too early”. A Yakihonne-nek volt egy egyszerűbb view-jellegű megoldása. A Soapbox Tiles Lua-alapú, natív környezetre készült, és Sandwich aktívan beszél a készítőjével. FiatJaf most Balazs-szal dolgozik a Nostr Apps / Naps projekten, amely a commit history alapján „kb. egy évvel ezelőtti gondolkodásomra hasonlít” — hasonló problémákat oldanak meg, hasonló sorrendben, de más-más konklúziók felé haladhatnak. Gigi philosophikus párhuzama: Paul Hypernote-ja, amely „spiritedly hasonló”, bár a végrehajtás nagyon más. A fő eltérés a többi projekttel szemben a fenti biztonsági és teljesítmény-modell: CSP + sandboxolt iframe + web workerek + main thread korlát — enélkül egyetlen applet leterhelhetné az összes relay-t.
2. rész: A workshop, az inter-applet kommunikáció és a Nostr-út (2022-2025)¶
A második rész a „workshop tapasztalatokkal” indul (RISC-V microkernel kitérő, 80%-os sikerességi arány), azután az inter-applet kommunikáció kísérleti tervezését tárgyalja (Android intents, MIME types, under-specification), végül Sandwich teljes Nostr-útját meséli el 2022-től 2025-ig: a NIP-46-os key management problémától a Nostr Watch-on át a Nsites v2-ig és a NIP-66 relay state machine-ig.
A workshop és a microkernel-tanulság¶
Sandwich az első workshopot a RISC-V microkernel-implementációval alapozta meg — ez egy „teljesen más projektnek” indult, de a tapasztalatok közvetlenül átvihetők voltak a nappletekre:
- A microkernel a TUI-val (terminal user interface) működött „moderately sandbox environment”-ben
- Implementálta a nehezebb NIP-eket: resource, outbox, KV storage (+ egy harmadik, amelyik nem jut eszébe)
- A cél: látni, hogy a sandbox-architektúra elvileg működik — amint ez megvolt, „full force on the website, just to get it to the public”
- A workshop sikerességi aránya: a résztvevők kb. 80%-a készített nappletet a cohortban, és a kész nappletek betölthetők voltak több hostban (Strudel, Paja — utóbbiban volt bug, Amethyst)
- A demo appletek között: live stream view, paste-to-upload flow, multiplayer chess (alpha), paint applet, profile maplet, és még sok más
Az Amethyst-integráció még nem teljes: Vitor (az Amethyst fejlesztője) nem üldözte a specet, de ez a workshop hangulatából fakadóan várható volt. A spec „még evolvál”, és Sandwich örülne, ha a cohort tagjai nyitnának issue-kat + thumbs up-okkal jeleznék a prioritásokat.
Inter-applet kommunikáció: „napplet://archetype/intent”¶
A hiányzó feature: az egyik appletből egy másikba akciót indítani. A megoldás a séma: napplet://archetype/intent?parameters — ugyanaz a minta, mint az Android/iOS deep linkeknél (share, open profile, stb.).
Miért NEM specifikálják túl a wire formatot?¶
- A „semantics of data alone” túl merev — az intent-ek implicit kontextust hordoznak
- Ha
profile/openintentet hívsz, nyilvánvaló, hogy npub-ot vagy nprofile-t fogsz kapni, és a developer rájön, mit kell vele tennie - A wire format-ok száma „százezer potenciális” lenne, ha minden részletet formalizálnának — ez most túl sok overhead
- Az LLM/agent korában az under-specification gyakran jobban működik, mint a túl-specifikáció: a fejlesztők „rátalálnak” a helyes használatra, és a system „magic”-ként hat, amikor két fejlesztő egymástól függetlenül ugyanarra a megoldásra jut
Sandwich konkrét példája: Balázs (a cohort tagja) készített egy profile mapletet, ami megnyitotta a feedet. „Működött.” A kérdés: „Can your agent make sense of it?” — és a válasz igen, az LLM-ek számára ez az állapot „makes sense”.
Mi következik ezután?¶
- Polish + onboarding
- Notifications (még nem készültek el)
- Inter-applet communication (az imént tárgyalt kísérleti fázis)
- Desktop shell (natív, nem böngésző-alapú)
- Egyedi kernel / cyberdeck típusú microkernel-hardver — ez az „exoteric” végállapot, ahol a felhasználó a teljes szoftver-stack-et kontrollálja
A napplet használati lehetőségek a szociális domainen túl¶
A futásidejű (runtime) oldalról a napplet-modell nem korlátozódik social appokra:
- Játék-mod rendszer: Sandwich készített egy „npub land” (korábban pubkey land) nevű játékot, ami nappleteket használ modokként — permissionless, és a felhasználó közelébe érve a játék betölti a mod-appletet
- Rádió-állomás applet globálisan, bárki broadcastolhat
- Zenei / videó kollaborációs eszközök (social aspect nélkül)
- Plugin rendszer bármilyen alkalmazáshoz
- A nappleteknek NEM kell a Nostr social aspect-jét használniuk — azonosításra (session-azonosító) használhatják a Nostr identity-t, de a képességek nagyon limitáltak lehetnek
A paint applet, mint „MS Paint Nostr-ban”¶
A workshop egyik legszemléletesebb demója: a paint applet — lényegében egy MS Paint-stílusú mini app, ami bármely kliensben betölthető, és amivel a felhasználó képeket annotálhat. A workflow: paint appletben rajzolás → right-click copy image → paste a long-form appletbe vagy note appletbe. „Visszatérés a jó öreg egyszerű időkbe, ahol minden nagyon egyszerű.”
Sandwich Nostr-útja (2022-2025)¶
Sandwich a teljes hátterét elmeséli, és ez a szakasz az epizód legjobb first-person története.
A kezdet: 2022-es szabbatikálás¶
- 2022-ben egy „self-funded sabbatical”-on volt, „kind of miserable” állapotban
- Új szerződés vagy állás helyett az volt az ösztöne, hogy „play around a little bit”
- Elindított egy Lightning node-ot (LNDG-vel kísérletezett)
- Az LNDG-ben volt egy Nostr notification input — „what the hell is Nostr? This must be related to Bitcoin”
- Egy barátja később emlékeztette, hogy 2020-ban, a cenzúra-hisztéria idején már találkoztak a repóval, de akkor „csak egy repó volt”, nem kerestek semmit, amit építeni lehetne
- Elkezdett játszani Astral Ninja-val — látta, hogy „ugyanaz a 10 ember aktív rajta”, és ez felkeltette az érdeklődését
- Elolvasta a NIP1-et — „valami történt a fejemben, valami robbanásszerű, mind-blown, azonnal értelme lett” — ez a „mély húzás” indította el a fejlesztői utat
Nostr Watch: 6 relay → 50 PR/3 nap¶
- Kíváncsi volt, milyen relayek vannak — forkolta a Nostr Relay Registry-t (Fiat Jeff repója, vagy valaki másé, nem emlékszik pontosan)
- A fork lett a Nostr Watch
- Akkor jött a flu — 3 napig ágyban feküdt, a telefonja folyamatosan vibrált
- Mire fel tudta venni a telefont (a flu miatt fényérzékeny volt): kb. 50 pull request várta, „what the fuck”
- A Jack (jb55?) által posztolt link hatására az emberek elkezdték hozzáadni a saját relayjeiket
- 6 relayről indult, és egy nap alatt kiderült, hogy a felfedezhetőség az egész ökoszisztémát blokkolja
- A 2023-as év viszont „pretty hard” volt — a side project negatív visszajelzései (incel-imulzus a kommentekben) kimerítőek
- Ma a Nostr Watch stabil és olcsó: cross-site scripting attack pár hete (gyors javítás), de „runs itself”
- Gigi: „I use it all the time” — főként NIP-50 relayek keresésére és saját dolgok health check-jére
Nsites v1 → Nsites v2: a spec-háború¶
- Sandwich az Nside.run-t (mindkettőt, az elgépelést is) építette
- Az eredeti Nside szerzője „nem igazán értette, mit csinált” — mások vették át a projektet, köztük Sandwich és Hazard (hzrd149)
- Sandwich első szándéka nem az Nside volt, hanem egy CLI / TUI építése (NIP-46 key management-tel, mert nem akarta a privát kulcsát „random website secrets field”-jébe tenni)
- A Florian-féle első CLI „nagyon jól sikerült”, de Sandwich egy automatizáltabb, szebb CLI-t akart
- Az Nside.run kiadása „az első alkalom volt, amikor sokan tudták, hogy ez létezik”
- December 2025: Hazard új specet tett közzé, de senki nem frissítette a stack-jét → Sandwich „getting pissed off and fed up with Master”
- A megoldás: „ha te megcsinálod, mások követnek” — Sandwich kiadott egy Nside v2 gateway-t + Blossom szervert + relayt (ami csak Nside eventeket fogad) + frissített CLI-t + web deployert (statikus site drag-and-drop)
- Az infrastruktúra teljesen serverless, edge scripting on bunny.net — „barely works, but very cheap to run”
- A web deployer egy „novel idea” volt az Nsite-ok „ellopásáról” — ez viralitást kapott, és a leverage révén Sandwich tudta tagelni azokat, akiknek volt infrastruktúrájuk, hogy „update your shit”
- Egy héten belül mindenki frissített, és a PR merge-ölve lett
- Sandwich tervei: lebontja a saját Nside infrastruktúráját, mert „not intended for long-term”
A NIP-66: relay mint state machine¶
A NIP-66 a relayek állapotát írja le Nostr eventek formájában. Sandwich „really freaking excited” róla, mert:
- A Nostr itt „state machine-ként” működik, de a state nem globális, hanem relatív a felhasználó trust-gráfjához
- Egy monitor / observer NPUB publikál információt egy relayről — és ez „bárki lehet, akit követsz, vagy a web of trust-od része, vagy bármi más”
- Első ránézésre „very arbitrary and useless”, amíg nem érted meg a relay-domain komplexitását
A relay-domain „nagyon komplikált”, mert:
- A relay URL-ek „fuzzy string”-ek — nem garantáltan egyediek
- A NIP1 egészen a közelmúltig nem specifikálta a relay path / segment kezelést
- Emiatt relay.damis.io és relay.damis.io.io/gg ugyanaz a relay — ez kliens-oldali optimalizálási problémákat okoz
- A legtöbb string „garbage”: 15-20 ezer egyedi string, de ezek nagy része vagy offline, vagy „client bug seven months ago, that still exists somewhere”
A NIP-66 általános értelme: a relay discovery-hez vezető út. A NIP-50 (search) relayek megtalálása a web of trust-ban nehéz, mert nem lehet „az összes NIP-50 relay a web of trust-omban” lekérdezést csinálni a NIP-11-ek egyenkénti hívása nélkül. A kliens-oldali deduplikáció „pretty efficiently” megoldható idővel.
A NIP-66-ra ráépül a trusted relay assertions koncepció: bárki építhet adatot a liveness data tetejére, és a NIP-66 lényege, hogy „csökkenti mások munkaterhét”.
3. rész: Relay specializáció, vibe coding, AI slop scanning és bare metal GPU¶
A harmadik, egyben utolsó rész négy nagy témát ölel fel: a relay specializáció jövőjét (NIP-66 trusted relay assertions, relay attributes, „subjective” self-descriptive words), Sandwich teljes vibe coding / agent workflow útját (waterfall, GSD, loop engineering, OpenSpec, Socratic method), az AI slop scanning szerepét a CI-ban, és a bare metal GPU vásárlás „Bitcoin bányászat” közgazdaságtanát.
Relay specializáció és a NIP-66 trusted relay assertions¶
A NIP-66-ra épül a trusted relay assertions koncepció: bárki építhet adatot a NIP-66 liveness data tetejére, és így szubjektív trust score-ok szerint lehet sorbarendezni a relayeket. Sandwich az outbox optimalizációban használja ezt másodlagos szűrőként (a web of trust grouping után).
Relay discovery: 1500+ relay (Tor/I2P-vel együtt)¶
A relay-ek száma a dedup után ~1500 — Tor és I2P relayekkel együtt. „Több relay, mint user” — ez a NIP-66 első látásra „arbitrary”-nak tűnő értelmét adja.
A jövő: relay attributes (Hazard-del közös munka)¶
Sandwich és Hazard (hzrd149) ~1,5 éve dolgozik együtt a relay specializáción. A Costa Rica-i beszélgetés után megegyeztek a relay attributes rendszerben:
- A NIP-11-hez 9 PASCAL case attribute-et lehet hozzáadni (a 9 a cap, az aggregatorok truncate-elnek)
- Az attribute-ök self-descriptive words a relay viselkedéséről — NEM technikai implementációk, hanem a relay operátor szubjektív döntése (pl. „pubkey-indexer” a Purple Pages-hez)
- A cél: ne atomizálják túl, hanem „hashtag clouds”-szerűen hagyják, hogy a közösség koalíciókat alkosson a saját szavaik köré
- A specializáció dimenziói: NIP-50 search támogatás, web-of-trust gating, fizetős vs. ingyenes, geoblokk, proof-of-work, restricted writes, clear-net / Tor / I2P / FIPS
- A NIP-1 korlátai miatt a payment filteringhez
capital R+!paymentformátumot használnak (negatív prefix a free relayekhez)
Sandwich saját tervei: saját Purple Pages instance profil-lookup-ra, Boris (highlight app) újraépítése, és egy relay kifejezetten highlights + long form tartalomnak.
Vibe coding: Sandwich 8 hónapos útja¶
Sandwich a 2024-es LLM-robbanás óta fejleszti az agent workflow-ját, és az iterációk:
1. Auto-GPT / Baby-AGI korszak (2023 eleje)¶
- Az első próbálkozások „beagle-agyi” loopokba ragadtak
- Az agentek IQ-ja „100 ponttal alacsonyabbnak” tűnt — ugyanazt a fájlt 100-szor írták felül, vagy a root mappában kezdtek „destroy everything”
- Sandwich humora: „I should have been outside skateboarding” — ehelyett ukrán és román fejlesztőkkel dolgozott korábban (kelet-európai csapatok vezetése → „I was babysitting my agent before it was cool”)
2. 2024 vége: az első „success”¶
- A reasoning modellek megjelenésével az agent „elkezdett döntésein inflectálni”
- Sandwich: „abrupt change in ability for me to delegate”
- Az iteráció innentől nem „every 3 months”, hanem „every couple of days”
- A waterfall volt az egyetlen módszer, ami működött: high-level dokumentum → spec → low-level design chunks → implementation
- A használt modell: GPT-4/5 Pro (késői 4-es, korai 5-ös), „dead-arrow” fázisban
3. GSD (Get Shit Done): 7-8 hónap¶
- Az első tooling, ami „worked exactly with how I thought”
- A GSD research fázisa a projekt indulásakor nagyon fontos — különösen experimental / novel domain-eknél (Nostr régebben „miserable” volt az LLM-ek számára, mert client-server / username-password mintákat akartak erőltetni)
- A GSD milestone-okra bontja a scope-ot, capture-eli a döntéseket, és a surface-re hozza a kontextust
- A loop engineering mostanra „részben kiváltja” a GSD-t, de a GSD „template” a loop engineeringhez
4. OpenSpec (Fran ajánlotta, pár hete)¶
- „Very lightweight”, kevésbé nehézkes, mint a GSD
- „Quite good starting point” — GSD-szerű workflow építhető rá a sajátosságokkal
- Sandwich még nem váltott, de a GSD-t hamarosan kinövi
5. A jelenlegi flow: back-and-forth + Socratic method¶
- Minden projekt egy AGENTS.md template-tel indul (alap policy, nyelv, scope)
- GSD-vel indul a projekt, „pretty good conversation” → research docs → design docs
- NIP-17-en kommunikál a projekttel (minden projektnek saját NPUB)
- A Socratic method exclusively: az első 10 prompt kérdés, NEM utasítás („what are the search keywords we have?”)
- Az agent kérdez vissza, és a válaszokból építkezik a research
- Pull-the-trigger után „basically done”
A „top 5 things we could improve” gate¶
- Minden feature branch végén megkérdezi: „what's the top 5 things we could improve on this feature branch before I merge?”
- Ha 1-2 dolog „OK”, akkor még iterate
- Ha minden „complete bullshit”, akkor kész
- Ez a „opponent processing” elve: a tesztelő és az implementáló különböző modellek, mert a diverzitás segít
Az AI agent workflow „visszatérése” a klasszikus szoftverfejlesztéshez¶
Sandwich fontos megfigyelése: ugyanazokat a struktúrákat építjük újra, mint a klasszikus szoftverfejlesztésben — most agent-ekkel a humánok helyett. Specifikációk, milestone-ok, issue tracking, review team, CI.
A konkrét workflow: - Saját agent-ek issues-okra és pull request-ekre (strict policy-val) - Automated agent, ami átnézi a „sloppy” issue-kat (amiket valószínűleg Sandwich posztolt), contextualizálja őket, és előkészíti a planninget a következő agent számára - Development team agent (cron-on fut) átveszi az issue-kat, PR-t nyit - Review team agent review-eli - Végső review: Sandwich maga, és ha baj van, „I fucked up somewhere” — „I haven't gotten angry at agents in a long time”
A „vibe coded slop”-ra viszont Sandwich soha nem ír tesztet — „pollutes the context”, és a saját kódja „nem fontos” (UX / interface). Ez az ő szabálya: „never write tests ever” (kivéve, ahol fontos).
AI slop scanning a CI-ban¶
A „couple months ago” megjelent az ai-slop-scan library (eredetileg JavaScript, Sandwich talált egy Rust verziót is crates.io-n). Sandwich az AGENTS.md-be és a CI-ba is beépítette:
- A CI pull request-jei nem mennek zöldre, amíg a slop-scan nem fut le
- A cél: „context poison” megelőzése — minden alkalommal, amikor slop kerül a code base-be, az „örökre” ott van, amíg 3 napnyi munka ki nem takarítja
- A naming consistency különösen fontos: ha egy terminust átnevezel, a function signature-ökben, a property-kben, a paraméterekben még hetekig előfordulhat, és az agent-ek „I renamed it” / „the term doesn't exist anywhere” válaszokat adnak, miközben a signature-ökben még mindig ott van
- A code becomes the context at a certain point in the project — és a jó minták a code-ban a jövőbeli agent-ek outputját is meghatározzák
- A test-driven development a project közepétől kezdve „really, really, really well” működik — különösen a behavior-driven development
- A lényeg: specializált implementer + specializált teszter, soha ne ugyanaz az agent/model
Bare metal GPU: a Bitcoin bányászat analógia¶
Az utolsó nagy téma: saját GPU hardver vásárlás lokális modellek futtatásához. Sandwich őszinte ajánlása:
A subsidizált korlát¶
- Jelenleg mindenki subsidizált modellek és service-ek alatt dolgozik (pl. Pablo fedezte fel a jetgpt.com „hack”-et: egy MCP wrapper, ami nem számít bele a tervedbe)
- A „50K USD per week” compute-költség, amit egyes agent-ek generálnak, „nem tarthat fent” — az AI bubble ki fog pukkanni
- A token-use-nak gazdaságilag optimalizálttá kell válnia
A hardver-vásárlási döntés¶
- Sandwich „50-100K USD”-t tervez költeni (ahelyett, hogy új autót venne)
- Az RTX PRO 6000 Blackwell a jelenlegi „út”
- A limitáció: az NVENC/NVDEC encoder/decoder korlátozva van (csak 4 layer, miközben a chip 10-12-öt tudna) — ez az Nvidia „enterprise vs. consumer” árazási stratégiája
- A megoldás: az Nvidia patch bash script, ami eltávolítja a limitet („chip tuning your car”)
- Sandwich-nek már van hardvere az US-ben, amit az unboxing során fog összerakni
A Bitcoin bányászat analógia¶
- A GPU-vásárlás nem befektetés, hanem operating cost
- A kulc: „cost per watt” és a refresh ciklusok
- Nem szabad érzelmileg kötődni a hardverhez — „wash the market”, „cycle your equipment”, különben veszteséges
- A subsidy era vége: amikor a cloud model-ek ára felmegy, a lokális hardver megtérülése javul
- A lokális modellek Austin (Austin) kutatása szerint „smaller and cheaper and more competitive faster than anyone basically thinks” — ez motiválja a vásárlást
Sandwich záróüzenete: „everyone should do it” — squeeze ki a subsidizált modellekből amennyit lehet, de készülj fel a saját hardverre.
Outro¶
Sandwich „fáradt, 3 órás sétának érezte az epizódot”, és „bocsánatot kért, ha valakinek végig kellett hallgatnia”. A pénteki demó session-re mentek haza — Sandwich-nek „some ideas”-ok vannak, és várja, hogy a tudatalattija megoldja a maradékot alvás közben. Az outro: „Fantastic.”
Forrás¶
- Epizód weboldal: https://sovereignengineering.io/podcast/30-napplets-w-sandwich
- Hangfájl (M4A): https://haven.dergigi.com/e2261870d0eb338d6c4907b82d3cf7a51cb420a3907198124cbb368015de0b19.m4a
- Vendég: Sandwich (napplet.run) — https://napplet.run
- Házigazda: Gigi (dergigi) — https://dergigi.com
- Nostr event: https://njump.to/nevent1qqs00erj743c3ylnkuaplkjjygv83872vryhepepaeldekjd3e30kvqpzamhxue69uhksctkv4hzuer9wfnkjemf9e3k7mgpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgqgdwaehxw309ahx7uewd3hkcyt0pjv
- Transcript forrása: OpenAI Whisper
ggml-medium.en.bin(whisper.cpp, Metal GPU), saját futtatás 2026-07-23 - Feldolgozás: Henky-pipeline (3-chunk: 1 subagent + 2 self-write, 2026-07-23)