CHANGELOG

Changelog of Decent Newsroom - a platform for the creation, publishing, and discovery of mixed-media collaborative journals.
CHANGELOG

Cover image: Photo by Božo Gunjajević from Pexels

Project source: https://github.com/decent-newsroom/newsroom

v0.0.15

Mentions, embeds, and uploads.

  • Added a Media Manager.
  • Added NIP-05 lookup to user search: when a NIP-05 identifier (e.g. bob@example.com) is entered, the well-known endpoint is queried to resolve the hex pubkey, and the matching user is returned at the top of results.
  • Added Mentions tab in the editor left sidebar: search users by name/NIP-05 and insert nostr:npub1… mentions at the cursor. Corresponding p tags are auto-generated on publish per NIP-27.
  • Added Embeds tab in the editor left sidebar with three sections: profile embed (user search → nostr:npub1… card), article embed (article search → nostr:naddr1… card), and raw identifier paste (accepts note1…, nevent1…, naddr1…, npub1… codes).
  • Added media tab in the editor left sidebar.
  • Auto-generate p, e, and a tags from nostr: references in article content at publish time (both client-side in JS and server-side in PHP), per NIP-27. Deduplication prevents duplicate tags.
  • Added NIP-19 TLV encoding/decoding utilities to nostr-utils.ts: decodeNip19(), encodeNprofile(), encodeNaddr(), and extractNostrTags() for full bech32 entity support.
  • [Bug] Fixed cron.

v0.0.14

