feat: add support for custom nostr relays via environment variable
What kind of change does this PR introduce?
feature to allow users to add other nostr relays to publish to - useful for adding local relays for testing
Why was this change needed?
I wanted to publish from postiz to my self-hosted nostr relay, but unless I run postiz from a local fork and build then I can't affect which relays get hit
Other information:
I have discussed this with no one but it arose from thinking through a but I've opened about not being able to post to nostr at all anyways #772
Checklist:
Put a "X" in the boxes below to indicate you have followed the checklist;
- [x] I have read the CONTRIBUTING guide.
- [x] I checked that there were not similar issues or PRs already open for this.
- [x] This PR fixes just ONE issue (do not include multiple issues or types of change in the same PR) For example, don't try and fix a UI issue and include new dependencies in the same PR.
Summary by CodeRabbit
-
New Features
- Added support for fully overriding the default list of Nostr relays via a new environment variable, allowing users to customize relay URLs dynamically.
@pypeaday is attempting to deploy a commit to the Listinai Team on Vercel.
A member of the Team first needs to authorize it.
Walkthrough
The relay URL list was renamed from a static constant to defaultRelays and enhanced to support a fully overrideable relay list via the NOSTR_RELAYS_OVERRIDE environment variable. The final relay list is deduplicated and dynamically assigned based on this configuration. The .env.example file was updated to document this variable.
Changes
| File(s) | Change Summary |
|---|---|
| libraries/nestjs-libraries/src/integrations/social/nostr.provider.ts | Renamed relay list constant to defaultRelays; added dynamic override of relay URLs via NOSTR_RELAYS_OVERRIDE env variable with deduplication. |
| .env.example | Added NOSTR_RELAYS_OVERRIDE environment variable with default relay URLs and explanatory comment. |
Poem
In the warren of relays, new paths now appear,
From code and environment, connections draw near.
Old friends remain, but new ones can play,
All deduped together, in a bright relay array.
🐇✨
[!WARNING] There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
🔧 ESLint
If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.
libraries/nestjs-libraries/src/integrations/social/nostr.provider.ts
Oops! Something went wrong! :(
ESLint: 8.57.0
Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@eslint/eslintrc' imported from /eslint.config.mjs at Object.getPackageJSONURL (node:internal/modules/package_json_reader:255:9) at packageResolve (node:internal/modules/esm/resolve:767:81) at moduleResolve (node:internal/modules/esm/resolve:853:18) at defaultResolve (node:internal/modules/esm/resolve:983:11) at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:801:12) at #cachedDefaultResolve (node:internal/modules/esm/loader:725:25) at ModuleLoader.resolve (node:internal/modules/esm/loader:708:38) at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:309:38) at #link (node:internal/modules/esm/module_job:201:49)
✨ Finishing Touches
- [ ] 📝 Generate Docstrings
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
🪧 Tips
Chat
There are 3 ways to chat with CodeRabbit:
- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
-
I pushed a fix in commit <commit_id>, please review it. -
Explain this complex logic. -
Open a follow-up GitHub issue for this discussion.
-
- Files and specific lines of code (under the "Files changed" tab): Tag
@coderabbitaiin a new review comment at the desired location with your query. Examples:-
@coderabbitai explain this code block. -
@coderabbitai modularize this function.
-
- PR comments: Tag
@coderabbitaiin a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:-
@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase. -
@coderabbitai read src/utils.ts and explain its main purpose. -
@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format. -
@coderabbitai help me debug CodeRabbit configuration file.
-
Support
Need help? Create a ticket on our support page for assistance with any issues or questions.
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.
CodeRabbit Commands (Invoked using PR comments)
-
@coderabbitai pauseto pause the reviews on a PR. -
@coderabbitai resumeto resume the paused reviews. -
@coderabbitai reviewto trigger an incremental review. This is useful when automatic reviews are disabled for the repository. -
@coderabbitai full reviewto do a full review from scratch and review all the files again. -
@coderabbitai summaryto regenerate the summary of the PR. -
@coderabbitai generate docstringsto generate docstrings for this PR. -
@coderabbitai generate sequence diagramto generate a sequence diagram of the changes in this PR. -
@coderabbitai resolveresolve all the CodeRabbit review comments. -
@coderabbitai configurationto show the current CodeRabbit configuration for the repository. -
@coderabbitai helpto get help.
Other keywords and placeholders
- Add
@coderabbitai ignoreanywhere in the PR description to prevent this PR from being reviewed. - Add
@coderabbitai summaryto generate the high-level summary at a specific location in the PR description. - Add
@coderabbitaianywhere in the PR title to generate the title automatically.
CodeRabbit Configuration File (.coderabbit.yaml)
- You can programmatically configure CodeRabbit by adding a
.coderabbit.yamlfile to the root of your repository. - Please see the configuration documentation for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation:
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
Documentation and Community
- Visit our Documentation for detailed information on how to use CodeRabbit.
- Join our Discord Community to get help, request features, and share feedback.
- Follow us on X/Twitter for updates and announcements.
I pushed a change so that the env var is for overrides instead of extending the default - because at least for me I would want to only post to my local relay in dev, not my local relay and all the default ones... Example now has the defaults listed
I'm not a JS dev at all so definitely fine with this not going in as is and happy to make any changes necessary for the feature
pinging here as a bump but I do not mean to rush anyone... @egelhaus are there instructions anywhere for building a custom image to run at home? It looked more complicated to me than I was ready to try a few weeks ago but if I can test this out to get it into the release that'd be great If not, then obviously no problem on waiting for nevo-david, just wondering if I can help keep the ball rolling on this specific feature
@pypeaday Sorry for the delay, but I just can't review / merge this without Nevo as I don't have experience with Nostr, and yes you can build it with
docker buildx build --platform linux/amd64 \
-f Dockerfile.dev \
-t ghcr.io/gitroomhq/postiz-app:latest .
on your repo branch
Oh awesome... I guess it wasn't that hard... so I did that and spun up a nostr relay at home. I set NOSTR_RELAY_OVERRIDES to only my instance.
I used a script to create a draft nostr post - that worked perfectly still The backend logs looked good too:
postiz | [0] 1|backend | [Nest] 328 - 07/02/2025, 1:24:06 PM WARN OpenAI API key not set, chat functionality will not work
postiz | [0] 1|backend | {
postiz | [0] 1|backend | "type": "draft",
postiz | [0] 1|backend | "shortLink": false,
postiz | [0] 1|backend | "tags": [],
postiz | [0] 1|backend | "posts": [
postiz | [0] 1|backend | {
postiz | [0] 1|backend | "integration": {
postiz | [0] 1|backend | "id": "cmbgf5oko0001ra99r9vzv1fj"
postiz | [0] 1|backend | },
postiz | [0] 1|backend | "value": [
postiz | [0] 1|backend | {
postiz | [0] 1|backend | "content": "\nHere's a thought I had a while back:\n\n> matduggan.com/what-would-a-kubernetes-2-0-look-like/\n\nThis article was longer than I had time to really consume but a heading caught my eye that I wanted to agree with - the author says k8s 2.0 may consider HCL instead of YAML. And as a recent terraform / open-tofu adopter I gotta say I would be ALL FOR THIS\n\nHere's the original link for more context: https://matduggan.com/what-would-a-kubernetes-2-0-look-like/\n \n\n# devops # tech #k8s #nostr #plebchain",
postiz | [0] 1|backend | "image": []
postiz | [0] 1|backend | }
postiz | [0] 1|backend | ]
postiz | [0] 1|backend | }
postiz | [0] 1|backend | ],
postiz | [0] 1|backend | "date": "2025-07-02T13:27:07.028Z"
postiz | [0] 1|backend | }
pic for proof
Then I went to send the note via postiz and validated it via coracle.social (a nostr client)
This looks perfect to me (and proves out the stuff I was working on that prompted me to make this change which is a happy little bonus)
HOWEVER I do not expect this to be enough to complete the PR and fully expect to wait for Nevo... this just turned into great fodder for a blog post
When it will be merged? There are still problems with Nostr
Saw the 2.0 release which is awesome! @nevo-david any chance you would have time to review this for one of the earlier 2.x releases?
IS @nevo-david around to potentially review this?