The Glass🪩
A **generative surface** for Android. You ask for something in ordinary words, it resolves to the lightest artifact that can do the job, a declarative L-0 view, a portable L-1 mini app, or a generated L-2 web app, runs a opaque origin sandbox with no network, and keeps its state as kind 30078 nostr events on the user's own Citrine relay.
Private provider is the substrate and is a separate application. It owns the identity, amber, nip 55, the wallet, attested inference from Routstr D, the local relay citrine, and the on-device build chain. This repo links nothing from it. The surface reaches compute only through the host's binder bridge to private providers exported service.
The Glass surface never holds keys, and never does crypto. No Android, Intense, Nip55, Nip46 or Curve Crypto in the surface renderer. Host services arrive through the adapters, never by reaching into app. The host consumes the surface only as assets.
Ask for what you need. It appears. Throw it away. If you need to keep it, keep it. Really want to share with someone, upload to blossom. No need to build apks, publish to app stores for simple things. The app is a nostr event.
The surface is transient, the state is yours.
Login to reply
Replies (1)
btw, i created some PRs:
routstrd writes every request and every failure to its own log file (~/.routstrd/logs/YYYY-MM-DD.log). That file is the only record a failed request leaves: the daemon stdout carries nothing but [routstrd:start] startup progress, and the usage database is appended only after a completed response, so "why did that fail?" had no answer anywhere the app could show.
DaemonLogTail reads a bounded tail of that directory (newest file last, each file named, the partial first line dropped, an explicit omission marker) and showLogDialog renders it under its own DAEMON LOG header. The directory is inside the app sandbox: the runtime binding maps /root/.routstrd to files/routstr-home, and AttestationWatcher already tails the same file. coco-logs (the far more verbose wallet-engine diagnostics) is deliberately not rendered. The dialog Clear button still only clears the activity log and the saved crash reports; the header says where the daemon logs are cleared instead.
Note for review: the copied log can now include wallet amounts, mint URLs and Lightning invoices that the daemon records at info level. The seed is not among them (routstrd logs a mnemonic fingerprint, never the mnemonic), but if Copy should stay wallet-free this section needs the same redaction the daemon stdout gets.
Verification:
- 25 new assertions in android/tests; the currency marker moves 1191 -> 1218 and android/check-currency.sh passes
- android/run-tests.sh: 1246 passed, 1 failed (the pre-existing JDK-17-only BlossomServersTest URL-host case: JDK 20+ rejects a space in a URL host, JDK 17 parses it leniently; CI pins JDK 21, and main shows the same single failure on this JDK)
- the whole app source compiles clean against android.jar (API 36) with JDK 17
- scripts/guard.sh --tree passes
View quoted note →