Skip to content

fix: serve real home page instead of redirecting, add templated pages - #409

Merged
cameri merged 10 commits into
cameri:mainfrom
CKodidela:fix/home-redirect-302
Apr 18, 2026
Merged

fix: serve real home page instead of redirecting, add templated pages#409
cameri merged 10 commits into
cameri:mainfrom
CKodidela:fix/home-redirect-302

Conversation

@CKodidela

Copy link
Copy Markdown
Contributor

Previously, visiting the relay's home page resulted in a 301 permanent redirect to /invoices when payments were
enabled, or a bare text response when payments were disabled. Neither gave relay operators a real home page, and the
301 caused browsers to cache the redirect permanently making it impossible to change home page behaviour later
without users clearing cache.

Changes:

  • / now always serves index.html, a proper home page that works with and without payments. When admission fees are
    enabled, a payment card and link to /invoices is shown; otherwise an "open relay" card is shown. Template variables:
    {{name}}, {{description}}, {{relay_url}}, {{amount}}, {{payments_section_class}}, {{no_payments_section_class}},
    {{nonce}}.
  • The old index.html (admission fee form) is renamed to get-invoice.html, served by GET /invoices. The ToS link now
    points to /terms instead of an embedded modal.
  • The old invoices.html (payment result page) is renamed to post-invoice.html, served after POST /invoices. The rename
    reflects what the page actually is.
  • privacy.html template added and served at GET /privacy.
  • Old index.html and invoices.html remain in resources/ for reference.

Description

Replaces the broken home page behaviour with a proper templated home page. All five templates (index.html,
get-invoice.html, post-invoice.html, terms.html, privacy.html) are user-modifiable files in resources/. The
home page conditionally shows or hides the admission fee section using CSS class template variables, so it works
correctly whether payments are enabled or not.

Related Issue

Closes#269

Motivation and Context

The 301 redirect was a bug browsers cache it permanently, so any future change to the home page would be invisible
to returning visitors until they manually cleared their cache. Beyond the redirect fix, relay operators (especially
those running private/whitelist-only relays with no payments) had no home page at all, and there was no privacy policy
page despite many jurisdictions requiring one.

How Has This Been Tested?

Manually verified both payment-enabled and payment-disabled paths render the correct home page content. Verified GET /invoices serves get-invoice.html, POST /invoices serves post-invoice.html, GET /terms and GET /privacy
both render correctly. Confirmed application/nostr+json requests to / still return the relay information document
unchanged.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)

Checklist

  • My code follows the code style of this project.
  • I have read the CONTRIBUTING document.
  • I have added tests to cover my code changes.
  • All new and existing tests passed.

Previously, visiting the relay's home page resulted in a 301 permanent
redirect to /invoices when payments were enabled, or a bare text response
when payments were disabled. Neither gave relay operators a real home page,
and the 301 caused browsers to cache the redirect permanently — making it
impossible to change home page behaviour later without users clearing cache.
Changes:
- / now always serves index.html, a proper home page that works with and
without payments. When admission fees are enabled, a payment card and
link to /invoices is shown; otherwise an "open relay" card is shown.
Template variables: {{name}}, {{description}}, {{relay_url}}, {{amount}},
{{payments_section_class}}, {{no_payments_section_class}}, {{nonce}}.
- The old index.html (admission fee form) is renamed to get-invoice.html,
served by GET /invoices. The ToS link now points to /terms instead of
an embedded modal.
- The old invoices.html (payment result page) is renamed to post-invoice.html,
served after POST /invoices. The rename reflects what the page actually is.
- privacy.html template added and served at GET /privacy.
- Old index.html and invoices.html remain in resources/ for reference.
@CKodidela

Copy link
Copy Markdown
ContributorAuthor

@cameri this PR up for review

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR replaces the relay’s previous root-path behavior (301 redirect to /invoices or plain text) with a real, user-modifiable, templated home page, and adds additional user-modifiable legal/payment templates served from resources/.

