@ -18,21 +18,23 @@ In development mode, you can control logging from the browser console:
@@ -18,21 +18,23 @@ In development mode, you can control logging from the browser console:
```javascript
// Enable debug logging
jumbleDebug.enable()
imwaldDebug.enable()
// Disable debug logging
jumbleDebug.disable()
// Disable debug logging
imwaldDebug.disable()
// Check current status
jumbleDebug.status()
imwaldDebug.status()
// Use debug logging directly
jumbleDebug.log('Debug message', data)
jumbleDebug.warn('Warning message', data)
jumbleDebug.error('Error message', data)
jumbleDebug.perf('Performance message', data)
imwaldDebug.log('Debug message', data)
imwaldDebug.warn('Warning message', data)
imwaldDebug.error('Error message', data)
imwaldDebug.perf('Performance message', data)
```
(`jumbleDebug` is still exposed as an alias for compatibility.)
### For Code
Use the logger instead of direct console statements:
@ -11,7 +11,7 @@ When building and deploying on the remote server, you need to build the Docker i
@@ -11,7 +11,7 @@ When building and deploying on the remote server, you need to build the Docker i
**IMPORTANT:** `VITE_PROXY_SERVER` must be set during Docker BUILD (as a build argument), NOT at runtime. It gets baked into the JavaScript bundle.
Rebuild the Jumble image with the correct proxy URL:
Rebuild the Imwald image with the correct proxy URL:
```bash
# Build with the correct proxy URL (baked into the JS bundle)
@ -101,7 +101,7 @@ docker-compose up -d
@@ -101,7 +101,7 @@ docker-compose up -d
The client uses **`POST /api/piper-tts`** on the **same host** as the app (default build: `VITE_READ_ALOUD_TTS_URL=/api/piper-tts`) so the browser does not need cross-origin CORS to aitherboard.
Add these **before** the catch-all `ProxyPass /` to the Jumble static container (same ordering as `/sites/`):
Add these **before** the catch-all `ProxyPass /` to the Imwald static container (same ordering as `/sites/`):
# Should return example.com's HTML, NOT jumble.imwald.eu's HTML
# If you see Jumble HTML, the proxy server is using the Host header instead of the URL path
# If you see Imwald HTML, the proxy server is using the Host header instead of the URL path
```
**If the test returns Jumble HTML instead of the requested site's HTML:**
**If the test returns Imwald HTML instead of the requested site's HTML:**
The proxy server is using the `Host` header (`jumble.imwald.eu`) to determine what to fetch. Update your Apache config to use `ProxyPreserveHost Off` for the `/proxy/` path:
<p>logo designed by <ahref="http://wolfertdan.com/">Daniel David</a></p>
</div>
# Jumble — **ImWald Edition**
# Imwald
**Maintainer: [Silberengel](https://github.com/Silberengel)** · Hard fork of [Cody Tseng’s Jumble](https://github.com/CodyTseng/jumble)
**Maintainer: [Silberengel](https://github.com/Silberengel)** · Evolved from [Cody Tseng’s Jumble](https://github.com/CodyTseng/jumble)
A Nostr web client focused on relay feeds, discovery, and spells. This repository is the **ImWald** line: same core ideas as upstream, with a substantial navigation and information-architecture rewrite (see below).
A Nostr web client focused on relay feeds, discovery, and spells. **Imwald** keeps the same core ideas as upstream, with a substantial navigation and information-architecture rewrite (see below). The public instance lives at [jumble.imwald.eu](https://jumble.imwald.eu).
---
## Major rewrite (this fork)
## Major rewrite (this line)
High-level changes versus a “stock” Jumble-style layout:
@ -47,11 +47,10 @@ High-level changes versus a “stock” Jumble-style layout:
@@ -47,11 +47,10 @@ High-level changes versus a “stock” Jumble-style layout:
### Other
- Sidebar layout tuned for **long translations** (e.g. German) so labels don’t sit on the divider.
- Branding in-app: **Im Wald**.
---
## Features (still core to Jumble)
## Features
- **Relay feeds:** Browse content through relays, sets, and favorites
- **Relay-friendly requests:** Efficient subscriptions where possible
@ -60,17 +59,17 @@ High-level changes versus a “stock” Jumble-style layout:
@@ -60,17 +59,17 @@ High-level changes versus a “stock” Jumble-style layout:
- **Original project:** [CodyTseng/jumble](https://github.com/CodyTseng/jumble) — design, sponsorship, and donation links below still refer to Cody’s work where applicable.
- **This fork:** [Silberengel/jumble](https://github.com/Silberengel/jumble) — Im Wald / rewrite described above.
- **Original project:** [CodyTseng/jumble](https://github.com/CodyTseng/jumble) — upstream design and history.
- **This repository:** [Silberengel/jumble](https://github.com/Silberengel/jumble) — Imwald source and releases.
- Other public forks (examples): [grouped-notes.dtonon.com](https://grouped-notes.dtonon.com/), [jumblekat.shakespeare.wtf](https://jumblekat.shakespeare.wtf/).
## Run locally
@ -97,7 +96,7 @@ Then open: http://localhost:8089
@@ -97,7 +96,7 @@ Then open: http://localhost:8089
Built packages are **not** committed to this repository (only source). They are published as **release assets** when a maintainer uploads them.
- **Download:** [GitHub Releases — latest](https://github.com/Silberengel/jumble/releases/latest) — get the `*.deb` (or AppImage) attached to a release.
- **Install the `.deb`:**`sudo apt install ./Jumble_*_amd64.deb` (use the exact filename from the download folder; `./` is required so `apt` uses the local file). After install, Jumble should appear in your app menu (often under **Network**).
- **Install the `.deb`:**`sudo apt install ./Imwald_*_amd64.deb` (use the exact filename from the download folder; `./` is required so `apt` uses the local file). After install, Imwald should appear in your app menu (often under **Network**).
@ -114,7 +114,7 @@ The following responsibilities remain in `ClientService` as they represent core
@@ -114,7 +114,7 @@ The following responsibilities remain in `ClientService` as they represent core
# VITE_PROXY_SERVER / VITE_READ_ALOUD_TTS_URL are baked at image build — see scripts/build-and-push-prod.sh
#
# NIP-66 monitor: set NIP66_MONITOR_NSEC (and optionally NIP66_MONITOR_NPUB) in the host env or .env.
# - Cron (jumble-nip66-monitor) uses NIP66_MONITOR_NSEC to publish 30166/10166; nsec never goes to the client.
# - Cron service `jumble-nip66-monitor` (Imwald NIP-66 monitor image) uses NIP66_MONITOR_NSEC to publish 30166/10166; nsec never goes to the client.
# - Set NIP66_MONITOR_NPUB (npub1... derived from the same key) so the relay info page shows the monitor's avatar and handle in the NIP-66 liveliness section.
@ -9,8 +9,8 @@ The monitor **nsec** (`NIP66_MONITOR_NSEC`) is used only in the **nip66-cron** c
@@ -9,8 +9,8 @@ The monitor **nsec** (`NIP66_MONITOR_NSEC`) is used only in the **nip66-cron** c
| Location | Allowed? | Notes |
|----------|----------|--------|
| **Host env** (e.g. `.env`) | ✅ | Operator sets it; not in repo. |
| **jumble-nip66-monitor container env** | ✅ | Only service that needs it. |
| **jumble container env** | ❌ | Removed: nsec is not passed to the web app. |
| **jumble-nip66-monitor container env**(Imwald monitor) | ✅ | Only service that needs it. |
| **jumble** web app container env | ❌ | Removed: nsec is not passed to the web app. |
| **config.json** (served to browser) | ❌ | Entrypoint writes only `NIP66_MONITOR_NPUB` or `{}`; never nsec. |
| **Frontend (Window.__RUNTIME_CONFIG__)** | ❌ | Type and fetch only include `NIP66_MONITOR_NPUB`. |
| **Vite / build** | ❌ | No `VITE_NIP66_*` or nsec in bundle. |
@ -18,13 +18,13 @@ The monitor **nsec** (`NIP66_MONITOR_NSEC`) is used only in the **nip66-cron** c
@@ -18,13 +18,13 @@ The monitor **nsec** (`NIP66_MONITOR_NSEC`) is used only in the **nip66-cron** c
## Checks performed
1. **docker-entrypoint.sh** – Writes config.json only from `NIP66_MONITOR_NPUB`; does not read or write `NIP66_MONITOR_NSEC`.
2. **docker-compose.prod.yml** – `NIP66_MONITOR_NSEC` is set only on the **jumble-nip66-monitor** service; **jumble** has only `NIP66_MONITOR_NPUB`.
2. **docker-compose.prod.yml** – `NIP66_MONITOR_NSEC` is set only on the **jumble-nip66-monitor** service; the **jumble** (Imwald SPA) service has only `NIP66_MONITOR_NPUB`.
3. **main.tsx** – Fetches config and types only `NIP66_MONITOR_NPUB`; no nsec in `Window.__RUNTIME_CONFIG__`.
4. **Frontend** – No monitor signing code; 30166/10166 publishing is server-only (nip66-cron / jumble-nip66-monitor).
4. **Frontend** – No monitor signing code; 30166/10166 publishing is server-only (nip66-cron / Imwald NIP-66 monitor container).
5. **nip66-cron/index.mjs** – Reads nsec from `process.env.NIP66_MONITOR_NSEC` only; never logs it or passes it to `log()`; comment added to never log or expose it.
6. **RelayInfo / RelayLivelinessSection** – Use only `window.__RUNTIME_CONFIG__.NIP66_MONITOR_NPUB` (npub) for display.
## Recommendation
- Keep **NIP66_MONITOR_NSEC** only in the host env and in the **jumble-nip66-monitor** service.
- Do not add nsec to the jumble service env, config.json, or any client-exposed config.
- Do not add nsec to the **jumble** (web app) service env, config.json, or any client-exposed config.
Registry paths keep the historical `imwald-jumble` name; retagging to e.g. `silberengel/imwald` is optional and requires updating `docker-compose.prod.yml` and pull scripts.
updateMetaTag('og:description',`${truncatedDefaultUrl} - A user-friendly Nostr client focused on relay feed browsing and relay discovery. The Imwald edition focuses on publications and articles.`)
updateMetaTag('twitter:description',`${truncatedDefaultUrl} - A user-friendly Nostr client focused on relay feed browsing and relay discovery. The Imwald edition focuses on publications and articles.`)
updateMetaTag('og:description',`${truncatedCleanupUrl} - A user-friendly Nostr client focused on relay feed browsing and relay discovery. The Imwald edition focuses on publications and articles.`)
updateMetaTag('og:description',`${truncatedDefaultUrl} - A user-friendly Nostr client focused on relay feed browsing and relay discovery. The Imwald edition focuses on publications and articles.`)
updateMetaTag('og:description',`${truncatedCleanupUrl} - A user-friendly Nostr client focused on relay feed browsing and relay discovery. The Imwald edition focuses on publications and articles.`)