* fix(js): fix server hydration not working. will speed up initial load time
* fix: update lockfile
* fix(js): fix for malformed or invalid JSON in hydration
* chore: update extracted translations
---------
Co-authored-by: Owncast default web localizations <owncast@owncast.online>
* feat: add support for custom favicons
* Commit updated API documentation
* chore(i18n): add localization of text
* fix(js): regenerate package lock file
* chore(test): add favicon test
* fix: max size not respected
* Commit updated API documentation
* fix: move favicon.ico to the static dir
* fix: fix tests
* fix: remove hard-coded content-type of icon
* chore: update extracted translations
* feat(admin): add support for resetting to default icon
* chore: use a higher res default favicon
* Commit updated API documentation
---------
Co-authored-by: Owncast <owncast@owncast.online>
Some broadcasting software (e.g., Prism Live Studio) strips special
characters from stream keys, making Owncast-generated keys incompatible.
Changes:
- Create separate STREAM_KEY_COMPLEXITY_RULES without special char requirement
- Update generateRndKey() to only use alphanumeric characters
- Keep PASSWORD_COMPLEXITY_RULES unchanged for admin password security
- Update tooltip text to reflect new requirements
- Add comprehensive tests for stream key generation
Fixes#4690
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat(chat): require authentication to participate in chat
* fix: it's pretty much impossible to bypass the auth requirement, addressing review feedback anyway
* feat(chat): render chat text input as disabled if chat auth is required
* Commit updated API documentation
---------
Co-authored-by: Owncast <owncast@owncast.online>
Add Pixelfed as a supported social platform, including the platform
entry in socialHandle.go and the SVG icon.
Closes#4726
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
When adding/deleting external actions, the UI would sometimes show
duplicated or cloned rows due to a race condition between:
1. The optimistic setActions() call updating local state
2. The save() callback updating externalActions in context
3. The useEffect syncing actions from externalActions
This fix removes the optimistic updates and lets the server response
be the single source of truth, updating the UI only after the context
is updated via the save() success callback.
Fixes#4347
Adds a Recoil atom (chatInputDraftAtom) to store the chat input draft,
which persists the text when the chat component unmounts/remounts during
mobile/desktop mode transitions.
Changes:
- Add chatInputDraftAtom to ClientConfigStore
- Update ChatTextField to save draft on input change
- Restore draft when component mounts
- Clear draft when message is sent
Closes#3615
- Combines 'Learn more' link and surrounding text into one Translation
- Fixes double space issue (was + regular space)
- Enables full sentence to be localized: '<a>Learn more</a> about Owncast browser notifications.'
Closes#4655
The banUser function in ChatModerationService was sending an incomplete
request body to the /api/chat/users/setenabled endpoint. The API requires
both userId and enabled fields, but only userId was being sent.
This caused the endpoint to return a 400 Bad Request with the error:
"must provide userId and enabled state"
Added the missing enabled: false parameter to properly disable the user
when banning.
Co-authored-by: Matt Pruitt <41898282+guitsaru@users.noreply.github.com>