Ripped out relay management, again, trying something different.

  • Implemented i18n translations: extracted all user-facing text into YAML translation files, added locale switching via footer language selector. English remains the default.
  • Relay pool management Phase 1: centralized relay configuration via RelayRegistry (replaces 4 scattered hardcoded constants), Redis-backed persistent health tracking via RelayHealthStore, and consolidated 3 near-identical subscription loops (~600 lines) into one parameterized subscribeLocal() method with heartbeat reporting.
  • Relay pool management Phase 2.1: UserRelayListService — stale-while-revalidate relay list resolution with DB write-through (cache → DB → network → fallback). Replaces AuthorRelayService entirely (deleted) and the fragmented relay resolution in NostrClient. All 11 consumers migrated. Network fetch logic inlined. Persists kind 10002 events to the Event table on successful network fetch.
  • Relay pool management Phase 2.2: async relay list warming on login — UpdateRelayListMessage dispatched via Messenger on LoginSuccessEvent, handled on the low-priority queue so relay data is pre-warmed by the time the user navigates to follows/editor.
  • Relay pool management Phase 2.3: relay gateway — persistent WebSocket connection pool with NIP-42 AUTH support. Long-lived app:relay-gateway process maintains authenticated connections to external relays, keyed by (relay, user) pair. FrankenPHP request workers communicate via Redis Streams. AUTH challenges are signed by the user’s browser via Mercure SSE roundtrip. Feature-flagged via RELAY_GATEWAY_ENABLED.
  • Relay pool management Phase 3: admin relay dashboard with pool visibility (per-relay health scores, AUTH status, latency, last success/failure), subscription worker heartbeat monitoring, and gateway status. Health-based relay ranking — external relays are now sorted by health score (success rate × inverse latency) when building relay sets. Formalized RelayPoolInterface extracted from NostrRelayPool.
  • Relay gateway: switched from persistent shared connections to on-demand connection model. Connections are opened lazily when first needed, kept alive for a configurable idle TTL (default 5 min), then closed. Eliminates startup connection failures, idle resource waste, and noisy reconnection churn.
  • Relay gateway: inline connection opening for queries and publishes. When no connection exists for a target relay, the gateway opens one inline (blocking) and sends the REQ/EVENT immediately. Replaces the broken deferred pattern where one-per-tick connection opening + 56-second settle cycle caused all client requests to time out. Connections are reused for subsequent requests to the same relay.
  • Relay gateway: optimistic send — EVENTs and REQs are now sent immediately upon connection, without waiting for the 1-second AUTH settle window. Most relays don’t require AUTH; those that do will respond with CLOSED:auth-required, which the new NIP-01 CLOSED handler properly records.
  • Publishing: moved all publish flows back to direct relay connections (bypasses gateway entirely). Each relay is contacted independently so one failure cannot block the others. Fixes the gateway publish timeout issues where connections took too long to open/settle. Gateway is still used for reads/queries. Affects: article editor, broadcast, comments, interests, magazine, forum posts.
  • NIP-01 compliance: tag filter passthrough (#e, #p, #t, #d, #a) — previously silently dropped in gateway and local relay re-routing, causing queries to return unfiltered results. Fixed in both RelayGatewayCommand and NostrRequestExecutor::buildFilterFromArray.
  • NIP-01 compliance: CLOSED and NOTICE handling — CLOSED now properly records errors and calls recordFailure() instead of being treated as a successful EOSE. NOTICE now logs the message without trying to match a subscription ID.
  • [Bug] Fixed messenger worker crash loop: removed dangerous direct-connection fallback when gateway returns no events (TLS+AUTH exceeded 15s execution limit). Capped gateway query timeouts at 8s.
  • [Bug] Fixed relay URL normalization in GatewayConnection::buildKey — trailing slash differences between config and user relay lists caused shared connection lookup misses.
  • [Bug] Fixed xRead('$') initialization causing gateway to never consume stream messages. Added getStreamLastId via xRevRange for robust initialization.
  • [Bug] Fixed Error: Failed to fetch article: The EntityManager is closed.
  • [Bug] Fixed vanity name subscription settings page.

v0.0.13

All improvements were gathered on the way, while trying to get rid of the persistent errors.

  • Improved db handling of articles.
  • Updated bookmarks page with better fetch and styling.
  • Updated article loading.
  • Enabled frankenphp.
  • Added interests editor on the My Interests page: users can create or edit their kind 10015 interests list by selecting popular tags or adding custom ones.
  • [Bug] Fixed Nip05 verification for own vanity names.
  • [Bug] Fixed uncertain math rendering with KaTeX.
  • [Bug] Fixed 502 errors on article pages for anonymous users.
  • [Bug] Fixed too-short caching TTLs for articles and highlights, that caused empty highlights list.

v0.0.12

More metadata is better.

  • Removed the floating ReadingListQuickAdd widget (component, template, and CSS) — replaced by other functionality.
  • Added support for extra metadata tags on articles: source references (r tags) and media attachments (imeta tags) in the article editor, event builder, and event parser.
  • Display category/reading-list summaries on magazine front category headers, collections list cards, reading list pages, and Unfold category pages.
  • Filter bot/RSS-type authors out of the Latest Articles feed (denylist + profile bot flag).
  • Added prev/next article navigation cards at the bottom of article pages when the article belongs to a reading list or curation set.
  • Added a floating “Back to top” button that appears when scrolling down on any page.

v0.0.11

Mostly quality of life improvements.

  • Removed reading lists from the editor sidebar to reduce clutter; sidebar now shows only drafts and articles.
  • Added “My Content” page (/my-content) — a unified file-manager view for managing articles, drafts, and reading lists.
  • Added “My Content” link to the left navigation under the Newsroom section.
  • Split sidebar navigation into segmented sections (Discover, Newsroom, Create) with divider labels.
  • Upgraded magazine wizard to a 4-step flow: Setup → Categories → Articles → Review & Sign.
  • Added live cover preview panel to the magazine setup step.
  • Added image upload support to the magazine setup and category steps.
  • Added sortable (drag-to-reorder) categories in the wizard.
  • Replaced raw naddr coordinate input with a dropdown of user’s existing reading lists.
  • Added login prompt and desktop device recommendation to the wizard.
  • Added basic zap invoices to UnfoldBundle.
  • Implemented AsciiDoc parser for kind 30041.
  • Updated footer.
  • Added nostrconnect uri to the signer flow, so you can log in on the same device.
  • [Bug] Fix a bug in magazine wizard, so now you get form errors instead of a broken page.
  • [Bug] Fixed Reading List edit loading bug, so now you can actually edit your reading lists.

v0.0.10

Publications as first-class citizens.

  • Introduced publications on subdomains.
  • [Bug] Fixed image upload in the editor.
  • [Bug] Fixed routing for vanity names.

v0.0.9

Starting to look like a real product, isn’t it?

  • Introduced Vanity Names (NIP-05).
  • Introduced Active Indexing.
  • Updated static pages to reflect changes.
  • Updated relay communications.
  • Added JSON-LD metadata to article and magazine pages.
  • Added a “Support” card.
  • [Bug] Fixed a host of bugs in the article and magazine publishing process.

v0.0.8

Toast on toast, and event in event.

  • Remember me.
  • Favicon is now there.
  • UnfoldBundle now loads a magazine on a configured subdomain.
  • Show embeds of nostr events in articles.
  • Broadcast option.
  • Show a stack of toasts instead of replacing the previous one.
  • Showing a placeholder when an article is not found.
  • Better handle comments.
  • Added generic ‘alt’ tags to index events.
  • Admin dash update.
  • Overhauled Caddy config.
  • [Bug] Comments never loaded… because configuration was a mess.
  • [Bug] Button didn’t open a dialog on login page.

v0.0.7

Lists that actually list things. Revolutionary.

  • Reading lists now load existing lists.
  • Now possible to add articles to magazines and reading lists by naddr.
  • [Bug] Refactoring metadata introduced a bug in profiles, displaying the profile name instead of the display name.
  • [Bug] Add-to-list button defaulted to extension, now honors login method.

v0.0.6

Testing revealed some issues. What a shocker.

  • Non-blocking user profile data sync, typed metadata.
  • Show/hide long highlights context.
  • [Bug] Fixed scrolling in the editor.
  • [Bug] Fix signer flow in magazine setup.
  • [Bug] Fixed squished tabs on mobile.
  • [Bug] Fixed reading list wizard buttons and general publishing flow.

v0.0.5

Navigating to nostr ids made easier.

  • Extended search to nostr idents, so you can paste a nostr npub, note, nevent, or naddr to navigate to that profile, event, or article.
  • Updated profiles, implemented background fetch.
  • Made publishing magazines available.
  • Added zap buttons to articles.
  • Brought back zaps as comments.
  • Made multimedia more resilient.

v0.0.4

Deployment used to be a remake of Minesweeper. Now it’s more like Darts.

  • Updated deployment and build, added documentation.
  • [Bug] Fixed the Elasticsearch feature flag.
  • [Bug] Fixed article title sync in editor.

v0.0.3

We know you have better things to do than waiting around for the page to load.

  • Refactored the article editor.
  • Removed deprecated Nzine implementation.
  • Added a user profile index to Elasticsearch.
  • You can now include a cover image in reading lists.
  • Added a feature flag for Elasticsearch integration.
  • Implemented a new caching object to speed up page loads.
  • Extended article entity with parsed HTML content.
  • Added a worker for ingesting articles from the local relay.
  • [Bug] Fixed share links
  • [Bug] Fixed bunker signer

v0.0.2

Let’s pretend we finally know what we are doing here.

  • Initial changelog created.
  • Local relay.

v0.0.1

We won’t go into detail here. Most of it was learning the ropes.

  • Initial development setup with lots of wrong turns.

No comments yet.