Changes:

  • Serve a templated resources/index.html at GET /, with conditional sections for payments-enabled vs open-relay mode.
  • Rename/split invoice templates into get-invoice.html (GET /invoices) and post-invoice.html (after POST /invoices), updating controllers accordingly.
  • Add resources/privacy.html and serve it at GET /privacy.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 8 comments.

Show a summary per file
FileDescription
src/routes/index.tsAdds GET /privacy route wiring.
src/handlers/request-handlers/root-request-handler.tsStops redirect/text behavior; renders templated home page.
src/handlers/request-handlers/get-privacy-request-handler.tsNew handler that renders privacy.html.
src/controllers/invoices/get-invoice-controller.tsServes get-invoice.html instead of index.html.
src/controllers/invoices/post-invoice-controller.tsServes post-invoice.html instead of invoices.html.
resources/index.htmlNew home page template with conditional payments/open-relay sections.
resources/get-invoice.htmlNew “get invoice” page template (formerly home page admission form).
resources/post-invoice.htmlNew “post invoice” page template (formerly invoices.html).
resources/privacy.htmlNew privacy policy template.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/handlers/request-handlers/root-request-handler.ts Outdated
Comment threadsrc/handlers/request-handlers/root-request-handler.ts Outdated
Comment threadsrc/handlers/request-handlers/root-request-handler.ts Outdated
Comment threadsrc/handlers/request-handlers/get-privacy-request-handler.ts Outdated
Comment threadresources/post-invoice.html Outdated
Comment threadresources/post-invoice.html Outdated
Comment threadresources/index.html Outdated
Comment threadresources/get-invoice.html
@cameri

Copy link
Copy Markdown
Owner

@CKodidela Please address reviews by Copilot.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 4 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/handlers/request-handlers/root-request-handler.ts Outdated
Comment threadsrc/handlers/request-handlers/root-request-handler.ts Outdated
Comment threadresources/post-invoice.html Outdated
Comment threadresources/post-invoice.html

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 13 out of 13 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/controllers/invoices/post-invoice-controller.ts Outdated
Comment threadsrc/utils/template-cache.ts
Comment threadsrc/controllers/invoices/get-invoice-controller.ts
@CKodidela

Copy link
Copy Markdown
ContributorAuthor

@cameri@phoenix-server I’ve addressed the issues raised by Copilot, please take a look when you get a chance.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 13 out of 13 changed files in this pull request and generated 4 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadsrc/utils/html.ts
Comment threadsrc/utils/html.ts
Comment threadsrc/utils/template-cache.ts
Comment threadresources/post-invoice.html
@CKodidela

Copy link
Copy Markdown
ContributorAuthor

@cameri should i add test coverage?

@cameri

Copy link
Copy Markdown
Owner

@CKodidela Yes please, unit tests are key against regressions, code correctness, and overall quality.
I don't think we need integration tests for this PR though.

@CKodidela

Copy link
Copy Markdown
ContributorAuthor

I'm still working on some issues will tag when its ready

@CKodidela

Copy link
Copy Markdown
ContributorAuthor

Up for review @cameri@phoenix-server

@cameri

Copy link
Copy Markdown
Owner

@copilot resolve the merge conflicts in this pull request

1 similar comment
@cameri

Copy link
Copy Markdown
Owner

@copilot resolve the merge conflicts in this pull request

@CKodidela

Copy link
Copy Markdown
ContributorAuthor

Looks like copilot isn't working let me do it

@cameri

Copy link
Copy Markdown
Owner

@copilot resolve the merge conflicts in this pull request

@CKodidela

Copy link
Copy Markdown
ContributorAuthor

@cameri I've just cleared merge conflicts have a look

@cameri

Copy link
Copy Markdown
Owner

@CKodidela some checks arent passing, could you please fix?

@CKodidela

Copy link
Copy Markdown
ContributorAuthor

sure will do it in no time

@CKodidela

Copy link
Copy Markdown
ContributorAuthor

@cameri checks should pass now.

Comment threadpackage.json
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

User-modifiable templates need work

3 participants

@CKodidela@cameri