diff --git a/LOGGING.md b/LOGGING.md index b0f4cc50..6ff4ee61 100644 --- a/LOGGING.md +++ b/LOGGING.md @@ -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: @@ -69,7 +71,7 @@ logger.perf('Performance metric', data) The logger automatically configures itself based on: 1. **Environment**: Debug logging is disabled in production builds -2. **Local Storage**: `jumble-debug=true` enables debug mode +2. **Local Storage**: `imwald-debug=true` enables debug mode (legacy: `jumble-debug=true`) 3. **Environment Variable**: `VITE_DEBUG=true` enables debug mode ## Performance Impact @@ -103,12 +105,12 @@ To enable debug mode: 1. **In Browser Console** (development only): ```javascript - jumbleDebug.enable() + imwaldDebug.enable() ``` 2. **Via Local Storage**: ```javascript - localStorage.setItem('jumble-debug', 'true') + localStorage.setItem('imwald-debug', 'true') ``` 3. **Via Environment Variable**: diff --git a/PROXY_SETUP.md b/PROXY_SETUP.md index 39110f61..026d4e9c 100644 --- a/PROXY_SETUP.md +++ b/PROXY_SETUP.md @@ -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 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/`): ```apache ProxyPass /api/piper-tts http://127.0.0.1:9876/api/piper-tts @@ -117,7 +117,7 @@ curl -sS -o /tmp/t.wav -w "%{http_code}\n" -H "Content-Type: application/json" \ Expect **200** and a WAV file. **Local dev:** `npm run dev` proxies `/api/piper-tts` → `http://127.0.0.1:9876` in `vite.config.ts`. -Rebuild the Jumble image after changing `VITE_READ_ALOUD_TTS_URL`; `Dockerfile` passes `ARG`/`ENV` `VITE_READ_ALOUD_TTS_URL` into `npm run build`. +Rebuild the Imwald image after changing `VITE_READ_ALOUD_TTS_URL`; `Dockerfile` passes `ARG`/`ENV` `VITE_READ_ALOUD_TTS_URL` into `npm run build`. ## Update Proxy Server's ALLOW_ORIGIN @@ -194,7 +194,7 @@ sudo systemctl restart apache2 RequestHeader set Host "127.0.0.1:8090" - # Reverse Proxy for the main Jumble app (needs Host header preserved) + # Reverse Proxy for the main Imwald app (needs Host header preserved) ProxyPreserveHost On ProxyPass / http://127.0.0.1:32768/ ProxyPassReverse / http://127.0.0.1:32768/ @@ -228,10 +228,10 @@ sudo systemctl reload apache2 # Test with a real URL - the code constructs /proxy/sites/{encoded-url} curl https://jumble.imwald.eu/proxy/sites/https%3A%2F%2Fexample.com # 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: @@ -272,9 +272,9 @@ docker build \ ## Troubleshooting -### If Proxy Returns Jumble HTML Instead of Requested Site +### If Proxy Returns Imwald HTML Instead of Requested Site -If you've set `ProxyPreserveHost Off` but still get Jumble HTML, test the proxy server directly: +If you've set `ProxyPreserveHost Off` but still get Imwald HTML, test the proxy server directly: **1. Test the proxy server directly (bypassing Apache):** ```bash diff --git a/README.md b/README.md index e5dc4aab..c041f42b 100644 --- a/README.md +++ b/README.md @@ -2,20 +2,20 @@ - Jumble Logo + Imwald logo

logo designed by Daniel David

-# 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: ### 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: ## Screenshots -Jumble Screenshot 01 +Imwald screenshot 01
- Jumble Screenshot 02 - Jumble Screenshot 03 - Jumble Screenshot 04 + Imwald screenshot 02 + Imwald screenshot 03 + Imwald screenshot 04
## Upstream & related forks -- **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 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**). **Maintainers — build artifacts locally:** diff --git a/REFACTORING_COMPLETE.md b/REFACTORING_COMPLETE.md index 27d7b9fc..01ba1b2b 100644 --- a/REFACTORING_COMPLETE.md +++ b/REFACTORING_COMPLETE.md @@ -114,7 +114,7 @@ The following responsibilities remain in `ClientService` as they represent core ### Logger Integration - ✅ Efficient logger implementation - ✅ Development: Browser console -- ✅ Production: Console GUI in Jumble app +- ✅ Production: Console GUI in Imwald app - ✅ Performance logging included ## Migration Status diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index dae10a22..cee4ef0d 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -10,7 +10,7 @@ # 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. services: diff --git a/docs/NIP66-MONITOR-SECURITY.md b/docs/NIP66-MONITOR-SECURITY.md index 4763bd16..a446e50d 100644 --- a/docs/NIP66-MONITOR-SECURITY.md +++ b/docs/NIP66-MONITOR-SECURITY.md @@ -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 ## 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. diff --git a/electron/main.cjs b/electron/main.cjs index b32ae8dc..d7d50f12 100644 --- a/electron/main.cjs +++ b/electron/main.cjs @@ -46,7 +46,7 @@ function createWindow() { } app.whenReady().then(() => { - ipcMain.handle('jumble:reload-app', async (event) => { + ipcMain.handle('imwald:reload-app', async (event) => { const win = BrowserWindow.fromWebContents(event.sender) if (!win || win.isDestroyed()) return false loadRenderer(win) diff --git a/electron/preload.cjs b/electron/preload.cjs index 6251fbe3..d5235c35 100644 --- a/electron/preload.cjs +++ b/electron/preload.cjs @@ -2,7 +2,7 @@ const { contextBridge, ipcRenderer } = require('electron') -contextBridge.exposeInMainWorld('jumbleElectron', { +contextBridge.exposeInMainWorld('imwaldElectron', { isElectron: true, - reloadApp: () => ipcRenderer.invoke('jumble:reload-app') + reloadApp: () => ipcRenderer.invoke('imwald:reload-app') }) diff --git a/index.html b/index.html index 83f47904..995f996f 100644 --- a/index.html +++ b/index.html @@ -4,17 +4,17 @@ - Jumble - Imwald Edition 🌲 + Imwald 🌲 - + @@ -23,25 +23,25 @@ - + - + - - - + + +
-

Loading Jumble…

+

Loading Imwald…